AIDL是跨进程通信的一种方法,下面我来讲讲它的用法:
服务项目中的配置使用
:
第一步:在服务项目中建一个自定义MyService类并继承Android的Service类,实现onBind()方法。
第二步:在AndroidManifest文件处声明Service,并指定一个Action用于客户项目绑定这个Service。例如:
第三步:新建AIDL文件(AIDL目录与java、res目录同级,文件在包名的最里面,例如aidl/com/demo/*.adil),接口定义大致和class相同,配置好AIDL文件后编译一下让编译器自动生成对应的接口类 。
第四步:在MyService中实例化一个{你的AIDL名字}.Stub接口类,并在onBind()方法中返回它,如图所示:
客户项目中的配置使用
:
第一步:拷贝服务端的AIDL文件到当前项目中,包名目录也必须和服务端的包名目录一致,如图:
第二步:绑定服务项目的Service。例如:
我们只要拿到IBinder即可,调用Aidl接口.Stub.asInterface方法传入一个回调过来的iBinder对象即可拿到。
下面来讲讲如何用AIDl在不同的进程间传入序列化对象,首先我们要了解三个AIDL的关键字
in
、
out
、
inout
声明
他们的作用在于该序列化对象在跨进程通信之间的流向。
其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。数据流向是针对在客户端中的那个传入方法的对象而言的。in 为定向 tag 的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;out 的话表现为服务端将会接收到那个对象的参数为空的对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;inout 为定向 tag 的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。
注意:传送的对象需要实现序列化,并且客户端与服务端必须同时声明该类与AIDL文件,包名也要完全一致。如第一步图例所示
类的AIDL文件配置如下所示: