IPC——AIDL(Android Interface Definition Language)那些事儿

来源:互联网 发布:郑州淘宝网店诈骗案例 编辑:程序博客网 时间:2024/06/01 18:02

    Android接口定义语言AIDL,与其他的IDL很类似,客户端和服务器端可以通过有它定义的编程接口来达成共识,以便通过进程间通讯(IPC)完成通讯。IPC(Inner-Process Communication进程间通信)。在android系统中,通常一个进程不允许直接访问另一个进程的内存,因此为了能够实现对话,进程需要把对象分解为操作系统可以识别的原生数据,在跨越进程边界后再组装起来。注意:仅当允许其他应用程序通过IPC方式访问服务,并且服务需要多线程运行时,才必须用到aidl,如果不需要(进行跨越多个应用的)并发ipc,就应该用实现Binder实现接口,或者要进行IPC但是不需要多线程运行,则可使用Messager来实现接口。

   Messager实现ipc通信,地层也是使用了aidl的方式,和aidl方式不同的是,Messager方式是利用handler形式来处理,因此,是线程安全的,也表示不支持并发处理;而aidl方式是非线程安全的,支持并发处理,因此,我们使用aidl方式时需要保证代码的线程安全。进程A创建一个Message,将这个对象通过IMessager.send(message)方法传递到进程B,send(message)方法会使用一个parcel对象对Message对象编集,再将Parcel对象传递到进程B,然后解编集,再得到一个和进程A中Message对象一样的对象,再把Message对象加入到进程B的消息队列里,handler会去处理它。

   在开始设计Aidl接口之前,注意:对aidl接口的调用是直接函数调用(direct function call),发起调用的线程无法预料。如果是从本地线程发起,则调用将在发起线程中运行。从远程进程发起的调用,将会由系统维护的本地进程内部的线程池分发,必须准备好迎接来自未知线程的调用,并且还可能同时收到多个调用,所以,aidl接口的实现必须完全是线程安全的。

   关键字oneway会改变远程线程的处理方式,使用该关键字,远程线程不会阻塞,在发送完交易数据后他会立即返回。接口的实现代码最终将这种远程调用视同由Binder线程池发起的调用一样接收。如果本地调用,则不起作用,调用仍旧是同步执行的。

   aidl中只支持方法,不能声明静态成员,支持java简单类型如int,long。。还有String CharSquence  list map 方法可以多个参数,也可以不带参数,可以有一个返回值,或者无返回值,其他类型即便是定义于接口所在的包中,也必须包含import,所有非简单类型的参数都需要带一个指明数据方向的标志,可以是in、out或inout,简单类型的参数默认是in,且不能是其他方向值。请按照实际需求来限定参数的方向,因为参数组装过程开销很大。.aidl得代码注释会一并彷如最终生成的IBinder接口中(import和package语句之前的注释除外)。

   要跨进程传递某个类,可以通过ipc接口来实现,不过务必确保ipc通道的对端可以识别该类的代码,该类必须支持parcelable接口,支持parcelable接口很重要,这使得android系统可以讲对象分解为能够跨进程组装的原生数据。

   

0 0