Binder是Android的一个类,实现了IBinder接口。在FrameWork层,Binder用于连接各种Manager(WindowManager,ActivityManager等),比如在启动一个Activity时,ApplicationThread就是一个Binder机制,用于ActivityThread与ActivityManagerService之间进行交流。在应用层,Binder机制是服务端和客户端进行交互的枢纽。
Binder机制包含Messenger和AIDL,Messenger底层是AIDL,它不需要同步机制,因为Messenger一次只处理一个请求。所以,当存在并发情况的时候,需要使用AIDL。
任何想要在Binder中传递的数据需要实现IInterface接口。我们在使用系统自动生成的AIDL类时,如果在该类中药调用其他类,必须导入其他类的包,即使在同一个包下。在AIDL中我们需要实现以下几个方法:
1.DESCRIPTOR
这个变量用来标识当前AIDL。
2.AsInterface(android.os.IBinder obj)
将服务端的Binder对象转换成客户端可以调用的AIDL对象,会判断是否处于同一个进程,如果处于同一个进程,通脱Stub内部类来处理,否则通过Stub.Proxy()来处理。
3.asBinder()
返回当前Binder对象。
4.onTransact(int code,android.os.Parcel data,android.os.Parcel reply,int flags)
服务端通过code来判断请求的方法,data是客户端传过来的值,目标方法执行完毕后,会将值存储在reply中用于返回。如果返回false的话,客户端请求失败。