AIDL(Android Interface Definition Language), 即Android接口定义语言. 在Android中, AIDL是跨进程通信的主要实现方式. 我们同样也可以使用AIDL, 实现自己的跨进程方案. 本文介绍AIDL的使用方式.
更多: http://www.wangchenlong.org/
欢迎Follow我的GitHub: https://github.com/SpikeKing
服务端: 创建Service服务监听客户端的请求, 实现AIDL接口.
客户端: 绑定服务端, 调用AIDL的方法.
AIDL接口: 跨进程通信的接口, AIDL的包名需要与项目的包名相同, 默认生成即可.
AIDL支持的数据类型: 基本类型, 字符串类型(String&CharSequence), List, Map, Parcelable, AIDL接口. 共六种.
流程: 客户端注册服务端, 服务端添加新书, 客户端接收, 并提供客户端的查询书数量的接口.
本文源码的GitHub下载地址
AIDL
本文使用自定义的数据类型Book类, 实现Parcelable接口, 具体参考.
1 | public class Book implements Parcelable { |
AIDL使用自定义类, 需要声明Parcelable类.
1 | // IBook.aidl |
添加AIDL的接口, 用于通知新书到达.
1 | // IOnNewBookArrivedListener.aidl |
AIDL文件注释较多, 都是自动生成, 不影响阅读.
核心AIDL类, 书籍管理器, 四个方法, 获取图书列表, 添加书籍, 注册接口, 解注册接口. 注意, 使用其他方法, 需要import导入相应文件.
1 | // IBookManager.aidl |
所有的参数都需要标注参数方向, in表示输入类型, out表示输出类型, inout表示输入输出类型. out与inout的开销较大, 不能统一使用高级方向.
服务端
服务端通过Binder实现AIDL的IBookManager.Stub
接口.
1 | private Binder mBinder = new IBookManager.Stub() { |
服务启动时, 添加两本新书, 并使用线程继续添加.
1 | public void onCreate() { |
添加书籍, 并发送通知.
1 | private class ServiceWorker implements Runnable { |
向注册监听的, 发送新书的添加通知.
1 | private void onNewBookArrived(Book book) throws RemoteException { |
在AndroidManifest中, Service与Activity不在同一进程.
1 | <!--与主应用不在同一进程中--> |
客户端
绑定服务和解绑服务, 绑定服务的具体内容, 都是在mConnection
中实现.
1 |
|
添加内容, 注册监听接口.
1 | private ServiceConnection mConnection = new ServiceConnection() { |
当调用监听接口时, 异步显示图书列表.
1 | private IOnNewBookArrivedListener mOnNewBookArrivedListener = new IOnNewBookArrivedListener.Stub() { |
点击绑定服务
按钮, 执行绑定服务. 点击获取图书数量
按钮, 获取当前列表的数量.
效果
Android跨进程通信比较复杂, 但是意义重大, 目前常用的动态加载框架都需要处理跨进程通信等问题, 熟练基本原理, 掌握使用方式.
OK, that’s all! Enjoy it!
最初发布地址:
http://www.wangchenlong.org/2016/08/07/1608/071-communication-by-aidl/
欢迎Follow我的GitHub, 关注我的简书, CSDN, 掘金.
我已委托“维权骑士”为我的文章进行维权行动. 未经授权, 禁止转载, 授权或合作请留言.