一、简介
AIDL是Binder的延伸,很多Android系统服务都是AIDL(如剪切板)
二、AIDL涉及的几个类
- IBinder
- IInterface
- Binder
- Proxy
- Stub
当自定义一个aidl文件时(如MyAidl.aidl,里面有一个sum方法),AS会为我们生成一个MyAidl.java的类文件。这个类文件由1个接口(IInterface)和2个类(Stub、Proxy)组成,之所以不是分开生成3个文件,是因为当AIDL类多的时候,Stub和Proxy就会重名冲突,将其放在各自的AIDL文件中就能避免这种情况。
三、sum方法的调用
Stub中的sum是如何调用Proxy中的sum?又是如何调用另一个进程的sum方法的?关键就在于Stub中的asInterface方法和onTransact方法!
3.1 Client角度
站在Client的角度,应该
MyAidl.Stub.asInterface(某IBinder对象).sum(1,2);
asInterface方法的作用就是判断参数(即IBinder对象)和自己是否在同一个进程中。
- 是,直接转换、直接使用,以后的事情和Binder跨进程通信无关
- 否,就把这个IBinder对象包装为一个Proxy对象。此时调用Stub的sum方法,就是调用的Proxy的sum方法(return new MyAidl.Stub.Proxy(obj);)
3.2 Proxy的作用
在Proxy自己的sum方法中,会使用Parcelable来准备数据:
- ① 把函数名称、函数参数都写入到_data中
- ② 让_reply接收函数返回值
- ③ 使用IBinder的transact方法,将数据传递给Binder的Server端
//这个mRemote就是asInterface方法传来的obj参数
mRemote.transact(Stub.TRANSACTION_addBook,_data,_reply,0);
3.3 Server角度
Server通过onTransact方法接收来自Client的数据(包括函数名称、函数参数),找到对应的函数(这里指的sum方法),把参数传进去,return结果。onTransact函数经历了:
“读数据”--->执行要调用的函数--->将结果再“写数据”
来源:CSDN
作者:墨玉浮白
链接:https://blog.csdn.net/qq_36299025/article/details/103981199