近期开发应用SDK时因为数据安全和代码封装的考虑,尝试用AIDL做了一个简单的跨进程调用接口框架。Aidl的基础使用在这篇文章里已经写的比较清楚了:
Android:学习AIDL,这一篇文章就够了(上)
实际的代码编写个人会给以下几个建议:
定义aidl接口,最好使用一个独立的module,比如有两个app,一个是server,一个是client,他们之间的aidl接口最好在第三个module进行生命,这样可以避免出现两边的aidl接口由于更新产生不一致的问题。
如果server和client两边的aidl接口不一致,容易产生方法调用错位,即原本调用funcA的aidl却调用到了funcB上面。
和大部分文章所述不同,不需要aidl接口一定是定义在server下面,即如下这样的方式
com.example.aidl_server.Server.java
com.example.aidl_server.IMyInterface.aidl
这两个类或接口完全不需要服从这样的约定,原因同1
- 跨进程的对象传递,却一定要遵守aidl生命和对象声明处于同一个package层次之下,即
com.example.aidl_module.RemoteObject.java
com.example.aidl_module.RemoteObject.aidl
包名和文件名需要保持一致
- 跨进程回调我们需要使用RemoteCallbackList,这个类会在连接断开之后自动清理已经注册的RemoteCallback,所以大部分时间如果我们只是希望实现跨进程通信而不需要主动控制通信断开,那么RemoteCallbackList.unregister(RemoteCallback rc)是不需要调用的。
- android 6.0之后大部分的手机默认禁用关联启动,