(原创)使用Messenger进行轻量级跨进程通信
安卓跨进程通信方式在安卓开发中其实有六大跨进程通信方式有的是我们经常用的有的用得少。分别是1.AIDL最常用、功能最强2.Binder底层核心所有 IPC 的底层都是 Binder3.ContentProvider专门给别的 APP 读数据4. BroadcastReceiver 广播5. Socket网络套接字6. Messenger最简单、轻量、基于 Handler、串行、单线程Messenger如何实现跨进程通信Messenger其实是通过handler来通信的因为handler是一条一条消息发过来并处理。所以是串行的下面从客户端和服务端分别介绍如何通信服务端服务端一般是一个service需要创建一个信使也就是MessengerprivatevalserviceMessengerMessenger(serviceHandler)在onbind方法中把这个信使的binder返回回去overridefunonBind(intent:Intent):IBinder{returnserviceMessenger.binder}方便客户端使用信使的创建的时候构造方法里面需要一个handler这个handler就是用来接收并且处理另外一端发来的消息具体代码下面源码都有客户端一样的客户端也需要一个客户端的信使和自己用来处理消息的handlerprivatevalclientMessengerMessenger(clientHandler)在绑定服务端的service中可以拿到服务端的信使overridefunonServiceConnected(name:ComponentName,service:IBinder){// 绑定成功获取服务端信使serverMessengerMessenger(service)isBindtrueToast.makeText(thisMainActivity,绑定远程服务成功,Toast.LENGTH_SHORT).show()}这样客户端就可以用服务端的信使发消息给服务端// 发送消息到远程服务// 点击按钮发送消息funsendMsg(view:View?){if(!isBind||serverMessengernull)returntry{valmsgMessage.obtain(null,1001)valbundleBundle()bundle.putString(obj_client,你好服务端)msg.databundle// msg.obj 你好服务端 //不可以用obj进行跨进程传递对象数据哪怕是string系统会认为数据没有序列化然后报错// 携带自己的信使让服务端可以回复msg.replyToclientMessenger// 发送消息到远程服务serverMessenger!!.send(msg)}catch(e:RemoteException){e.printStackTrace()}}发送的时候客户端通过replyTo 字段把自己端的信使传递给服务端这样服务端拿到客户端的信使就可以发消息给客户端msg.replyToclientMessenger相当于两端都各自拿到对面的信使就可以进行通信最后如果要解绑服务记得释放服务端的信使避免内存泄漏serverMessengernull页面退出也记得移除handler的消息// 清空Handler防泄漏clientHandler.removeCallbacksAndMessages(null);Messenger对比AIDL相同点1.都与IPC的调用有关2.Messenger 是一种轻量级的 IPC方案底层实现了AIDL只是进行了封装开发的时候不用再写.aidl文件。3.都支持实时通信不同点1.Messenger一次只能处理一个请求串行/AIDL一次可以处理多个请求并行2.Messenger不支持RPC只能通过message传递消息/AIDL支持RPC3.Messenger使用简单轻量级不需要创建AIDL文件/AIDL使用复杂需要创建AIDL文件源码Activityimportandroid.content.ComponentNameimportandroid.content.Intentimportandroid.content.ServiceConnectionimportandroid.os.Bundleimportandroid.os.Handlerimportandroid.os.IBinderimportandroid.os.Looperimportandroid.os.Messageimportandroid.os.Messengerimportandroid.os.RemoteExceptionimportandroid.view.Viewimportandroid.widget.Toastimportandroidx.activity.enableEdgeToEdgeimportandroidx.appcompat.app.AppCompatActivityimportandroidx.core.view.ViewCompatimportandroidx.core.view.WindowInsetsCompatclassMainActivity:AppCompatActivity(){// 客户端Handler接收并处理服务端回复privatevalclientHandler:Handlerobject:Handler(Looper.getMainLooper()){overridefunhandleMessage(msg:Message){super.handleMessage(msg)if(msg.what2001){valbundlemsg.datavalresultbundle.getString(obj_server)Toast.makeText(thisMainActivity,客户端收到回复$result,Toast.LENGTH_SHORT).show()}}}// 服务端信使用于发送消息给服务端privatevarserverMessenger:Messenger?null// new Messenger(clientHandler) 把客户端Handler包装成信使用于接收服务端消息privatevalclientMessengerMessenger(clientHandler)//绑定状态privatevarisBindfalse// 服务连接privatevalconnection:ServiceConnectionobject:ServiceConnection{overridefunonServiceConnected(name:ComponentName,service:IBinder){// 绑定成功获取服务端信使serverMessengerMessenger(service)isBindtrueToast.makeText(thisMainActivity,绑定远程服务成功,Toast.LENGTH_SHORT).show()}overridefunonServiceDisconnected(name:ComponentName){Toast.makeText(thisMainActivity,取消绑定远程服务成功,Toast.LENGTH_SHORT).show()isBindfalseserverMessengernull}}overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_main)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)){v,insets-valsystemBarsinsets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom)insets}// 绑定服务bindService()}// 绑定服务privatefunbindService(){valintentIntent(this,RemoteService::class.java)bindService(intent,connection,BIND_AUTO_CREATE)}// 点击按钮发送消息funsendMsg(view:View?){if(!isBind||serverMessengernull)returntry{valmsgMessage.obtain(null,1001)valbundleBundle()bundle.putString(obj_client,你好服务端)msg.databundle// msg.obj 你好服务端 //不可以用obj进行跨进程传递对象数据哪怕是string系统会认为数据没有序列化然后报错// 携带自己的信使让服务端可以回复msg.replyToclientMessenger// 发送消息到远程服务serverMessenger!!.send(msg)}catch(e:RemoteException){e.printStackTrace()}}overridefunonDestroy(){super.onDestroy()// 解绑服务if(isBind){unbindService(connection)isBindfalse}// 清空Handler防泄漏clientHandler.removeCallbacksAndMessages(null);}}Serviceimportandroid.app.Serviceimportandroid.content.Intentimportandroid.os.Bundleimportandroid.os.Handlerimportandroid.os.IBinderimportandroid.os.Looperimportandroid.os.Messageimportandroid.os.Messengerimportandroid.os.RemoteExceptionimportandroid.widget.ToastclassRemoteService:Service(){privatevalserviceHandlerHandler(Looper.getMainLooper()){msg-//客户端信使valclientMessengermsg.replyTovalbundlemsg.datavalcontentbundle.getString(obj_client)when(msg.what){1001-{Toast.makeText(thisRemoteService,服务端收到$content,Toast.LENGTH_SHORT).show()try{valreplyMsgMessage.obtain(null,2001)valbundleBundle()bundle.putString(obj_server,服务端已收到已处理完毕)replyMsg.databundle// msg.obj 服务端已收到已处理完毕 //不可以用obj进行跨进程传递对象数据哪怕是string系统会认为数据没有序列化然后报错clientMessenger.send(replyMsg)}catch(e:RemoteException){e.printStackTrace()}}}true}//服务端信使privatevalserviceMessengerMessenger(serviceHandler)overridefunonBind(intent:Intent):IBinder{returnserviceMessenger.binder}}xml里面写个button就可以?xml version1.0encodingutf-8?androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityButtonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:onClicksendMsgandroid:textHello World!app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent//androidx.constraintlayout.widget.ConstraintLayout最后记得配置清单注册!--远程服务单独进程--serviceandroid:name.RemoteServiceandroid:process:remote/

相关新闻

单片机IO口扩展方案与74HC595/165应用详解

单片机IO口扩展方案与74HC595/165应用详解

1. 为什么需要IO口扩展?在单片机开发中,IO口资源紧张是工程师们经常遇到的痛点。以常见的51单片机为例,标准型号通常只有32个IO口,而实际项目中往往需要控制数十个LED、多个按键输入、各种传感器接口等。当IO口数量不足时&#xf…

2026/7/18 5:52:11 阅读更多 →
Android内存溢出(OOM)问题解析与优化实践

Android内存溢出(OOM)问题解析与优化实践

1. Android内存溢出问题概述在Android开发中,内存溢出(OutOfMemoryError)是最常见的性能问题之一。当应用尝试分配超过系统限制的内存时,就会抛出这个错误。作为一名有五年Android开发经验的工程师,我处理过各种OOM问题,从简单的图…

2026/7/18 5:52:11 阅读更多 →
嵌入式机械臂智能售卖系统:从运动控制到多传感器融合实战

嵌入式机械臂智能售卖系统:从运动控制到多传感器融合实战

如果你正在参加嵌入式比赛,或者对智能硬件开发感兴趣,可能会发现一个现象:很多参赛作品要么停留在简单的传感器数据采集,要么就是功能单一的控制系统。但真正能让人眼前一亮的作品,往往是把嵌入式技术应用到真实生活场…

2026/7/18 5:52:11 阅读更多 →

最新新闻

PHP开发者必备资源与实战技巧全指南

PHP开发者必备资源与实战技巧全指南

1. PHP开发者资源全景指南作为一名深耕PHP领域多年的开发者,我深知优质资源对技术成长的关键作用。今天这份清单不同于常见的"Top 10资源"盘点,而是基于个人实践验证过的资源矩阵,涵盖从语言基础到架构设计的全链路工具链。这些资源…

2026/7/18 6:41:35 阅读更多 →
STM32定时器中断原理与实现教程

STM32定时器中断原理与实现教程

1. STM32定时器中断基础概念在嵌入式系统开发中,定时器中断是最基础也最重要的功能之一。STM32系列单片机提供了丰富的定时器资源,其中TIM2作为通用定时器,非常适合初学者入门学习。定时器中断的核心原理是通过硬件计数器实现精准的时间控制。…

2026/7/18 6:41:35 阅读更多 →
技术深度解析:PaddleOCR-VL-1.6-GGUF - 文档智能解析的最佳实践

技术深度解析:PaddleOCR-VL-1.6-GGUF - 文档智能解析的最佳实践

技术深度解析:PaddleOCR-VL-1.6-GGUF - 文档智能解析的最佳实践 【免费下载链接】PaddleOCR-VL-1.6-GGUF 项目地址: https://ai.gitcode.com/paddlepaddle/PaddleOCR-VL-1.6-GGUF 在当今数字化转型的浪潮中,文档智能解析技术已成为企业自动化流程…

2026/7/18 6:41:35 阅读更多 →
Video-Use:当AI代理学会“阅读“而非“观看“视频时,编辑范式发生了怎样的革命?

Video-Use:当AI代理学会“阅读“而非“观看“视频时,编辑范式发生了怎样的革命?

Video-Use:当AI代理学会"阅读"而非"观看"视频时,编辑范式发生了怎样的革命? 【免费下载链接】video-use Edit videos with coding agents 项目地址: https://gitcode.com/GitHub_Trending/vid/video-use 在传统视…

2026/7/18 6:41:35 阅读更多 →
如何利用AI艺术工具打造创意作品:Magenta完整实践指南

如何利用AI艺术工具打造创意作品:Magenta完整实践指南

如何利用AI艺术工具打造创意作品:Magenta完整实践指南 【免费下载链接】magenta Magenta: Music and Art Generation with Machine Intelligence 项目地址: https://gitcode.com/gh_mirrors/ma/magenta Magenta是一个由Google Brain团队发起的开源研究项目&a…

2026/7/18 6:41:35 阅读更多 →
开源六轴机械臂与AI集成实战:从ROS 2驱动到LeRobot智能抓取

开源六轴机械臂与AI集成实战:从ROS 2驱动到LeRobot智能抓取

1. 项目概述:当开源硬件遇上AI,一个机器人手臂的“开箱即用”之旅最近在捣鼓机器人项目,发现了一个挺有意思的套件:Waveshare的SO-ARM100/101六轴机械臂。这玩意儿最吸引我的地方,是它直接和Hugging Face的LeRobot项目…

2026/7/18 6:40:35 阅读更多 →

日新闻

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:38 阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:38 阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:38 阅读更多 →

周新闻

月新闻