文档章节

Android中的信使Messenger的源码解析

Kobe_Gong_5
 Kobe_Gong_5
发布于 2015/06/20 00:45
字数 253
阅读 11
收藏 0

通过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。

© 著作权归作者所有

共有 人打赏支持
Kobe_Gong_5
粉丝 2
博文 55
码字总数 43587
作品 0
成都
私信 提问
Android进程间通信之使用Messenger

Messenger,信使,可使用它进行进程间的通信,而Messenger对Service的请求采用队列的方式,因此它不支持多线程通信。 看看官方文档对于Messenger的解释: Reference to a Handler, which othe...

小近
2014/11/14
247
0
Android Messenger 跨进程通信

如果你需要在不同进程间通信,你可以在Service中使用Messenger来实现进程中通信。 如果使用这种方式,Service中需要定义一个Handler对象(负责对客户端发送过来的Message进行响应)。 Messenge...

一寨之主
2014/09/01
0
0
Android Messenger 跨进程通信(转载)

Messenger:信使 官方文档解释:它引用了一个Handler对象,以便others能够向它发送消息(使用mMessenger.send(Message msg)方法)。该类允许跨进程间基于Message的通信(即两个进程间可以通过Mes...

stefanliao
2012/11/26
0
0
Android 绑定类型服务---创建绑定类型的服务

创建具有绑定能力的服务时,必须提供一个IBinder对象,它用于给客户端提供与服务端进行交互的编程接口。有三种方法能够定义这个接口: 1. 继承Binder类 如果你的服务是你的应用程序的私有服务...

长平狐
2012/10/16
27
0
Messenger(信使(跨应用传递对象(数据)))的简单使用

首先有2个应用1个服务端(接收数据)1个客户端(发送数据) 服务端步骤: 1、创建一个服务继承Service 代码 public class MyMessengerService extends Service { //1、接收其他应用发送过来的消息...

初来小修
2016/02/21
132
0

没有更多内容

加载失败,请刷新页面

加载更多

eggjs与sequelize简单demo

参考 egg 官方文档 安装 // 依赖npm install --save egg-sequelize mysql2// ts 类型npm install --save @types/sequelize 插件,config/plugin.ts import { EggPlugin } from 'egg';......

Geeyu
29分钟前
0
0
看过上百部片子的这个人教你视频标签算法解析

本文由云+社区发表 随着内容时代的来临,多媒体信息,特别是视频信息的分析和理解需求,如图像分类、图像打标签、视频处理等等,变得越发迫切。目前图像分类已经发展了多年,在一定条件下已经...

腾讯云加社区
43分钟前
2
0
2. 红黑树

定义:红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树(Binary Search Tree)。 要理解红黑树,先要了解什么是二叉查找树。在上一章中,我们学习了什么是二叉树,以及二叉树...

火拳-艾斯
45分钟前
2
0
input的button类型,点击页面跳转

一、input type=button 不做任何操作 例如: <input type="button" class="btn btn-primary" style="width: 30%" value="返回" onclick="window.location.href='/users/list'"></input> onc......

Sunki
51分钟前
1
0
踩坑:js 小数运算出现精度问题

背景 在学习小程序商城源码时发现了这个问题,单价可能出现小数,小数之间运算结果会莫名其妙多出一大串数字,比如下面这样👇。 在此之前我是知道 js 中著名的 0.1 + 0.2 != 0.3 的问题的,...

dkvirus
56分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部