AIDL的目的是:可以将业务型应用的功能通过aidl的方式开放给其他应用实现,比如支付宝的支付功能,给淘宝用。
一:根据需求,生成一个aidl接口的jar包,生成jar包,为了避免需求方和公司定义的aidl不统一,而且只要维护这个jar包就行了
1,创建一个android工程,定义aidl工程
2,aidl接口定义,必须在xx.xx.xx.aidl的package下面
3,如果返回值有自定义类型的,自定义数据类也要放在xx.xx.xx.aidl的package下面,并且要定义一个自定义类型接口的aidl,同时自定义数据类型要实现Parcelable。另外返回自定义数据类的接口,记得import该数据类。
4、生成jar包,将改android工程勾上 is library 变成依赖工程,然后让其他工程依赖他,编译被依赖工程的时候就会在该依赖工程的bin下面生成可用的jar包,然后给客户端和服务端的aidl工程使用;
二:aidl客户端和服务端的实现
1、客户端要定义ServiceConnection
public ISystemManager mISystemManager;//aidl接口
2、然后通过bingdService连接上上去
context.bindService(explicitIntent,serviceConn, Context.BIND_AUTO_CREATE);
3,客户端调用aidl接口,具体功能,服务端实现
服务端定义一个setvice,onBind返回实现接口stub的类
@Override
publicIBinder onBind(Intentintent) {
mISystemManagerService=this;
returnnewISystemManagerStub();
}
到此客户端调用接口,服务端这边实现接口的流程就结束了。
三:AIDL监听器的实现
有的时候,aidl接口中还有一些监听器,比如卸载的回调等,思路是客户端实现监听aidl的stub,服务端传递参数回调回去。
监听器aidl的定义和在其他aidl接口中的位置:
定义监听器aidl接口和普通的aidl接口一样
服务端有监听器实现:
获取到客户端传来的监听器对象,然后调用监听aidl的接口方法,将值传递回去
客户端监听器实现
注意点:
下面是AIDL能支持的数据类型:入参和出参;
Java编程语言的主要类型(int, boolean等)—不需要import语句。
以下的类(不需要import语句):
String
List-列表中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。List可以像一般的类(例如List)那样使用,另一边接收的具体类一般是一个ArrayList,这些方法会使用List接口。
Map- Map中的所有元素必须是在此列出的类型,包括其他AIDL生成的接口和可打包类型。一般的maps(例如Map)不被支持,另一边接收的具体类一般是一个HashMap,这些方法会使用Map接口。
CharSequence-该类是被TextView和其他控件对象使用的字符序列。
通常引引用方式传递的其他AIDL生成的接口,必须要import语句声明
实现了Parcelable protocol以及按值传递的自定义类,必须要import语句声明。