基于Binder的AIDL理解

Binder是Android比较难以理解但又很重要的一分部知识了,那么今天我们一起去揭开它神秘的面纱。

           直观来说,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来说,Binder是Android中跨进程通信的方式,从AndroidFrameWork角度来说,Binder是ServiceManager链接各种Manager(ActivityManager,WindowManager,)和ManagerService的桥梁,从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务,一下我们重点来探索下AIDL通信方式原理来了解Binder。

       AIDL是Android跨进程通信的其中一种方式,其他的包括有Bundle,文件共享,Messenger,ContenProvide和Socket等方式:

使用AIDL分为两部分:服务端和客户端。服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口。

   在AIDL中,并不是所有的数据类型都是可以使用的,那么AIDL到底支持那些数据类型呢,如下所示:

  1、基本的数据类型(int、long、char、boolean、double等)

  2、String和CharSequence

 3、 List:只支持HashMap,里面的每个元素都必须被AIDL支持

 4、Parcelable:所有实现了Parcelable接口的对象

 5、AIDL:所有的AIDL接口本身也可以在AIDL文件中使用 

AIDL中跨进程通信并不是依靠AIDL文件来完成,而是通过AIDL文件编译出来的一个A(暂用A代替)接口来实现,这个接口实现了IInterface接口,可以在这个接口中定义一系列的暴露给客户端调用的方法,并且其中有一个Stub的内部类,这个Stub内部类实现了Binder和 A,也就是说这个内部类Stub就是一个Binder,因为它实现了A,所有它重写了暴露给客户端调用的方法。而我们在服务端创建的Service中的OnBindf()放回的binder对象就是这个Stub,在这个对象的方法中返回客户端需要调用的数据,在客户端这边我们拿到这个stub对象后,用A接口调用asInterface(stub)方法,拿到的就是服务端的A对象,在通过A对象调用其爆出来的方法实现了进程通信

猜你喜欢

转载自blog.csdn.net/chengchuanchen/article/details/84953941