介绍
Android Interface Definition Language (AIDL), Android接口定义语言。系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信Interprocess communication (IPC)。AIDL就是解决这个问题的。
阅读本文需要了解Service的相关知识,关于Service的讲解请参考http://blog.csdn.net/l664675249/article/details/48899323
创建.aidl文件
aidl是用Java语法编写的,后缀为.aidl的文件。
- 每一个aidl文件必须定义一个接口,在这个接口里声明方法
- 在aidl里不能有static属性(field)
- aidl支持基本的数据类型,当你需要使用额外的数据类型时需要把它们import进来,即使它们跟这个文件在同一个包中。
示例
|
|
把aidl文件存在src/目录下,当你build项目的时候,SDK工具会在gen/目录下生成一个与.aidl文件名字相同的.java文件。
实现接口
生成的IRemoteService.java如下
|
|
在这个文件中有一个内部类Stub,这是父接口的一个抽象实现,并声明了aidl中的所有方法。为了实现由aidl生成的接口,我们需要继承Stub并实现从aidl继承过来的方法。下面是一个使用匿名类的例子
|
|
这样mBinder就是一个Stub的实例了,下一步就是如何在client端使用,与service端产生交互了。
注:
- 不能保证请求是在主线程被执行的,所以从构建到使用要考虑Service线程的安全性
- 默认情况下,请求是同步的,所以尽量不要在主线程中发出请求
- 所有的异常都不会返回给请求者(Caller)
在Client中使用接口
当你已经实现你的Service之后,你需把它暴露在Client中使Client可以绑定它。继承Service并实现onBind()方法,来返回一个实现了Stub的实例。下面就是一个把IRemoteService暴露给Client的例子:
|
|
现在client(比如是一个Activity)可以调用bindService()来连接这个Service,通过onServiceConnected()来接收Service中 onBind() 返回的mBinder,最后使用YourServiceInterface.Stub.asInterface(service)来把返回的mBinder转换成YourServiceInterface类型。例子如下:
|
|
注:
如果Service和Client在两个不同的Application中,Client的Application的src/目录下必须也有对应的.aidl文件。
一个Client的例子
|
|