-
涉及类
Messenger
IMessenger
Handler
MessengerImpl -
使用场景
/**
* Reference to a Handler, which others can use to send messages to it.
* This allows for the implementation of message-based communication across
* processes, by creating a Messenger pointing to a Handler in one process,
* and handing that Messenger to another process.
*
* <p>Note: the implementation underneath is just a simple wrapper around
* a {@link Binder} that is used to perform the communication. This means
* semantically you should treat it as such: this class does not impact process
* lifecycle management (you must be using some higher-level component to tell
* the system that your process needs to continue running), the connection will
* break if your process goes away for any reason, etc.</p>
*/
简而言之:跨进程中用于 在一个进程中发送消息,另一个进程中的handler处理消息;
因此:
- Messenger需要绑定一个handler,另外可发送一个Message
- Messenger是Binder的一个简单包装
重要变量及方法:
private final IMessenger mTarget;
构造函数:
- 绑定handler,用于处理消息 --用于服务端
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
- 绑定IBinder, 用于跨进程通信 --用于客户端
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
- 重要方法
其中这个用于跨进程通信的binder怎么来的呢?
public IBinder getBinder() {
return mTarget.asBinder();
}
因此大概知道:两个进程间通过binder来通信; 某个进程的Messenger绑定一个handler,这个handler是负责处理消息的; 同时提供一个此Messenger的binder, 另一个进程新建Messenger时绑定这个binder,就可以发送消息了;(IMessenger对象)
-发送消息
public void send(Message message) throws RemoteException {
mTarget.send(message);
}
深入一点点:
其实Messenger 是对binder机制的一个简单的封装
何以见得呢:
我们注意到有个对象IMessager 以及它的方法send();
有没有觉得这里面有什么猫腻?
- 由mTarget = target.getIMessenger();可以得到这个对象
那我们看下Handler的getIMessenger方法:
final IMessenger getIMessenger() {
synchronized (mQueue) {
if (mMessenger != null) {
return mMessenger;
}
mMessenger = new MessengerImpl();
return mMessenger;
}
}
继续看MessengerImpl
private final class MessengerImpl extends IMessenger.Stub {
public void send(Message msg) {
msg.sendingUid = Binder.getCallingUid();
Handler.this.sendMessage(msg);
}
}
ok,基本明了了
其实IMessage就是 aidl跨进程的一个定义数据交互的接口而已
而MessageImpl是它的具体实现,里面的方法只有send()一个,也就是说它的场景简单且粗暴: 跨进程发送message,且是handler顺序处理(串行)
- 简单总结
- Messenger是AIDL的简单封装,适用于特定的场景
- 只有一个场景:发送消息; 方法只有send(Message)
- 内部用handler处理,因此最后都是串行处理消息; 不适合大量并发的情况
网友评论