android 中通过 AIDL (Android Interface definition language) 机制 (远程服务调用)实现进程间的通信。


<1>什么是aidl:

1. aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
icp:interprocess communication :内部进程通信


<2>如何使用

既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述:

--2.1.Create your .aidl file - This file defines an interface (YourInterface.aidl) that defines the methods and fields available to a client.

--2.1创建你的aidl文件

我在后面给出了一个例子,它的aidl文件定义如下:写法跟java代码类似,但是这里有一点值得注意的就是它可以引用其它aidl文件中定义的接口,但是不能够引用你的java类文件中定义的接口

package com.cao.android.demos.binder.aidl;    import com.cao.android.demos.binder.aidl.AIDLActivity;  interface AIDLService {         void registerTestCall(AIDLActivity cb);         void invokCallBack();  }    

--2.2.Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory.

--2.2.编译你的aidl文件

这个只要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译:编译生成AIDLService.java如我例子中代码

android笔记 AIDL 实现进程间通信_第1张图片


--2.3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from your AIDL interface. This interface has an inner abstract class named Stub that inherits the interface (and implements a few additional methods necessary for the IPC call). You must create a class that extends YourInterface.Stub and implements the methods you declared in your .aidl file.

--2.3实现你定义aidl接口中的内部抽象类

实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:

private final AIDLService.Stub mBinder = new AIDLService.Stub() {        @Override      public void invokCallBack() throws RemoteException {          Log("AIDLService.invokCallBack");          Rect1 rect = new Rect1();          rect.bottom=-1;          rect.left=-1;          rect.right=1;          rect.top=1;          callback.performAction(rect);      }        @Override      public void registerTestCall(AIDLActivity cb) throws RemoteException {          Log("AIDLService.registerTestCall");          callback = cb;      }  };  

Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了。


--2.4.Expose your interface to clients - If you're writing a service, you should extend Service and override Service.onBind(Intent) to return an instance of your class that implements your interface.

--2.4客户端调用服务端的aidl描述的接口对象

第四步告诉你怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时不是需要一个ServiceConnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder对象的:

AIDLService mService;  private ServiceConnection mConnection = new ServiceConnection() {      public void onServiceConnected(ComponentName className, IBinder service) {          Log("connect service");          mService = AIDLService.Stub.asInterface(service);          try {              mService.registerTestCall(mCallback);          } catch (RemoteException e) {            }      }        public void onServiceDisconnected(ComponentName className) {          Log("disconnect service");          mService = null;      }  };  
mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。

<3>aidl中使用java类

aidl中使用java类,需要实现Parcelable接口,并且在定义类相同包下面对类进行声明:

上面我定义了Rect1类
之后你就可以在aidl接口中对该类进行使用了

package com.cao.android.demos.binder.aidl;  import com.cao.android.demos.binder.aidl.Rect1;interface AIDLActivity {       void performAction(in Rect1 rect);   }  

注意in/out的说明,我这里使用了in表示输入参数,out没有试过,为什么使用in/out暂时没有做深入研究。


链接:

原文:http://blog.csdn.net/stonecao/article/details/6425019

Android中AIDL使用例子


更多相关文章

  1. android使用自定义属性
  2. Android 自定义ToneGenerator
  3. 关于android的animation的xml定义中的android:interpolator属性
  4. Unity与Android接口互相调用
  5. android自定义标题栏。。。。。。。
  6. Android Interface Definition Language (AIDL) android接口定义
  7. Android: 自定义Tab样式
  8. Android 自定义View及其在布局文件中的使用示例(二)
  9. Android快速开发框架Android_BaseLib,集成了常用工具类,自定义View

随机推荐

  1. Android(安卓)Studio打开Android(安卓)De
  2. android sdk 离线下载地址及对应映射关系
  3. android中的布局文件
  4. Android开发 准备工作
  5. 动态添加TableRow
  6. Android中设置activity的background为Wal
  7. android 沉浸式主题记录
  8. android TextView属性详解
  9. Android控件visible,invisible和gone
  10. Android ListView CheckBox点击事件