Android组件篇之跨进程通信

147 阅读1分钟

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.使用完后,根据需要解绑。

报错检查

  1. 自定义对象实现序列化;
  2. aidl显示导包;
  3. tag使用是否正确;
  4. inout需实现序列化读写方法;
  5. 包名一致。

拓展

通过回调实现双向通信。 权限验证:服务端Binder的onTranscat中包名验证或权限验证。
死亡回调:正常运行连接断开现象,死亡代理重新绑定或conn断链时重新注册。

注意项

  1. 绑定服务conn运行在主线程,不能做耗时操作;
  2. 客户端调服务端方法耗时需起线程;
  3. 服务端的方法运行在服务端的binder线程池无需另起线程