了解 Messenger

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21586317/article/details/82121327

一、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();
}

// 关键三:通过 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 总结

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

猜你喜欢

转载自blog.csdn.net/qq_21586317/article/details/82121327