http://blog.csdn.net/stonecao/article/details/6425019(该链接为本篇博客博主的原文链接)

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类文件中定义的接口

[java] view plain copy
  1. packagecom.cao.android.demos.binder.aidl;
  2. importcom.cao.android.demos.binder.aidl.AIDLActivity;
  3. interfaceAIDLService{
  4. voidregisterTestCall(AIDLActivitycb);
  5. voidinvokCallBack();
  6. }

--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如我例子中代码


--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类:

[java] view plain copy
  1. privatefinalAIDLService.StubmBinder=newAIDLService.Stub(){
  2. @Override
  3. publicvoidinvokCallBack()throwsRemoteException{
  4. Log("AIDLService.invokCallBack");
  5. Rect1rect=newRect1();
  6. rect.bottom=-1;
  7. rect.left=-1;
  8. rect.right=1;
  9. rect.top=1;
  10. callback.performAction(rect);
  11. }
  12. @Override
  13. publicvoidregisterTestCall(AIDLActivitycb)throwsRemoteException{
  14. Log("AIDLService.registerTestCall");
  15. callback=cb;
  16. }
  17. };

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对象的:

[java] view plain copy
  1. AIDLServicemService;
  2. privateServiceConnectionmConnection=newServiceConnection(){
  3. publicvoidonServiceConnected(ComponentNameclassName,IBinderservice){
  4. Log("connectservice");
  5. mService=AIDLService.Stub.asInterface(service);
  6. try{
  7. mService.registerTestCall(mCallback);
  8. }catch(RemoteExceptione){
  9. }
  10. }
  11. publicvoidonServiceDisconnected(ComponentNameclassName){
  12. Log("disconnectservice");
  13. mService=null;
  14. }
  15. };

mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。

4.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暂时没有做深入研究。

5.aidl使用完整示例,为了清除说明aidl使用,我这里写了一个例子,例子参考了博客:

http://blog.csdn.net/saintswordsman/archive/2010/01/04/5130947.aspx

作出说明

例子实现了一个AIDLTestActivity,AIDLTestActivity通过bindservice绑定一个服务AIDLTestService,通过并获取AIDLTestActivity的一个aidl对象AIDLService,该对象提供两个方法,一个是registerTestCall注册一个aidl对象,通过该方法,AIDLTestActivity把本身实现的一个aidl对象AIDLActivity传到AIDLTestService,在AIDLTestService通过操作AIDLActivity这个aidl远端对象代理,使AIDLTestActivity弹出一个toast,完整例子见我上传的资源:

http://download.csdn.net/source/3284820

文章仓促而成,有什么疑问欢迎大家一起讨论。

更多相关文章

  1. android中listview的setAdapter()和getAdapter()
  2. Android(安卓)Binder简介
  3. Android中AppWidget加载流程(一)
  4. Android(安卓)Framework启动过程(android内核剖析笔记)
  5. Android(安卓)O指纹识别解析
  6. Android(安卓)自定义view(二) 如何实现自定义组件
  7. Android(安卓)Studio主要目录及文件简介
  8. android中处理json最佳方法
  9. Android(安卓)更改 Toast 的默认位置及自定义Toast

随机推荐

  1. Android 国际化问题
  2. android之R cannot be resolved to a var
  3. Android Studio中解决Gradle DSL method
  4. android pppd拨号问题及解决办法
  5. Android Studio如何集成Genymotion
  6. android的logcat详细用法zt
  7. 【Android】EventBus源码解析(3.1.1)
  8. Android Map库
  9. 今日签到
  10. android Fragments (Android官方文档中文