AIDL通信
引言
Android每个进程都有自己的dalvik vm,拥有自己独立的内存空间,进程间不共享内存,要实现进程间通信可以使用AIDL实现。
支持数据类型
- 8种基本类型
- charSequence
- ArrayList<支持类型>
- Parceable序列化实现类(跨进程本质上也是序列化反序列化过程)
- AIDL接口本身
- 注意点:导包,使用的序列化对象必须有同名的.aidl文件。
- 两种:定义接口,序列化对象。定向化tag(in out inout )。
使用
1.创建服务端aidl文件,接口定义;
2.创建服务端service,实现aidl定义接口,将Binder对象返回(实现aidl.stub);
3.拷贝服务端aidl至客户端,同包名路径;
4.绑定服务端service,成功建立连接,拿到binder对象并转为aidl接口类型对象;
5.通过对象调用service实现方法;
6.使用完后,根据需要解绑。
报错检查
- 自定义对象实现序列化;
- aidl显示导包;
- tag使用是否正确;
- inout需实现序列化读写方法;
- 包名一致。
拓展
通过回调实现双向通信。
权限验证:服务端Binder的onTranscat中包名验证或权限验证。
死亡回调:正常运行连接断开现象,死亡代理重新绑定或conn断链时重新注册。
注意项
- 绑定服务conn运行在主线程,不能做耗时操作;
- 客户端调服务端方法耗时需起线程;
- 服务端的方法运行在服务端的binder线程池无需另起线程