Binder的作用
Binder是Android中的一个类,它是Android的一种跨进程通讯方式;在Android系统中,Binder是Manager连接ManagerService的桥梁;在应用开发中,Binder是实现客户端与服务端通讯的媒介,在Activity bindService的时候会获取到一个包含服务端业务调用接口的Binder,透过这个Binder Activity可以实现与服务端的数据交互,而且通过基于AIDL的服务还可以实现跨进程通信。
Binder的重要方法
开头我们已经说过Binder是Android中的一个类,那么它又有哪些重要方法呢。
使用过
DESCRIPTOR
Binder的唯一标示,一般用当前的类名表示
asBinder
返回当前Binder对象
asInterface(IBinder obj)
此方法用于将服务端返回的Binder对象转换为客户端需要的AIDL对象,如果客户端与服务端在同一进程中,则返回的是服务端的Stub,如果是快进程的话,则返回的是Stub.proxy对象
onTransat(int code , Parcel data , Parcel reply , int flags)
每次客户端发起跨进程请求时,服务端就会调用次方法,通过code知道客户端需要调用哪个方法,如果有参数参入的话data会携带传入参数,如果调用的方法有返回值的话,则会在方法执行完之后将返回值写入reply参数中。onTransat方法本身也有一个boolean型返回值,如果这个返回参数为false的话则方法调用会失败,因此如果我们希望某个方法不允许被调用或者要做验证调用的话,也可以通过此方法来实现
Binder需要注意的地方
1.AIDL生成的类中会有个生出Stub的内部类,这个内部类就是继承自Binder,所以AIDL本质也是通过Binder作为媒介实现跨进程通信的,然而Binder的所有方法都是执行在Binder线程池中的,如果有涉及到ui上的处理的话,需要使用Handle来实现而不能直接操作UI
2.当客户端向服务端发起请求,如果远程一个方法很耗时的话那也不能在UI线程发起请求,因为发起请求的线程会一直挂起,知道服务端回应。