美文网首页
Messenger 一步步了解

Messenger 一步步了解

作者: qpan | 来源:发表于2018-04-06 17:42 被阅读16次
  • 涉及类
    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处理消息;
因此:

  1. Messenger需要绑定一个handler,另外可发送一个Message
  2. 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();
有没有觉得这里面有什么猫腻?

  1. 由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顺序处理(串行)


  • 简单总结
  1. Messenger是AIDL的简单封装,适用于特定的场景
  2. 只有一个场景:发送消息; 方法只有send(Message)
  3. 内部用handler处理,因此最后都是串行处理消息; 不适合大量并发的情况

相关文章

网友评论

      本文标题:Messenger 一步步了解

      本文链接:https://www.haomeiwen.com/subject/gskshftx.html