Messenger源码解析

标签: AIDL Messenger
19人阅读 评论(0) 收藏 举报
分类:
简述:Messenger是一种轻量级的IPC方案,它的底层实现是AIDl,也就是说它是系统对AIDL的一个简单封装方便Android开
发人员进行进程间通信,它一次只能处理一个请求,因此在服务端不用考虑线程同步问题,因为在服务端不存在并发执行的情况。

接下来进入正题开始源码解析

构造函数
Messenger 存在两个构造函数 分别是

    //1. 传递处理请求的Handler
    public Messenger(Handler target) {
        mTarget = target.getIMessenger();
    }
    //2.这个不常用,如果感兴趣可以研究下,这里就不再做重点介绍
    public Messenger(IBinder target) {
        mTarget = IMessenger.Stub.asInterface(target);
    }

我们在使用进程间通讯的时候需要在服务端创建一个Service,并且在其中持有一个Messenger的实例,就是通过这个Messenger来向客户端发送消息,看简单实现:

public class MyService extends Service {

    private static Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };

    private Messenger messenger = new Messenger(mHandler);
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {

        return messenger.getBinder();
    }
}

发送消息

   public void send(Message message) throws RemoteException {
        mTarget.send(message);
    }

可以看到Messager实际上就是一个代理类,真正的实际操作者是mTarget(IMessenger的一个实例)。

看看mTarget是怎么实例化的

//在Handler类中有一个final方法,可以看到我们的mTarget就是通过这个方法实例化的
    final IMessenger getIMessenger() {
        synchronized (mQueue) {
            if (mMessenger != null) {
                return mMessenger;
            }
            mMessenger = new MessengerImpl();
            return mMessenger;
        }
    }

看看MessengerImpl是个什么

    //是Handler的一个内部类,看到这里是不是想起了AIDL
    private final class MessengerImpl extends IMessenger.Stub {
        public void send(Message msg) {
            msg.sendingUid = Binder.getCallingUid();
            Handler.this.sendMessage(msg);
        }
    }

源码附录:

IMessenger.aidl 源码


/* //device/java/android/android/app/IActivityPendingResult.aidl
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
package android.os;
import android.os.Message;
/** @hide */
oneway interface IMessenger {
    void send(in Message msg);
}
查看评论

EventBus源码的简单解析

-
  • 1970年01月01日 08:00

Android进阶笔记:Messenger源码详解

Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析。相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个...
  • jelly_fang
  • jelly_fang
  • 2016-01-19 22:00:09
  • 540

Messenger解析(和Handler、IBinder、Message的关系)

为了更好的理解bound service利用Messenger来夸进程服务,这里先写一篇文章简单分析下Messenger、Handler、Message、Binder的关系。 先来看看Messe...
  • huangjijie123456
  • huangjijie123456
  • 2015-10-11 17:15:06
  • 1880

飞鸽传书 (IP Messenger) Ver2.04源码[评价可免费]

  • 2009年08月25日 10:05
  • 166KB
  • 下载

最新Telegram.Messenger源代码

  • 2017年03月13日 10:25
  • 23.88MB
  • 下载

深入剖析Android四大组件(四)——Messenger实现Android IPC

当Service不需要支持并发操作时Messenger会非常有用。Messenger类使用Handler执行每个传入的消息,所有客户端的调用都按顺序运行在同一个线程上,这和AIDL是有区别的,AIDL...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2015-05-16 18:56:08
  • 1949

Android中的Messenger的原理及基本用法

Android中的Messenger的原理及基本用法
  • Gaugamela
  • Gaugamela
  • 2017-03-16 14:43:23
  • 1747

使用Messenger

一、Messenger是android中一种轻量级的IPC方案,它的底层实现同aidl一样。 我们先来了解一下Messenger这个类,首先看一下Messenger的构造方法,它的主要有2个构造方法...
  • a992036795
  • a992036795
  • 2016-06-06 10:55:35
  • 1331

AIDL与Binder与Messenger的使用区别!

a.只有当你需要来自不同应用的客户端通过IPC(进程间通信)通信来访问你的服务时,并且想在服务里处理多线程的业务,这时就需要使用AIDL。 b.如果你不需要同时对几个应用进程IPC操作,你最好通...
  • luojiusan520
  • luojiusan520
  • 2016-03-10 00:05:07
  • 1888

Android Messenger使用

  • 2017年09月26日 23:03
  • 26.99MB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 643
    排名: 7万+
    最新评论