Android中的信使Messenger的源码解析
Android中的信使Messenger的源码解析
Kobe_Gong_5 发表于2年前
Android中的信使Messenger的源码解析
  • 发表于 2年前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

通过Messenger可以实现基于message的IPC通信。
Messenger内部引用了一个Handler,通过Messenger的getBinder方法返回一个IBinder对象,这个IBinder可以实现IPC通信。

public IBinder getBinder() {return mTarget.asBinder();
    }

mTarget是IMessenger类型。在Messenger的构造方法中对mTarget进行了初始化。

 public Messenger(Handler target) {
        mTarget = target.getIMessenger();
    }

通过调用Handler的getIMessenger方法得到mTarget。

final IMessenger getIMessenger() {synchronized (mQueue) {if (mMessenger != null) {return mMessenger;
            }
            mMessenger = new MessengerImpl();return mMessenger;
        }
    }

mMessenger是Handler内部类MessengerImpl的一个实例。

private final class MessengerImpl extends IMessenger.Stub {public void send(Message msg) {
            msg.sendingUid = Binder.getCallingUid();
            Handler.this.sendMessage(msg);
        }
    }

Binder.getCallingUid()方法返回发送当前正在处理的这个事务的进程uid。
通过handler的sendMessage将该消息发送到当前线程的消息队列中。

总结:Messenger实现了Parcelable接口,我们可以在服务端将Messenger作为IBinder返回给客户端,客户端将IBinder转成IMessenger类型,通过调用IMessenger的send()方法向服务端发送Message。
android.os.MessengerService实现了基于Messenger通信的Service。

共有 人打赏支持
粉丝 3
博文 55
码字总数 43587
×
Kobe_Gong_5
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: