Messenger轻量级IPC方案

Android-Messenger浅析 Messenger(信使)是进程间通信(IPC)的一种方式,是一种轻量级的IPC方案,底层是AIDL,一次只能处理一个请求,不用考虑线程同步,服务端也不存在并发情形。 理解Messenger可以从服务端和客户端来看 1、创建服务端 Handler(处理消息message); Messenger(接受和发送消息); Messenger将客户端发来的消息message传递给Hanlder处理... 阅读详情

概述

什么是messenger

Messenger可以翻译为信使,通过它可以在不同的进程中传递Messenger对象,在Message中放入我们要传递的数据,可以轻松实现数据的跨进程传递。Messenger是一种轻量级的IPC方案,底层实现了AIDL。

什么是基于消息的进程间通信

如下图所示 

可以看到,我们可以在客户端发送一个Message给服务端,服务端在handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再奖结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。

优势

  • 基于Message,这个熟悉
  • 支持回调的方式,也就是服务端处理完成长任务可以和客户端交互
  • 不需要编写AIDL文件
    此外还支持,记录客户端的Messenger,然后可以实现一对多的通信;甚至作为一个转接处,做生意两个进程都能通过服务端进行通信。

通信实例

Service端

public class MessengerService extends Service {

    private static final String TAG = "MessengerService";

    private static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 9527:
                    Log.d(TAG, "receive msg from Client: " + msg.getData().getString("msg"));
                    break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    }

    private final Messenger mMessenger = new Messenger(new MessengerHandler());

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }
}

Activity客户端

public class MessengerActivity extends AppCompatActivity {

    private static final String TAG = "MessengerActivity";

    private Messenger mService;
    private ServiceConnection mServiceConnection= new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = new Messenger(service);
            Message msg = Message.obtain(null,9527);
            Bundle bundle = new Bundle();
            bundle.putString("msg","hello, man,this is Client!");
            msg.setData(bundle);
            try {
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_messenger);
        Intent intent = new Intent(this, MessengerService.class);
        bindService(intent,mServiceConnection,BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        unbindService(mServiceConnection);
        super.onDestroy();
    }

清单文件中,设置

<service android:name=".Messenger.MessengerService" android:process=":remote"/>

运行应用,看一下log,

04-03 15:34:42.408 16418-16418/? D/MessengerService: receive msg from Client: hello, man,this is Client!

通过上面的例子可以看出,在Messenger中进行数据传递必须将数据放入Message中,而Messenger和Message都实现了Parclabe接口,因此可以跨进程传输。简单来说,Message来传输,Message中能使用的载体只有what,agri,arg2,Bundle以及replyTo(这个很重要,过下要讲到)。在Message中另一个字段object在Android2.2以及,object字段不支持跨进程传输,不过2.2以后,也仅仅提供了实现了Parclabe接口的对象进行传输。

所幸我们还有Bundle,Bundel可以支持大量的数据类型。

互相通信

上面的例子实现了服务端接收到客户端的消息,但是我们有时候还需要回应。

服务端修改

private static class MessengerHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case 9527:
                Log.d(TAG, "receive msg from Client: " + msg.getData().getString("msg"));
                Messenger client = msg.replyTo;
                Message replyMessage = Message.obtain(null,9528);
                Bundle bundle = new Bundle();
                bundle.putString("reply","hi!this is Service!");
                replyMessage.setData(bundle);
                try {
                    client.send(replyMessage);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            default:
                super.handleMessage(msg);
                break;
        }
    }
}

客户端修改

private Messenger mReplyMessenger = new Messenger(new MessengerHandler());

private static  class MessengerHandler extends Handler{
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
            case 9528:
                Log.d(TAG, "handleMessage: "+msg.getData().getString("reply"));
                break;
            default:
        super.handleMessage(msg);
                break;
        }

    }
}
private Messenger mService;
private ServiceConnection mServiceConnection= new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mService = new Messenger(service);
        Message msg = Message.obtain(null,9527);
        Bundle bundle = new Bundle();
        bundle.putString("msg","hello, man,this is Client!");
        msg.setData(bundle);

        //一定要加这句
        msg.replyTo = mReplyMessenger;
        try {
            mService.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

可以通过日志看到相互通信成功

04-03 15:54:44.839 2733-2733/com.apkcore.aidltest:remote D/MessengerService: receive msg from Client: hello, man,this is Client!

04-03 15:54:44.872 2698-2698/com.apkcore.aidltest D/MessengerActivity: handleMessage: hi!this is Service!

缺点

Messenger是以串行的方式处理客户端发来的ii他呵呵,如果有大量的消息同时发送到服务端,服务端仍然只能一个一个的处理,如果有大量的并发请求,那么用Messenger就不太合适。同时Messenger的作用主要是传递消息,很多时候我们可以需要跨进程调用服务端的方法,这种情况下用Messenger就无法做到,这个时候我们就要使用AIDL。
也欢迎大家关注我的简书、优快云和github主页

1 君正IPC芯片方案介绍 君正在智能视频市场已经耕耘有一段时间了,取得了相当大的成绩。君正的芯片采用mips架构,功耗更低,性价比更高。IPC芯片是用于视频类产品中的主控类芯片,包括CPU、ISP、VPU和其他外围模块,目前有T31、T40、T41等型号。 阅读详情

相关推荐

雄迈方案ipc复位工具软件

雄迈方案的ipc网络摄像机如果忘记了密码。不能登录了。很麻烦。这个软件可以解决这个问题。打开软件后。输入摄像机ip地址。然后点击复位。摄像机复位成功就会重启。然后重新搜索添加摄像机。

IPC轻量级实现——AIDL

我们从三个方面来对AIDL进行了解: 1)介绍 2)定义 3)实例 一 介绍 AIDI(Android接口定义语言),它是Android中用来解决进程间通信的一个桥梁,它的内部实现是binder,是IPC机制的一种轻量级的实现,在Android中提供了自动创建stub的工具。 二 定义 AIDL从它的名字就可以知道,它是一个接口类型的文件,但是它与java中定义的接口

