美文网首页
IPC(七)--Messenger源码分析

IPC(七)--Messenger源码分析

作者: azu_test | 来源:发表于2019-02-21 17:02 被阅读0次

移步Android跨进程通信IPC

简介

Messenger的底层实现是AIDL,所以一些AIDL相关的内容此处不再赘述。

代码分析

1. Messenger内主要代码分析
public final class Messenger implements Parcelable {
    //持有IMessenger对象,可能是IMessenger#Stub,也可能是IMessenger#Proxy
    private final IMessenger mTarget;
    //构造方法,根据Handler内持有的IMessenger#Stub构造
    public Messenger(Handler target) {
        mTarget = target.getIMessenger();
    }
    ////构造方法,根据Binder,此时会根据不同情况产生Proxy或者Stub
    public Messenger(IBinder target) {
        mTarget = IMessenger.Stub.asInterface(target);
    }
    //发送消息
    public void send(Message message) throws RemoteException {
        mTarget.send(message);
    }
    //获取Binder对象
    public IBinder getBinder() {
        return mTarget.asBinder();
    }
    ...
}
  1. 由上面代码可知,Messenger就是对IMessenger的一层简单封装,里面持有的IMessenger对象在服务端内是IMessenger#Stub对象。
    根据AIDL内的AIDL.Stub.asInterface()的分析可知
  2. 如果客户端个服务端不在一个进程内,则客户端内的Messenger. IMessenger为IMessenger#Proxy对象
  3. 如果客户端个服务端在一个进程内,则客户端内的Messenger. IMessenger为IMessenger#Stub对象
2. Handler内Messenger的相关代码
    IMessenger mMessenger;
    //在Messenger的构造方法内使用
    final IMessenger getIMessenger() {
        synchronized (mQueue) {
            if (mMessenger != null) {
                return mMessenger;
            }
            //实例化一个IMessenger#Stub对象,并实现send()方法
            mMessenger = new MessengerImpl();
            return mMessenger;
        }
    }

获取Handler内的IMessenger #Stub对象,如不存在则创建一个

    //对IMessenger.Stub的实现,并实现了send对象,通过Handler本身作为消息发送处理
    private final class MessengerImpl extends IMessenger.Stub {
        public void send(Message msg) {
            msg.sendingUid = Binder.getCallingUid();
            Handler.this.sendMessage(msg);
        }
    }

实现了send对象,把客户端发送过来的Message通过Handler本身作为消息发送处理,进而服务端可以接收并处理,由此可知Messenger为串行通信,所以不能很好的处理高并发的情形。

执行流程

Messenger和AIDL的原理是基本是完全一致的。
服务端的不同点在于实现方式和方法处理代码分析中也做了分析。
客户端的不同点仅仅是将获取IMessenger的aidl对象封装在了Messenger中。

相关文章

  • IPC(七)--Messenger源码分析

    移步Android跨进程通信IPC 简介 Messenger的底层实现是AIDL,所以一些AIDL相关的内容此处不...

  • IPC—Messenger

    1.Messenger进程间通信时,bundle有Parcelable对象解析数据的时候,需要调用bundle.s...

  • Android IPC 通信之 Messenger

    说到 IPC 除了我们之前讲的 AIDL ,经常被提及的还有 Messenger ,Messenger 底层是通过...

  • Binder学习(四)利用AIDL、Messenger实现IPC

    Binder学习(四)利用AIDL、Messenger实现IPC 概述 在利用Binder进行IPC的时候,会经常...

  • Android进程间通信--Messenger

    4.3 使用 Messenger 实现进程间通信 Messenger 是一种轻量级的IPC通信机制.底层使用的是A...

  • IPC之Messenger

    今天我们来聊一聊Android中另外一种IPC机制-Messenger,可以理解成信使,通过它可以在不同的进程中传...

  • IPC之Messenger

    参考Android开发艺术探索 Messenger Messenger:信使,通过它可以不同进程中传递Messag...

  • Binder AIDL proxy stub

    Binder与AIDL?Android中有多种IPC机制,如AIDL,Messenger,Socket,Conte...

  • Android跨进程通信IPC之22--Messenger

    移步系列Android跨进程通信IPC系列 1 概述 Messenger是一种轻量级的IPC方案,其底层实现原理就...

  • IPC机制

    Android中IPC方式 1.bundle2.文件共享3.Messenger4.AIDL5.ContentPro...

网友评论

      本文标题:IPC(七)--Messenger源码分析

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