1.DESCRIPTOR
Binder的唯一标识,一般用Binder的类名表示
2.asInterface(android.os.IBinder obj)
将服务端的对象转换成客户端的AIDL接口类型的对象,这种转换过程是区分进程的,如果客户端和服务端在同一进程,那么此方法返回的是服务端的Stub对象本身,否则返回的是系统封装后的Stub.proxy对象
3.asBinder
此方法返回当前Binder对象
4.onTransact
此方法运行在服务端的Binder线程池中当客户端发起跨进程请求时,会通过系统底层封装后交由此方法处理。服务端通过code可以确定客户端所请求的目标方法是什么,然后从data中取出目标方法所需的参数,再执行目标方法,执行完毕后,就向reply中写入返回的值(如果方法有返回值),返回false那么客户端会请求失败
5.AIDL支持的数据类型
基本数据类型、String和CharSequence、ArrayList、HashMap、Parcelable、AIDL
注意:如果AIDL文件中用到了自定义的Parcelable对象,那么必须新建一个和它同名的AIDL文件,并在其中声明它为parcelable类型(例如: parcelable Book),除此之外,AIDL中除了基本类型,其它类型的参数必须标上方向:in(输入型参数)、out(输出型参数)或者inout(输入输出型参数)
例如(void addBook(in Book book);),最后非常重要的一点就是读取序列化对象要按照写入的顺序读取
6.远程服务端Service的实现
创建Service
创建一个Binder对象并在onBind中返回
(例如: Binder mBinder = new IBookManager.Stub(){}
)、CopyOnWriteArrayList和ConcurrentHashMap(支持并发读写)、
XML中注册这个Service,因为这个Service是运行在独立的进程,它和客户端的Activity不在同一个进程中,这样就构成了进程间通信的场景。
(Service添加:android:process=”:remote”)
7.客户端的实现
绑定远程服务,绑定成功后将服务端返回的Binder对象转换成AIDL接口,然后通过这个接口取调用服务端的远程方法
绑定服务
// 绑定服务
Intent intent = new Intent(this, BookManagerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
解绑服务
unbindService(mConnection);
远程服务接口
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// 服务断开连接
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 获取
IBookManager bookManager = IBookManager.Stub.asInterface(service);
};