Messenger夸进程通信的原理

使用Messenger实现跨进程通信(IPC) 代码中包含两个应用程序,两者之间通信采用Messenger信使 使用方法:将下载下来的图片后缀名改为.zip,再解压即可得到源代码 立即下载

Messenger构造方法

  • Messager(Handler target)

    public Messenger(Handler target) {
        mTarget = target.getIMessenger();
    }
    
    final IMessenger getIMessenger() {
        synchronized (mQueue) {
            if (mMessenger != null) {
                return mMessenger;
            }
            mMessenger = new MessengerImpl();
            return mMessenger;
        }
    }
    
    // MessengerImpl就是一个IBinder对象
    private final class MessengerImpl extends IMessenger.Stub {}
    

    一方面是用于处理消息,另一方面是为了Messager保存当前的进程IBinder对象,以便在其他进程发送消息到当前进程中处理

  • Messager(IBinder target)

    public Messenger(IBinder target) {
        mTarget = IMessenger.Stub.asInterface(target);
    }
    

    让Messager保存指定的进程IBinder对象,以便后面用来发送消息到指定的进程处理

用法

  • 服务进程中创建一个Messenger(Handler),并且当前的Messenger内部已经绑定了当前进程的IBinder对象IMessenger.Stub即MessengerImpl,然后可以通过Service.onBind()方法将服务进程绑定的IBinder对象传出去,供客户端调用,在Messenger.Handler中,通过message.replyTo拿到客户端的Messenger,然后进行Messenger.send(Message),这就完成了服务端向客户端的通信
    // 服务端进程
    class ServerService extends Service{
    	// 创建服务进程的Messenger,并绑定服务进程的IBinder对象
    	private Messenger messenger = new Messenger(new Handler(){
    		@Override
    		public void handleMessage(Message msg){
    			switch(msg.what){
    				case 1:
    					String name = msg.getData().getString("name");
    					Log.d("tag","收到客户端进程的消息name:"+name);
    
    					Message message = Message.obtain();
    					message.what = 2;
    					Bundle bundle=new Bundle();
                   	    bundle.putString("name","hhh");
                    	message.setData(bundle);
    					
    					try{
    						//向客户端发消息
    						//replyTo其实指向的就是客户端的Messenger
    						msg.replyTo.send(message);
    					}cache(Exception e){
    						
    					}
    		}
    	};
    	
    	@Override
    	public IBinder onBind(){
    		// 返回服务进程的IBinder对象,给客户端进程使用
    		return messenger.getIBinder();
    	}
    }
    
  • 客户端进程中通过bindService去绑定服务,拿到服务端提供的IBinder对象,然后创建一个Messenger(IBinder),此时这个Messenger已经绑定了服务进程的IBinder对象,这样,通过该Messenger.send(Message)都会到服务进程的MessengerImpl.send(Message)中执行,然后将message发送到Messenger中的handler处理,这就完成了客户端像服务端通信的过程
    private Messenger messenger;
    bindService(intent, new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        	// 创建一个messenger,并绑定有服务进程IBinder的对象,
        	// 用户向服务端发消息
            messenger=new Messenger(iBinder);
            Message message=new Message();
            message.what=1;
            Bundle bundle=new Bundle();
            bundle.putString("name","花花");
            message.setData(bundle);
            // 将客户端进程的Messenger绑定到message中,
            // 供在服务进程中拿到客户端进程的Messenger用于通信处理
            message.replyTo=mMessengerHandler;
            try {
            	// 像服务端发送消息
                messenger.send(message);
            } catch (RemoteException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
    
        }
    },Service.BIND_AUTO_CREATE);
    
    private Messenger mMessengerHandler = new Messenger(new Handler(){
    		@Override
    		public void handleMessage(Message msg){
    			switch(msg.what){
    				case 1:
    					String name = msg.getData.getString("name");
    					Log.d("tag","收到来自服务进程的消息name:"+name);
    			}
    		}
    	}
    };
    
    // 客户端就可以拿到这个绑定了服务进程的messenger,去不断的与服务端通信
    

总结

  • Messenger跨进程通信,底层实际上就是通过Binder机制
  • 由于处理消息是使用的是Handler,所以一次只能处理一条信息
livox avia平台搭建 livox雷达数据采集平台搭建 阅读详情

相关推荐

python课程教学大纲-《Python语言基础》课程教学大纲

《Python语言基础》课程教学大纲课程名称:Python语言基础课程类别:专业选修课适用专业:电子信息工程考核方式:考查总学时、学分:32学时1.5学分其中讲授16学时,实验10学时,其他6学时一、课程性质、教学目标使学生在全面了解Python技术历史、现状与发展趋势的基础上,系统掌握Python基本概念、编程思想以及程序设计技术,具备熟练的Python编程技能和面向对象软件设计技术思想,完成本...

weixin_37988176的博客 3720

跨进程通信之Messenger

Android中使用跨进程通信有比较多的方式,Messenger是一种相较于AIDL的更轻量级的跨进程通信方式(其底层实际使用的也是AIDL的形式),这里简单介绍下他的使用方法。Messenger中持有一个Handler的对象,其实现跨进程的方式也是通过Handler消息机制,在handleMessage方法中获取消息,来实现相应的处理。至此,就可以简单实现一个使用Messenger的跨进程通信。

weixin_43757005的博客 486

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7761

使用 Messenger 跨进程通信

使用 Messenger 跨进程通信的范例代码。

川峰的博客 637

TMC步进电机驱动stealthChop

经过九九八十一难,芯片手册拜读了好多遍,找了好多资料,问了好多人使用TMC2660驱动步进电机终于成功了。最后的问题居然是硬件把管脚画错了,然后我又没有检查,哭。。。

那可真是太开心了的博客 4489

图解目标检测 之 YOLO 算法 最全原理详解

YOLO 一.背景 YOLO(You Only Look Once: Unified, Real-Time Object Detection),是Joseph Redmon和Ali Farhadi等人于2015年提出的基于单个神经网络的目标检测系统。在2017年CVPR上,Joseph Redmon和Ali Farhadi又发表的YOLO 2,进一步提高了检测的精度和速度。 二.YOLO算法的网...

DFCED的博客 26万+

Android 使用Messenger实现跨进程之间通信

1. MessengerMessenger可以理解为信使,顾名思义我们可以利用信使来传递信息(Message),没错利用Messenger来实现跨进程之间的通信就是传递Message对象,我们只需要做的是把数据放进去Message,然后使用Messenger的send方法将数据发送出去,像发送邮件一样。2. 实现一个Messenger的主要步骤: 既然说到是跨进程之间的通信,那么

佳威威的专栏 3352

YOLOV12融合MSDA多尺度空洞注意力:突破尺度限制的科研实践指南

MSDA通过多尺度空洞注意力的设计,为YOLOV12突破尺度检测瓶颈提供了有效方案。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决实际问题”的具体实践。如果你在实验中发现某类尺度目标的检测仍有不足,可以尝试结合数据增强(如随机缩放、多尺度训练)来强化模型对尺度变化的鲁棒性。科研的价值在于不断解决真实难题,希望这份指南能真正帮你在目标检测的尺度感知领域找到新的突破点,祝你在科研探索中持续收获新的见解与成果。

FJN110的博客 241

Android Messenger(跨进程)

1.Messager 我们知道,Service通过IBinder可以实现同一应用内同一进程的通信,而不同进程间的通信,最简单的方式就是使用Messenger服务提供通信接口。利用Messager,我们无需使用AIDL便可执行进程间通信 (IPC)。 首先看一下Messager的定义:允许实现基于消息的进程间通信的方式。 以下是Messenger使用的主要步骤: ①服务Service实现一个Handler,由其接收来自客户端的每个调用的回调; ②Handler用于创建Messenger对象(对Handler的

zenmela2011的专栏 3572

从0入门LocoTrack:6倍加速的SLAM追踪新范式实战指南

传统点追踪方法(如CorrTracker、TAPIR)在处理大规模场景或实时任务时,要么精度不足,要么速度太慢。而LocoTrack通过“局部4D相关性”和“Transformer全局关联”的创新设计,实现了精度与速度的双重突破速度:比现有SOTA方法快6倍,吞吐量高达数万点/秒;精度:在Kinetics、DAVIS等数据集上,定位误差显著低于传统方法;鲁棒性:能应对低纹理、动态场景等复杂环境,这是传统方法的“噩梦场景”。

m0_71589036的博客 95

【报错解决】OpenClaw 报错 FetchError: request to [https://registry.npmjs.org/](https://registry.npmjs.or

在国产基础软件与云原生生态逐步成熟的背景下,越来越多的开发者开始尝试将 Web 前端、AI 推理、系统服务等组件部署到国产操作系统与国产云环境中。我所在的项目正是这样一个场景: 我们基于 OpenClaw 构建一套云端 AI 管理平台,用于统一管理模型服务、前端控制台与后台 API。

博客 1753

Android进程通信机制终极指南:Binder、AIDL、Messenger深度对比分析

在Android开发中,进程通信机制是构建复杂应用架构的核心技术。本文通过Awesome-Android-Interview项目中的专业资料,为你深度解析Binder、AIDL、Messenger这三种核心IPC方式的原理、性能差异和实际应用场景。 ## 📊 Android进程通信方式全景图 Android平台提供了多种进程间通信方式,每种方式都有其独特的优势和适用场景: [![Andro

gitblog_01193的博客 478

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

进程通信---Messenger

一.Messager介绍 Messager,故名思义信使的意思,能够完成跨进程通信。和Service结合使用(服务器端是个service,得在Manifest文件中注册哦) Messenger与Handler类似,可以用它来发送和处理消息,其底层的实现是对Binder,对ALDl的一个简单封装。(Messenger是对AIDL的封装,AIDL又是基于Binder机制实现的) 使用起来也比较简洁,在一个线程中通过指定一个Handler来创建Messenger,并把它传递给另一个进程,这样两个进程之间就可以通过

weixin_50005657的博客 643

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android进程通信(IPC)之Messenger

IPC-Messenger

chrislanbo的专栏 1036

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

橡果生长记的博客 4842

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Kotlin进程通信------Messenger

进程通信原理与Binder底层说明,可参考:https://zhuanlan.zhihu.com/p/35519585 本文主要介绍应用层上如何用Kotlin来使用Messenger进行进程通讯。 Messenger是对底层Binder进行封装后的一套系统框架,在进程间通讯的表现是串行通讯。假设有进程A和进程B。如果要进行多次数据通讯,会是A-B-A-B-......这样的模式。 Messenger的做法,简要说明就是:两个进程A(client)、B(service),A将一个Messenger信息发

双斧狂暴战专栏 689

Messenger进程间通信及其原理

前言之前分析Android消息机制的源码时,曾遇到过replyTo、IMessenger等属性字段,当时只是说这些字段用于进程间通信,并未作深入分析。今天这篇文字就来演示一下使用Messenger如何进行进程间通信并分析其源码实现。Messenger进程间通信的流程Messenger顾名思义,即信使,那么它的作用就是满足不同进程两边的通信需要了。通常我们会写AIDL来实现进程间通信,其实简单的IPC

Battling against our own ignorance 1406

Android 进阶10:进程通信之 Messenger 使用与解析

读完本文你将了解: Messenger 简介 Messenger 的使用 服务端 客户端 运行效果 使用小结 总结 代码地址 Thanks前面我们介绍了 AIDL 的使用与原理,这篇文章来介绍下 Android 中另一种 IPC 方式:Messenger。Messenger 简介Messenger “信使”,顾名思义,它的作用就是传递信息。Messenger 有两个构造函数: 以 Handler 为

张拭心的博客 shixinzhang 2万+

Android Service--通信方式(IBinder回调、Messenger)

Activity与Service的通信,分两大类,同一个进程中、不同的进程中。 同一个进程中 可以通过直接实现IBinder接口,或者继承Binder类。Binder类是系统提供的一个IBinder接口的实现类。 Service中: public class MyBind extends Binder { public MyService getService() { ...

android_hl的博客 3408

Android使用Messenger实现进程间双向通信

在了解本文即将学到的技能外,有些知识还是有必要提前知道的,这样才会更容易理解本文即将讲到的知识点。需要提前预热的知识点: 1、Android四大组件之一Service,要知道怎样去写一个Service,Service有哪两种启动方式; 2、Android Service启动方式之Bound Service; 3、Android基础知识之Messenger; 掌握了这三个知识点,就可以快速入

生活不只眼前的苟且,还有诗和远方的田野。 3577

messenger简单说明

messenger(信使) :即送信者 messenger通信即通过信使在不同进程中通信 现简单说明(采用1对1通信对于多对多建议使用aidl,messenger具有延时性): 客户端 与服务端 1对1中信使有2个 clientMessenger 与serviceMessenger 在android中一般都是通过服务来使2个不同的进程通信 当客户端绑定远程服务端时此时会...

baibaibaixiaochun的博客 832

进程通信之 Messenger 使用与解析

Messenger 简介 Messenger “信使”,顾名思义,它的作用就是传递信息。 Messenger 有两个构造函数: 以 Handler 为参数 以 Binder 为参数 private final IMessenger mTarget; public Messenger(Handler target) { mTarget = target.getIMessenger(...

android开发笔记 522

Android学习- 进程间通信之Messenger

作者: 桂志宏 进程和线程 在操作系统课程中,进程和线程是两个非常重要的概念。为此,在讨论Android进程间通信前,我们先简单回忆一下进程和线程的概念。 进程: 简单来说,进程是指正在运行的程序实体。它是一个活动实体,不是指存储在磁盘上的程序代码,例如当你在磁盘上安装了“愤怒的小鸟”游戏,当你双击启动游戏时就开启了一个进程。 此外,进程不仅仅指代码,还包括程序运行需要的堆栈段和数据段...

u014595623的博客 466

Android-跨进程通信之Messenger

熟悉Android的开发人员应该都知道,实现不同进程之间通信的方法有5种: 1.通过Bundle/Intent传递数据; 2.通过aidl; 3.通过Messenger; 4.通过ContentProvider; 5.通过socket。 其中1,2,3,4的本质都是通过binder机制来实现的,5是通过网络套接字。 这里主要介绍下第三种方法,通过Messenger实现进程通信。 一. Messen...

songqinging的博客 488

Android进程间通信(3)-Messenger实现

前面两篇文章中已经介绍了两种实现进程间通信的方式,那是不是只有这两种方式实现进程间通信呢?当然不是,还有更好的实现方式,那就是Messenger。本篇文章将带领大家一起来学习下Messenger.

wms199311275319的专栏 454
上一篇: OkHttp源码流程简单分析
下一篇: 从源码上分析SharedPreferences的commit和apply的区别
1024Code
博客等级 码龄9年 122粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值