`

Android通过AIDL接口实现跨进程通讯

阅读更多
在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?  显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.

AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

Android开发中实现跨进程通讯的具体步骤如下:

1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。 如: ITaskBinder.adil

Java代码
package com.cmcc.demo;  
import com.cmcc.demo.ITaskCallback;  
interface ITaskBinder {  
    boolean isTaskRunning();  
    void stopRunningTask();   
    void registerCallback(ITaskCallback cb);   
    void unregisterCallback(ITaskCallback cb);  


package com.cmcc.demo;
import com.cmcc.demo.ITaskCallback;
interface ITaskBinder {
    boolean isTaskRunning();
    void stopRunningTask();
    void registerCallback(ITaskCallback cb);
    void unregisterCallback(ITaskCallback cb);
}

其中: ITaskCallback在文件ITaskCallback.aidl中定义:

Java代码
package com.cmcc.demo;  
interface ITaskCallback {  
    void actionPerformed(int actionId);  


package com.cmcc.demo;
interface ITaskCallback {
    void actionPerformed(int actionId);
}

注意: 理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数, 据说用Ant编译可以, 我没做尝试.

2、Android开发中编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.

3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.

ITaskBinder.aidl中接口的实现, 在MyService.java中接口以内嵌类的方式实现:

Java代码
private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {  
        public void stopRunningTask() {  
            //@TODO  
        }  
 
        public boolean isTaskRunning() {  
            //@TODO  
            return false;  
        }  
 
        public void registerCallback(ITaskCallback cb) {  
            if (cb != null) mCallbacks.register(cb);  
        }  
 
        public void unregisterCallback(ITaskCallback cb) {  
            if (cb != null) mCallbacks.unregister(cb);  
        }  
}; 

private final ITaskBinder.Stub mBinder = new ITaskBinder.Stub() {
        public void stopRunningTask() {
            //@TODO
        }

        public boolean isTaskRunning() {
            //@TODO
            return false;
        }

        public void registerCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.register(cb);
        }

        public void unregisterCallback(ITaskCallback cb) {
            if (cb != null) mCallbacks.unregister(cb);
        }
};

在MyActivity.java中ITaskCallback.aidl接口实现:

Java代码
private ITaskCallback mCallback = new ITaskCallback.Stub() {  
        public void actionPerformed(int id) {  
          //TODO  
         printf("callback id=" + id);  
        }  
}; 

private ITaskCallback mCallback = new ITaskCallback.Stub() {
        public void actionPerformed(int id) {
          //TODO
         printf("callback id=" + id);
        }
};

4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。这个地方返回的mBinder,就是上面通过内嵌了定义的那个. (MyService.java)
Java代码
public IBinder onBind(Intent t) {  
    printf("service on bind");  
    return mBinder;  


    public IBinder onBind(Intent t) {
        printf("service on bind");
        return mBinder;
    }

在Activity中, 可以通过Binder定义的接口, 来进行远程调用.

5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数在:MyService.java中:

Java代码
void callback(int val) {  
    final int N = mCallbacks.beginBroadcast();  
    for (int i=0; i <N; i++) {  
        try {  
            mCallbacks.getBroadcastItem(i).actionPerformed(val);  
        } catch (RemoteException e) {  
            // The RemoteCallbackList will take care of removing  
            // the dead object for us.  
        }  
    }  
    mCallbacks.finishBroadcast();  


    void callback(int val) {
        final int N = mCallbacks.beginBroadcast();
        for (int i=0; i <N; i++) {
            try {
                mCallbacks.getBroadcastItem(i).actionPerformed(val);
            } catch (RemoteException e) {
                // The RemoteCallbackList will take care of removing
                // the dead object for us.
            }
        }
        mCallbacks.finishBroadcast();
    }

分享到:
评论

相关推荐

    Android之通过AIDL机制实现进程间的通讯实例

    本实例将深入探讨如何通过AIDL实现在Android应用中的进程间通讯。 首先,我们需要理解AIDL的基本概念。AIDL是一种简单的接口定义语言,类似于Java中的接口,但它的设计目标是跨越进程边界。在AIDL中,我们可以声明...

    android aidl 不同进程间通信

    在Android系统中,进程间通信...总之,Android Aidl是实现不同进程间通信的重要手段,通过定义接口和服务,可以方便地实现跨进程调用,提升应用的功能性和交互性。理解和掌握Aidl对于开发复杂的Android应用至关重要。

    Android使用AIDL实现进程间通信

    在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。...通过阅读和运行这些代码,你将能够更好地理解AIDL如何帮助Android应用实现高效的进程间通信。

    Android多进程通讯AIDL传递Parcelable对象

    总结,Android多进程通讯AIDL传递Parcelable对象是一种强大的技术,可以实现复杂的跨进程数据交换。正确理解和使用AIDL能够帮助开发者构建健壮的、具有扩展性的Android应用。在实际开发中,应结合具体需求选择合适的...

    Android开发中实现跨进程通讯

    ### Android开发中实现跨进程通讯的关键知识点 #### 一、跨进程通讯背景及必要性 在Android系统中,为了确保应用程序的安全性和独立性,每个应用通常运行在其自己的进程中。这意味着不同进程之间的对象不能直接...

    通过AIDLdemo掌握跨进程之间的通讯

    通过"AIDLdemo"的实践,开发者可以深刻理解AIDL的工作原理,掌握如何在Android中实现高效、安全的跨进程通信。AIDL虽然相比其他通信方式(如BroadcastReceiver、ContentProvider、LocalBroadcastManager等)较为复杂...

    android 跨进程通讯aidl

    本教程将深入探讨如何使用AIDL进行跨进程通讯,并通过实例`DemoAidl`进行详细讲解。 ### 1. AIDL基础 AIDL文件是一个简单的文本文件,后缀为`.aidl`,用于定义接口和其方法。AIDL支持的数据类型包括基本类型(如...

    android_aidl_进程间通讯demo

    在这个"android_aidl_进程间通讯demo"中,我们将探讨如何通过AIDL来构建服务并进行跨进程通信。 首先,我们来看标题"android_aidl_进程间通讯demo",它明确指出这个示例项目是关于AIDL在处理进程间通信中的应用。...

    Android多进程通讯AIDLDemo

    标题"Android多进程通讯AIDLDemo"指出我们将探讨如何使用AIDL来实现Android应用间的多进程通信。AIDL的基本思路是定义一个接口,该接口包含应用程序需要共享的方法。系统会自动生成与该接口对应的 Binder 类,使得在...

    AIDL实现跨进程通信(一)

    本篇文章将深入探讨如何使用AIDL来实现跨进程通信,主要分为以下几个部分: 1. **AIDL简介**: AIDL是Android特有的一种接口定义语言,它的作用类似于Java中的接口,但主要用于解决进程间通信的问题。通过AIDL,...

    Messenger-比AIDL简单的跨进程通讯

    本文将深入探讨" Messenger-比AIDL简单的跨进程通讯"这一主题,详细介绍如何利用Messenger进行跨进程通信,并与AIDL进行对比。 **Messenger简介** Messenger是Android提供的一种轻量级的IPC解决方案,它基于Binder...

    Android例子源码音乐播放器aidl实现进程间的通讯

    本示例源码是关于如何利用Android Interface Definition Language (AIDL)来实现跨进程通信,创建一个音乐播放器应用。AIDL是Android提供的一种接口定义工具,用于生成允许不同进程之间进行方法调用的代理类。 1. **...

    android中跨进程通讯的4种方式

    在Android系统中,由于安全性和资源隔离的考虑,不同应用程序之间的内存是不能直接共享的,因此需要通过特定的方式来实现跨进程通信(IPC, Inter-Process Communication)。Android SDK提供了四种主要的IPC机制,...

    android-AIDL手机进程间通讯

    AIDL(Android Interface Definition Language)是Android提供的一种机制,专门用于定义和实现跨进程的通信接口。本篇文章将深入探讨AIDL的工作原理、使用步骤以及其在手机进程间通讯中的作用。 **AIDL的基本概念**...

    Android aidl 开机自启 app进程间通讯

    在Android的aidl通信中,静态代理通常用于在客户端创建一个实现了aidl接口的类,将服务端的Binder对象作为参数传递给代理类,代理类中的方法会转发调用到服务端。这种方式可以使客户端代码更清晰,便于解耦和测试。 ...

    跨进程通讯

    本篇文章将深入探讨Android中的跨进程通讯机制,尤其是通过AIDL(Android Interface Definition Language)实现的数据传输以及远程接口回调。 首先,我们要理解Android进程的概念。每个Android应用默认运行在独立的...

    Android多进程通讯AIDL实现客户端回调

    在Java代码中,Android会自动生成对应的Binder类,这个类实现了AIDL接口,并处理进程间的通信细节。你需要创建这个类的实现,将实际业务逻辑写入其中: ```java public class MyInterfaceImpl extends IMyInterface...

    Android-安卓跨进程跨app通信框架

    开发者通过定义AIDL接口,可以创建可以在不同进程中调用的方法。框架可能会提供自动生成AIDL相关的工具或类库,简化开发过程。 3. **ContentProvider**:ContentProvider是Android系统提供的一种通用的跨进程数据...

    Android-AIDL进程间通讯

    本文将深入探讨AIDL在Android进程间通讯中的应用。 ### 一、AIDL概述 AIDL是一种接口定义语言,它的主要任务是定义服务接口,使得服务端(服务器进程)和客户端(调用者进程)可以通过 Binder 机制进行进程间通信...

    使用AIDL实现进程间通讯简单案例

    AIDL(Android Interface Definition Language)是Android提供的一种工具,用于实现跨进程的接口定义,使得一个应用能够调用另一个应用中的服务。本案例"使用AIDL实现进程间通讯简单案例"提供了两个模块:aidl_C...

Global site tag (gtag.js) - Google Analytics