Android aidl总结
AIDL是Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。
定义一个AIDL接口
- 建立.aidl文件
这个文件使用方法签名定义了语言接口
- 实现这个接口
Android SDk工具基于你的.aidl文件使用java语言生成一个接口 这个接口有一个内部抽象类,叫做Stub,它是继承Binder并且实现你AIDL接口的 你必须继承这个Stub类并且实现这些方法
- 暴露这个接口给客户端
实现一个service并且覆盖onBind()方法返回你的Stub实现类
跨进程传递对象
- 要实现Parcelable接口
- 实现writeToParcel,它是用来把对象的当前状态写入到一个Parcel对象中的。
- 在你的类中添加一个叫CREATOR的静态域,它要实现Parcelable.Creator接口
- 最后,建立一个.aidl文件声明你的parcelable类
如果你使用一个定制的构建过程,不要构建.aidl文件。与C语言中的头文件类似,.aidl文件不会被编译
调用一个IPC方法
- 在项目中的src目录下面导入.aidl文件
- 声明一个IBinder接口(基于AIDL生成的)的实例
- 实现ServiceConnection
- 调用Context.bindService(),传递到你的ServiceConnection实现中。
- 在你的onServiceConnected()实现中,你会收到一个IBinder实例(称为服务端) 调用YourInterfaceName.Stub.asInterface((IBinder)service)把返回值映射到YourInterface类型上面
- 调用你接口中定义的方法 你应该捕获当连接损坏时抛出的DeadObjectException异常,这是远程方法唯一会抛出的异常
- 使用你接口的实例调用Context.unbindService()来断开连接
调用IPC服务端的一些注释:
- 对象跨进程时是引用计数的
- 你可以传递一个匿名对象作为方法的参数
aidl关键字
in:数据仅由Client流向Server端
out:Server端创建一个对象,流向Client端
inout:双向流通
oneway:Binder接口异步调用