`

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 Studio AIDL实现跨进程通信

    AIDL:Android Interface Definition Language,即Android接口定义语言. android studio中使用aidl实现跨进程通讯,具体步骤如下

    Android Studio创建AIDL文件并实现进程间通讯实例

    这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信。下面简单介绍用AndroidStudio创建AIDL文件的过程。 a.新建AIDL文件 1.项目文件夹右键...

    AIDL进程间通讯demo

    AIDL进程间通讯demo,A [android] I [Interface] D [Definition] L [Language],...作用:方便系统为我们生成代码从而实现跨进程通讯,仅此而已。(玉刚老师如是说也),也就是说这个AIDL就只是一个快速跨进程通讯的工具。

    android-AIDL手机进程间通讯

    定义进程间的通信接口,实现多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作

    AIDL通讯实现多进程service播放MediaPlayer

    activity主程序,前台主要控制播放切换歌曲,和装载列表...service单独进程,根据activity操作控制播放,并反馈播放器状态,播放时长,自动切换下一首,通知activity更新主程序,接口灵活简单,可自定义其他方法完善。

    跨进程通讯

    android跨进程通讯,数据互相访问,传输各种数据类型及远程接口回调的使用

    Android AIDL 详解

    Android开发中实现跨进程通讯的AIDL接口的相关文章推荐 - Android... Android开发中实现跨进程通讯的AIDL接口的相关文章:在Android开发中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. ...

    Android AIDL接口定义语言

    Android进程之间如何通讯呢? 在Windows系统中存在IPC管道服务、MailSolt邮槽、消息等方法,在Android平台上提供了一种中间层语言 AIDL Android接口定义语言(Android Interface Definition Language)。  实现IPC...

    Android 使用AIDL进行两个APP之间通讯以及相互消息回调(一)

    AIDL:Android Interface Definition Language,翻译过来就是Android接口定义语言。是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码。所以使用AIDL需要一个服务端和客户端 作用:可以在...

    AIDL客户端demo

    通过这种机制,我们只需要写好 aidl 接口文件,编译时系统会帮我们生成 Binder 接口,实现进程之间的通讯。 一、如何定义aidl文件 1、在main目录下创建文件夹aidl,然后在aidl下new aidl 创建.aidl文件--&gt;...

    AIDL服务接口

    aidl服务接口,android程序中用于跨进程之间的通讯。

    Android AIDL——进程通信机制详解

    Android AIDL, Android进程机制通信机制,这里就整理下AIDL 的知识,帮助大家学习理解此部分知识! 什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言。听起来很深奥,其实它的...

    AIDL服务器端和客户端

    它是一种接口定义语言,用来约束两个进程间通讯(IPC)的规则,供编译器生成代码,实现Android设备上两个进程间通讯(IPC),进程之间通讯的信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议...

    AIDL服务端

    通过这种机制,我们只需要写好 aidl 接口文件,编译时系统会帮我们生成 Binder 接口,实现进程之间的通讯。 一、如何定义aidl文件 1、在main目录下创建文件夹aidl,然后在aidl下new aidl 创建.aidl文件--&gt;...

    Android中如何利用AIDL机制调用远程服务

    在Android中,每个应用程序都有自己的进程,...AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间

    Android AIDLDemo

    Android进程间通讯DEMO,使用Android Studio。 1:客户端调用服务端 2:客户端注册实现接口,在服务端进程中调用客户端进程注册的接口方法。

    安卓AIDL简单详解

    AIDL是 Android Interface definition language的缩写,我们从中可以看出有Interface,我们才知道AIDL是安卓接口定义语言,可以实现安卓设备中进程之间的通信,也可以用于单个service与多个程序之间进行跨进程通讯,...

    Android使用AIDL共享Room数据库

    其主要作用是IPC(Android进程间通讯),简单的来说就是AIDL可以让一个APP使用另外一个APP的Service,使得两个或者多个APP之间可以信息交互,使得多个APP之间只需要使用一套代码,这样对于同一个功能就不用在多个APP...

    AIDL-Eclipse:偏僻的

    AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,...

Global site tag (gtag.js) - Google Analytics