AIDL使用流程如下:
- 服务端需要创建Service来监听客户端请求,然后创建一个AIDL文件,将暴露给客户端的 接口在AIDL文件中声明,最后在Service中实现这个AIDL接口即可;
- 客户端首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。
注意事项:
- AIDL支持的数据类型:
i. 基本数据类型、String、CharSequence
ii. List:只支持ArrayList,里面的每个元素必须被AIDL支持
iii. Map:只支持HashMap,里面的每个元素必须被AIDL支持
iv. Parcelable
v. 所有的AIDL接口本身也可以在AIDL文件中使用 - 自定义的Parcelable对象和AIDL对象,不管它们与当前的AIDL文件是否位于同一个包,都必须显式import进来。
如果AIDL文件中使用了自定义的Parcelable对象,就必须新建一个和它同名的AIDL文件,并在其中声明它为Parcelable类型;
package com.ryg.chapter_2.aidl; parcelable Student;
AIDL接口中的参数除了基本类型以外都必须表明方向in/out。AIDL接口文件中只支持方 法,不支持声明静态常量;
void addStudent(in Student student);
- AIDL方法是在服务端的Binder线程池中执行的,因此当多个客户端同时连接时,管理数 据的集合直接采用
CopyOnWriteArrayList
来进行自动线程同步。类似的还有ConcurrentHashMap
; 因为客户端的listener和服务端的listener不是同一个对象,所以
RecmoteCallbackList
是系统专门提供用于删除跨进程listener的接口,支持管理任意的AIDL接口,因为所有AIDL接 口都继承自 IInterface 接口。public class RemoteCallbackList<E extends IInterface>
它内部通过一个Map接口来保存所有的AIDL回调,这个Map的key是 IBinder 类型, value是 Callback 类型。当客户端解除注册时,遍历服务端所有listener,找到和客户端 listener具有相同Binder对象的服务端listenr并把它删掉;
- 客户端RPC的时候线程会被挂起,由于被调用的方法运行在服务端的Binder线程池中, 可能很耗时,不能在主线程中去调用服务端的方法。
注:Android studio AIDL
- 在‘java’平行目录下右键新建AIDL文件;
- 实体类的包要与.aidl的包同名(但并非相同包);