服务端
- 实现XXX.Stub()
- native: BBinder
- kernel:binder_node
客户端
- 获取proxy: XXX.Stub.asInterface(Ibinder)
- native:BpBinder
- kernel:binder_ref
in out inout
修改参数,同步变化
in: 数据只能由客户端---->服务器out数据只能由服务端---->客户端inout数据双向流动
oneway
- 修饰方法,不能有返回值,也不可携带
out,inout - 远程调用不会阻塞,发送事务数据后立即返回
- 发生异常,客户端无法感知,需要额外处理!!!
Binder跨进程双向通信
linktodeath
- 死亡通知
@Override
public void setCallback(IChangeCallback callback) throws RemoteException {
mCallBack = callback;
//监听客户端的进程是否死了
mCallBack.asBinder().linkToDeath(new DeathRecipient() {
@Override
public void binderDied() {
Log.i("test","linkToDeath binderDied");
}
},0);
}
aidl 通信 ---> Messenger 方式 (注意不是Message)
oneway interface IMessenger {
void send(in Message msg);
}
...
public final class Messenger implements Parcelable {
private final IMessenger mTarget;
/**
* Create a new Messenger pointing to the given Handler. Any Message
* objects sent through this Messenger will appear in the Handler as if
* {@link Handler#sendMessage(Message) Handler.sendMessage(Message)} had
* been called directly.
*
* @param target The Handler that will receive sent messages.
*/
//服务端 调用
public Messenger(Handler target) {
// new MessengerImpl() : IMessenger.Stub
mTarget = target.getIMessenger();
}
//客户端调用
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
...
public IBinder getBinder() {
return mTarget.asBinder();
}
}
//XXXStub : android.os.Binder
public android.os.IBinder asBinder()
{
return this;
}
参考 Android Framework实战开发-binder通信常见(oneway,in,out,inout)元素介绍及binder双向通信的实现