Binder是Android的一个类,它实现了IBinder接口,从IPC角度来说,它是一种进程间通信方式,也可以理解为一种虚拟物理设备,驱动在/dev/binder下,从Android Framework来说,它是ServiceManager连接各种ManagerService的桥梁,从Android应用层来说,它是客户端和服务器之间进行通信的媒介,当binderService的时候,服务的会返回一个包含服务的业务调用的Binder对象,客户端通过这个对象可以调用服务端的方法和数据。
新建AIDL实例以后,系统会自动为我们生成Binder类,包括如下内容:
DESCRIPTOR
这是Binder的唯一标识,一般用Binder的类名标识。
asInterface(android.os.IBinder obj)
用于将服务端的Binder对象转换成为客户端所需的AIDL接口类型的对象,这种转换是区分进程的,如果客户端和服务器是在同一个进程中,那么此方法返回的就是服务端的Stub对象本身,如果不是同一个进程,那么返回的就是Stub.proxy对象。
asBinder
此方法返回当前的Binder对象。
onTransact
此方法运行在服务端的线程池中,当服务端发起跨进程请求时,远程请求会通过系统封装以后交由此方法来处理,该方法的原型为 public boolen onTransact(int code,android.os.Parcel data,android.os.Parcel reply,int flags),code表示客户端所需要调用的方法,data是所需参数,如果需要返回值,服务端会将返回值写入reply参数,如果此方法返回值为false,那么意味着调用失败。
需要注意的是,当客户端发起请求时,客户端线程会被挂起,直到服务端返回数据,所以如果一个远程方法很耗时,那么不应该放在主线程中调用。
网友评论