Binder机制
IBinder:1.远程对象的基本接口,是为了高性能而设计的轻量级远程调用机制的核心部分;
2.该接口定义了与远程对象间交互的协议,不仅用于远程调用,也用于进程内调用;
(是Android给我们提供的一个进程间通信(IPC)的一个接口(不直接实现),通过继承Binder类来实现进程间通信)
Binder机制浅析Android使用Binder机制来实现进程间的通信的原因
分析无需关心底层如何实现,只需按照AIDL的规则,自定义一个接口文件, 然后调用调用接口中的方法,就可以完成两个进程间的通信。
与消息,广播等方式相比,适用于涉及多进程并发情况下的进程间通信。
AIDL使用详解
IPC:跨进程通信(interprocess communication);
AIDL:Binder机制使用的接口语言(Android Interface Definition Language),并非编程语言,只是定义两个进程间的通信接口;
注意事项:1.接口名词需要与aidl文件名相同;
2.接口和方法前面不要加访问权限修饰符:public ,private,protected等,也不能用static final;
3.AIDL默认支持的类型包括Java基本类型,String,List,Map,CharSequence;
4.处3以外的其他类型需要import声明,自定义类型作为参数或者返回值需实现Parcelable接口;
5.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中;
6.非原始类型中,除了String和CharSequence以外,其余均需要一个方向指示符( in、out、和inout)
in表示由客户端设置,out表示由服务端设置,inout表示客户端和服务端都设置了该值;
案例1:简单数据通信
服务端:1.main目录下(与java目录平级),新建aidl文件夹及文件(与java主包包名层级一致)
创建aidl文件2.创建server端的AIDLService(供clicent端连接调用)
(创建IBinder实现类继承Stub,再返回给Service的onBind方法,使之同时实现IPerson接口和IBinder接口)
创建Service 清单配置客户端:1.将服务的aidl文件夹拷过来(保持一致);
2.绑定远程service,通过con转换IBinder,最后调用服务端方法;
使用案例2:复杂数据通信
服务端客户端流程同简单数据,这里只演示复杂数据处理 部分。
1.自定义数据类型并实现序列化;
2.新建该数据类型的aidl文件;
3.创建业务aidl及service服务
4.client端由于包名与服务端不一致,需修改build.gradle
序列化 结构 业务aidl build配置直接通过Binder的onTransact完成跨进程通信
服务端:
服务端Service 清单配置service客户端:
客户端连接service调用
网友评论