qq_22218005的博客 1148

IPC各个厂家方案对比文档

IPC

核间通信(IPC)的两种解决方案

共享内存在核间通信方案中,一个核可以将数据写入共享内存,Mailbox可以将内存指针传递到另一个核上,另一个核可以拿到内存指针后,直接从Share Memory读取数据,这一个过程不需要经过数据的拷贝,因此,非常高效,适合大数据量的传输。同时,同一种类型的多个核心又可以运行在不同的模式,比如A72可以运行的SMP模式,双核R5F可以运行在Lockstep或Split Mode上,因此,核间通信方案要充分利用硬件提供的机制,实现高效的核间通信,从而充分发挥Soc的整体性能。这就是Mailbox的工作方式。

lyd0813的博客 2万+

DM365 IPC完整方案

此资料包含完整的DM365的全部资料,可以在此基础上开发出自己特色的IP Camera

YOLOv8环境搭建+训练自己的数据详细项目

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt。首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt。然后安装ultralytics ,这是必须的。

m0_63172128的博客 2万+

IPC机制

一、概念 1. ipc (Inter-Process Communication,进程间通信); 2. 线程 CPU调度的最小单元,线程是一种有限的系统资源; 3. 进程 一个执行单元 ,一个进程可以包含多个线程。 二、android 中的多进程模式 1. 通过给四大组件指定 android:process属性,就可以开启多进程模

zhenqiangzhang的博客 940

STM32独立实现CANOpen主机功能:从零构建轻量级控制方案

本文详细介绍了如何在STM32上不依赖CanFestival库,从零构建一个轻量级的CANOpen主机方案。文章深入剖析了CANOpen主机的三大核心功能——NMT网络管理、SDO参数配置与PDO过程数据交换,并提供了从硬件准备、驱动层构建到协议实现的完整代码实战。该方案代码精简,资源占用低,特别适合在资源受限的STM32平台上实现工业控制、电机驱动等场景的稳定通信。

potato的博客 1072

IPC技术选型指南与实战

IPC技术选型指南与实战口诀

2401_85199775的博客 1128

Python的WNTR库---基于供水网络

WNTR使用小结(一) 本人最近主要再做设施网络的内容,主要聚焦供水管网(water distribution network,WDN),在做实验中主要用的包为WNTR,下载连接: 链接: WNTR.最好安装最新版本 如果有做这方面研究的小伙伴们需要测试数据可以直接从WNTR实例数据中下载,其中提供了四种规模大小的管网,格式为.inp,可以搭配Epanet使用。如果需要更多示例数据可私信我! 以下内容全部为本人自己探索的小心得,希望能给你带来一点点帮助,如果不够详尽可以自行参阅官方文档:链接: 官方文档.

pushhy的博客 4934

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2196

Android Messenger使用及分析

