定义:是一种轻量级IPC方案,它的底层实现是AIDL,通过它可以在不同的进程中传递Message对象。
使用方法:
(1)服务端:需要创建一个Service来处理客户端的连接请求,同时创建一个Handler,并通过它来创建一个Messenger对象,然后在onBind中返回这个Messenger对象底层的Binder对象即可。
(2)客户端:首先绑定服务端的Service,绑定成功后用服务端返回的Binder对象创建一个Messenger,通过这个Messenger,就可以向服务端发送消息了。如果需要服务端能回应客户端,就和服务端一样,需要在客户端创建Hanlder和Messenger,并把这个Messenger通过Message的replyTo属性传递给服务端,服务端通过这个replyTo参数就可以回应客户端。
frameworks/base/core/java/android/os/IMessenger.aidl
客户端->服务端:系统内部有一个IMessenger的AIDL接口,这个接口有一个send方法,Messenger实现就是依赖于该aidl文件所生成的类,Messenger的内部有一个mTarget的属性,当客户端绑定服务端的时候,会通过服务端返回的IBinder对象构造Messenger,这个时候会把Proxy赋值给mTarget,当客户端采用Messenger.send来发送消息时,会调用mTarget的send方法,从而发起一次IPC的过程,最终服务端会调用IMessenger.Stub(IMessengerImpl)的send方法,send方法内部调用了Handler的sendMessage来发送消息,从而消息交给服务端的Hanlder来处理。
服务端->客户端:服务端与客户端通信,主要是在传输的消息上做了处理,让Messager.replyTo指向的客户端的Messenger,而Messenger又持有客户端的一个Binder对象(MessengerImpl)。服务端正是利用这个Binder对象做的与客户端的通信。