AIDL小结

59 阅读1分钟

服务端

  • 实现XXX.Stub()
  • native: BBinder
  • kernel:binder_node

客户端

  • 获取proxy: XXX.Stub.asInterface(Ibinder)
  • native:BpBinder
  • kernel:binder_ref

image.png

in out inout

修改参数,同步变化

  • in: 数据只能由客户端---->服务器
  • out数据只能由服务端---->客户端
  • inout数据双向流动

oneway

  • 修饰方法,不能有返回值,也不可携带 out ,inout
  • 远程调用不会阻塞,发送事务数据后立即返回
  • 发生异常,客户端无法感知,需要额外处理!!!

Binder跨进程双向通信

image.png

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)

image.png

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双向通信的实现

Android Binder框架实现之Native层addService详解之请求的发送