Messenger是基于AIDL实现的轻量级IPC方案。 1.使用 1.1服务端 接受信息的服务端需要实现一个Handler用于处理到的信息 private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { ...

厚积薄发,持之以恒 6123

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 421

Android 进程间通信:Messenger

1.概述 项目中常用到的进程间通信更多是用AIDL,在前阵子复习的时候才了解还有 Messenger 这种方法。既然要学习就记录下,以后要用的时候才能快速的掌握。 Messenger 是一种轻量级的IPC方案,它的底层实现是AIDL,可以在不同进程中传递 Message 对象,它一次只处理一个请求,在服务端不需要考虑线程同步的问题,服务端不存在并发执行的情况。 2. Messenger的构造...

接受自己的普通,然后拼尽全力去与众不同 3729

PCL点云库入门(第6讲)——PCL库中Eigen数学工具库的基本使用(持续更新)

Eigen库是一个高性能的C++模板库,专注于线性代数、矩阵和向量运算,以及相关的数值分析和算法。在Eigen库中,所有的矩阵和向量均被视为矩阵模板类的实例。向量可以被看作是特殊形式的矩阵,具体表现为只包含1行或1列。

qq_36812406的博客 1752

Qt —— 调用海康C++版SDK获取摄像头每帧图像,通过OpenCv处理每帧图像后显示在Qt窗口(附:源码)

  关注 笔者 - jxd 微信公众号搜索 “码农总动员” 或 微信扫描下方二维码,了解更多你不知道的XX,O(∩_∩)O

5447

IPC通信之Messenger用法详解

IPC通信中,有一个关于Messenger的,前几天用了一下,下面给总结一下使用心得及具体用法。 首先,Messenger底层是基于AIDL封装的一个轻量级的IPC方案; 其次,Messenger的用法基于Handler,从安全性能上来说,它是线程安全的; 针对于处理高并发的问题,可能它就不适用了,这里可以参考Messenger的源码,它支持一次处理一个请求,这个时候不用考虑线程同步,同时也...

Adversity reveals genius; fortune conceals it. 922

WordPress插件depicter存在SQL注入漏洞(CVE-2025-2011)

Depicter 是一款功能强大的 WordPress 幻灯片插件,允许用户通过直观的拖放编辑器轻松创建响应式滑块、轮播和动态内容展示。该插件提供丰富的模板库、动画效果和图层控制,支持多媒体内容嵌入(如图片、视频、HTML),并优化了移动端显示和SEO性能。其无代码操作界面适合非技术用户,同时提供高级自定义选项,适用于产品展示、营销推广和视觉叙事等多种场景,是提升网站视觉吸引力的高效工具。

m0_50125527的博客 551

android ipc 多个客户端,Android上最简单的IPC方案——Messenger

每个系统都会有相应的 IPC 机制以方便开发者来进行进程间通讯,那么首先我们来梳理一下 Android 中的 IPC 机制有哪些:组件间使用 Intent 传递数据;文件共享;Messenger;AIDL;ContentProvider;Socket;这6种方式各有各的优缺点和适用场景,在开发过程中最合适当前需求的才是最好的。至于它们各自适用场景此处就不详述了。今天主要来讲一讲这几种机制中,功能强...

weixin_39989973的博客 221

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android中IPC机制之Messenger

前言 Messenger翻译为“信使”,顾名思义,可以在不同进程中传递Message对象。Messenger是一种轻量级IPC方案,底层实现也是AIDL,只是对AIDL做了封装。Messenger的使用相对于AIDL方便多,因为Messenger是Android系统中自带的类,服务端和客户端都不用创建AIDL文件。Messenger会持有一个Handler,这个Handler用于处理接受到的信息...

qq_28898075的博客 226

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android中的IPC方式-Messenger --转载自肖老师博客160303

原文地址:http://blog.youkuaiyun.com/xll712/article/details/50800698 IPC简介IPC,即Inter-Process Communication进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。 android中的IPC...

chulongzong9355的博客 147

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

binder通信之Messenger介绍

Messenger是什么?Messenger是基于AIDL实现的轻量级IPC方案。这里立马就会有疑问为什么要它呢?明明有了aidl上节课大家学完了aidl进行binder通信是否感觉到使用起来其实还是有点复杂,毕竟通信什么的要写aidl,而且客户端和服务端都需要aidl文件,两个过程里面都需要,相对来说还是比较麻烦,对于项目过程中可能就是一些简单的跨进程数据传递,就是调用几个非常非常简单的方法,很多觉得都要写aidl成本比较大,那么有没有更加简单的方案来解决这个问题呢?

qq_34888036的博客 495

Android跨进程通信-IPC初探(二) - 使用Messenger

IPC初探(二) 本文将会介绍Messenger通信。 Mesenger是一种轻量级的IPC方案。它通过传递Message来实现数据的进程间传递。 它的底层实现是AIDL。 Messenger工作原理: 需求描述: C端向S端跨进程发送msg,并封装一个bundle数据对象 S接收msg,读取bundler数据,并向C端返回一条新的msg,并封装一个新的bundlB数据对象...

cangely的专栏 396

Android中的IPC方式-Messenger

IPC简介IPC,即Inter-Process Communication进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。 android中的IPC方式有很多种,如Bundle、文件共享、AIDL、ContentProvider、Socket、Messenger等,本章主要介绍其中比较轻量级的Messenger方式

xll712的博客 526

android bundle机制6,Android IPC机制(五):详解Bundle与“信使”——Messenger

一、前言在前几篇文章中,笔者讲述了利用AIDL方式进行进程间通讯,并对Binder及Binder连接池的使用方法和原理进行了分析。其实,进程间通讯还存在多种方式,AIDL方式只是其中之一,只不过由于AIDL方式的功能比较全面,所以AIDL方式用得也比较多。除了AIDL方式之外,还有Bundle、Messenger、ContenProvider、Socket、文件共享等多种方式。各种方式都有不同的适...

weixin_36367249的博客 404
上一篇: Android高级UI_双缓冲策略解决GPU卡顿
下一篇: 打造兼容的Android揭面水波动画库
ApkCore
博客等级 码龄12年 8粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值