了解 Messenger

一、Messenger

Messenger 可以在不同进程中传递 Message 对象,是一种轻量级的 IPC 方案,底层实现是 AIDL

Messenger 之所以能够跨进程通信,是因为底层涉及到了 Binder,而 Binder 在 Android 中就是一种跨进程通信的方式

1.1 Messenger 的理解

1.Messenger 对 AIDL 做了封装,使得我们可以更简便地进行进程间通信
2.Messenger 一次处理一个请求,因此在服务端不用考虑线程同步的问题,服务端中不存在并发的问题

二、Messenger 的工作原理

从构造函数开始:
// IMessenger 是一个 AIDL 接口文件
private final IMessenger mTarget;

// 通过 Handler 获取 IMessenger 对象
public Messenger(Handler target) {
    mTarget = target.getIMessenger();
}

final IMessenger getIMessenger() {
    synchronized (mQueue) {
        if (mMessenger != null) {
            return mMessenger;
        }
        mMessenger = new MessengerImpl();
        return mMessenger;
    }
}
// 通过 IBinder 获取 IMessenger 对象
public Messenger(IBinder target) {
    mTarget = IMessenger.Stub.asInterface(target);
}

IMessenger 是一个 AIDL 接口文件

oneway interface IMessenger {
    // 定义了服务端对客户端暴露的接口方法 send()
    void send(in Message msg);
}

有了 AIDL 接口文件,肯定有接口的实现,实现类是 Handler#MessengerImpl

// MessengerImpl 是 Handler 的内部类
private final class MessengerImpl extends IMessenger.Stub {
    // 实现了接口方法 send():使用 Handler 发送消息
    public void send(Message msg) {
        msg.sendingUid = Binder.getCallingUid();
        Handler.this.sendMessage(msg);
    }
}

因此我们在服务端和客户端之间传递的消息,需要用到 Handler 来处理消息

1.服务端进程

在服务端创建一个 Service 来处理客户端的连接请求,只需要创建一个 Handler 作为 Messenger 的构造函数参数,从而得到一个 Messenger 对象,然后在 onBind() 中返回这个 Messenger 对象底层对应的 Binder 即可

2.客户端进程

绑定服务端的 Service,绑定成功后用服务端返回的 IBinder 对象创建一个 Messenger 对象,通过该 Messenger 对象即可调用服务端的 send() 方法发送消息到服务端

Messenger 的工作原理:
Messenger 代码执行逻辑
Messenger 工作原理
Messenger 的工作流程:
Messenger 工作流程

三、Messenger 总结

1.Messenger 使用方式简单,因为其对 AIDL 做了封装,所以不用我们手动去定义并创建 AIDL 接口文件
2.Messenger 一次处理一个请求,在服务端不用考虑线程同步的问题,服务端中不存在并发的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值