Android AIDL使用详解

TTHHVV 2014-08-09

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

icp:interprocess communication :内部进程通信

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

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

创建你的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.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.

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

Android AIDL使用详解

本文完整例子下载

------------------------------------------分割线------------------------------------------

具体下载目录在 /2014年资料/8月/9日/Android AIDL使用详解

------------------------------------------分割线------------------------------------------

--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.

 实现你定义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服务端得编码完成了。

--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.

 第四步告诉你怎么在客户端如何调用服务端得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;
  }
 };

相关推荐