AIDL其实并没有多么复杂。
它是用来方便我们开发者编程的一个命令工具而已。
Android在编译时,会通过它将AIDL文件生成对应的Java文件。
这个Java文件就是用来进行IPC进程间通信。

下面详细说明这个Java文件的构成。以ITestAidl.AIDL文件为例进行说明。
ITestAidl.AIDL文件里申明onCallBack()方法。
Android编译会在gen目录下生成ITestAidl.Java文件。

这个Java文件中有Interface ITestAidl,以及I/F onCallBack()。

Interface ITestAidl下有内部抽象类ITestAidl.Stub,
这个内部抽象类在进行IPC进程间通信时,扮演的是服务端的角色,
它有两个重要的方法asInterface(IBinder)和onTransact(Parcel data, Parcel reply, int flags)。

在进程间通信时,如果通信双方处于同一进程时,假如还通过Binder驱动进行通信,很明显是完全没必要的。
asInterface的作用就是,判断通信双方是否处于同一进程,如果是同一进程那么直接提供服务端的实例。
如果处于不同进程,那么提供服务端的代理,该代理会通过Binder驱动进行进程间通信。
其实这个代理在AIDL生成的Java文件中,也一并生成好了。

Binder驱动进行进程通信有一个前提,客户端和服务端要遵守一定的协议,客服端遵照这个协议,
将某个方法的信息(方法参数,该方法对应的ID),通过Binder驱动传递给服务端。服务端接收到信息后,
遵照双方定下的协议,通过方法ID找到对应方法,进行调用。

onTransact就是服务端通过方法ID分发Binder驱动传递过来的消息,调用服务端的具体方法的。
Parcel data:客户端传递过来的数据包
Parcel reply:服务端执行完毕后返回给客户端的数据包
int flags:具体方法的标志

接下来说明服务端代理类ITestAidl.Stub.Proxy,当需要进行间通信时,Stub类的asInterface方法会将这个
Proxy类提供给客户端,客户端通过它调用服务端的方法。
Proxy类中有一个重要的属性mRemote,它是服务端通过构造函数传递给Proxy类。它其实对应的是
Binder驱动层的代理对象(这个地方太复杂,我还不能完全说清楚)。
Proxy也实现了Interface ITestAidl的I/F方法onCallBack(),这里就是按照客户端和服务端双方的协议
将onCallBack()的方法ID,需要的数据,以及需要返回的数据打包,调用方法transact传递到Binder驱动层。
Binder驱动层将消息传递到服务端。这样就进行IPC进程间通信。

更多相关文章

  1. Android:Activity(四):Activity生命周期
  2. WebKit 分析–for android - Braincol - 博客园
  3. AOP在Android中最佳用法
  4. AIDL跨进程通信
  5. Android(安卓)进程间通讯四种方式
  6. Android难点之——自定义View(上)
  7. 《Android(安卓)第一行代码》十一章 Service学习笔记
  8. Android(安卓)获得view的宽和高
  9. android启动一个应用程序大概流程

随机推荐

  1. android framework service开发原理,以震
  2. Android:intent用法实例
  3. Android(安卓)Edittext 显示光标 获取焦
  4. Android(安卓)Sqlite ANR 问题解决及其事
  5. android usb流程
  6. android判断当前应用是否启动、app运行状
  7. Android(安卓)Gesture Detector
  8. android强制完全退出核心代码
  9. android View绘制流程
  10. 强大的 Android(安卓)属性动画 ObjectAni