使用 Messenger 跨进程通讯
在Android中使用Messenger进行跨进程通信(IPC)的步骤如下:
1. 服务端(Service)实现
1.1 创建Service并绑定Messenger
public class MessengerService extends Service {private static final String TAG = "MessengerService";public static final int MSG_SAY_HELLO = 1;// 服务端的Messenger,关联一个Handler处理消息private Messenger mMessenger = new Messenger(new IncomingHandler());// 定义处理客户端消息的Handlerprivate static class IncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_SAY_HELLO:Log.i(TAG, "收到客户端消息: " + msg.getData().getString("data"));// 回复客户端Messenger clientMessenger = msg.replyTo;if (clientMessenger != null) {try {Message replyMsg = Message.obtain(null, MessengerService.MSG_SAY_HELLO);Bundle data = new Bundle();data.putString("reply", "你好,客户端!");replyMsg.setData(data);clientMessenger.send(replyMsg);} catch (RemoteException e) {e.printStackTrace();}}break;default:super.handleMessage(msg);}}}@Overridepublic IBinder onBind(Intent intent) {return mMessenger.getBinder(); // 返回Messenger的Binder对象}
}
1.2 在AndroidManifest.xml中声明Service
<serviceandroid:name=".MessengerService"android:process=":remote" /> <!-- 指定独立进程 -->
2. 客户端(Client)实现
2.1 绑定服务并发送消息
public class MainActivity extends AppCompatActivity {private Messenger mServiceMessenger; // 服务端的Messengerprivate boolean isBound;// 客户端的Messenger,用于接收服务端回复private Messenger mClientMessenger = new Messenger(new ClientHandler());// 处理服务端回复的Handlerprivate static class ClientHandler extends Handler {@Overridepublic void handleMessage(Message msg) {if (msg.what == MessengerService.MSG_SAY_HELLO) {String reply = msg.getData().getString("reply");Log.i("Client", "收到服务端回复: " + reply);}}}// ServiceConnection监听绑定状态private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {mServiceMessenger = new Messenger(service); // 绑定服务端MessengerisBound = true;}@Overridepublic void onServiceDisconnected(ComponentName name) {mServiceMessenger = null;isBound = false;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 绑定服务Intent intent = new Intent(this, MessengerService.class);bindService(intent, mConnection, Context.BIND_AUTO_CREATE);}// 发送消息到服务端public void sendMessageToService(View view) {if (!isBound) return;try {Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO);Bundle data = new Bundle();data.putString("data", "你好,服务端!");msg.setData(data);msg.replyTo = mClientMessenger; // 设置回复的MessengermServiceMessenger.send(msg);} catch (RemoteException e) {e.printStackTrace();}}@Overrideprotected void onDestroy() {super.onDestroy();if (isBound) {unbindService(mConnection);isBound = false;}}
}
3. 关键点说明
-
Messenger工作原理:
- Messenger基于AIDL封装,通过串行化的消息队列处理跨进程请求。
- 服务端通过
Messenger
关联Handler
处理消息,客户端通过IBinder
获取服务端的Messenger
。
-
双向通信:
- 客户端在发送消息时,通过
msg.replyTo
携带自己的Messenger
,服务端可通过此回复消息。
- 客户端在发送消息时,通过
-
数据传递:
- 使用
Bundle
传递数据,支持基本类型和实现了Parcelable
的对象。 - 避免传输大数据,防止性能问题。
- 使用
-
线程模型:
Messenger
的消息处理默认在主线程,若需耗时操作,应在服务端使用子线程。
-
生命周期管理:
- 及时在
onDestroy()
中解绑服务,防止内存泄漏。
- 及时在
相关文章:
使用 Messenger 跨进程通讯
在Android中使用Messenger进行跨进程通信(IPC)的步骤如下: 1. 服务端(Service)实现 1.1 创建Service并绑定Messenger public class MessengerService extends Service {private static final String TAG "Mess…...
css炫酷的3D水波纹文字效果实现详解
炫酷的3D水波纹文字效果实现详解 这里写目录标题 炫酷的3D水波纹文字效果实现详解项目概述技术栈核心实现1. 基础布局2. 渐变背景3. 文字效果实现3.1 基础样式3.2 文字漂浮动画 4. 水波纹效果4.1 模糊效果4.2 水波动画 5. 交互效果 技术要点项目难点与解决方案总结 项目概述 在…...
C++类的特殊成员函数:构造、拷贝构造与析构函数详解
目录 编辑一、构造函数 二、拷贝构造函数 三、析构函数 在C 编程中,类的特殊成员函数扮演着至关重要的角色,它们负责对象的创建、复制以及销毁过程。本文将深入探讨构造函数、拷贝构造函数和析构函数的概念、特性及应用场景,并结合代…...
ffmpeg常见命令3
文章目录 1. **文字水印(Text Watermark)**示例命令:更多选项: 2. **图片水印(Image Watermark)**示例命令:更多选项: 3. **画中画(Picture-in-Picture, PIP)…...
C# 中创建统一 API 接口实现方案
在 C# 中创建统一 API 接口需要从架构设计、技术选型和代码实现等多个层面进行规划。以下是详细的实现方案和完整示例代码: 一、技术选型与架构设计 框架选择 ASP.NET Core (6.0)RESTful API 规范 核心组件 统一响应格式:标准化 JSON 响应结构全局异常处…...
考研单词笔记 2025.04.04
accord n一致,符合,协议,条约v与…一致符合,给予,赠予 align v使一致,使对齐 alike a相同的,相似的ad相同地,相似地,同等地 analogous a类似的,相似的 co…...
leetcode 代码随想录 数组-区间和
题目 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 输入: 第一行输入:为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间&…...
Linux学习笔记7:关于i.MX6ULL主频与时钟配置原理详解
以下是关于正点原子B站课程中 i.MX6ULL主频和时钟配置实验的博客内容框架与详细解析,结合实验原理、配置流程及关键代码实现,适合嵌入式开发者参考学习: 一、 实验背景 i.MX6ULL默认启动时由内部BootROM将主频设置为396MHz,但其…...
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
✨前言:传参和状态管理,看似简单其实门道不少 在 Web 开发中,前端和后端最核心的交流方式就是“传参”,而“传参”除了涉及如何写代码获取参数,还藏着很多开发者容易忽略的细节: 为什么 URL 带了中文&…...
洛谷题单3-P1075 [NOIP 2012 普及组] 质因数分解-python-流程图重构
题目描述 已知正整数 n n n 是两个不同的质数的乘积,试求出两者中较大的那个质数。 输入格式 输入一个正整数 n n n。 输出格式 输出一个正整数 p p p,即较大的那个质数。 输入输出样例 输入 21输出 7说明/提示 1 ≤ n ≤ 2 1 0 9 1 \le n\…...
Vue组件化开发深度解析:Element UI与Ant Design Vue对比实践
一、Vue组件化开发的核心优势 1.1 组件化架构的天然优势 Vue的组件系统是其最核心的特性之一,采用单文件组件(.vue)形式,将HTML、CSS和JavaScript组合在同一个文件中,形成高内聚、低耦合的代码单元。这种设计显著提升…...
ctfshow VIP题目限免 robots后台泄露
根据题目提示是 robots后台泄露,所以我们试着访问它的后台文件 robots.txt 访问之后发现了有一个/flagishere.txt 目录文件。接着拼接访问它发现了 flag...
突破传统认知:聚类算法的底层逻辑与高阶应用全景解析
一、维度革命:重新定义聚类分析的认知边界 在人工智能的浩瀚星空中,聚类算法犹如一组精密的星际导航仪,帮助我们在无序的数据宇宙中发现隐藏的秩序。这项起源于人类本能分类需求的技术,经历了从简单分组到智能识别的蜕变…...
获取ssh密钥
git bash GitHub官网: Redirecting… ssh-keygen -t rsa -C “git账号” 出现id_rsa.pub 登录github添加 将id_rsa.pub中内容复制 点击SSH and GPG keys 点击New SSH key 起个名字 将id_rsa.pub中内容复制到这里 报错: ssh: connect to host github.com port 2…...
MINIQMT学习课程Day7
在上一篇,我们安装好xtquant,qmt以及python后,这一章,我们学习如何使用xtquant 本章学习,如何获取账号的资金使用状况。 首先,打开qmt,输入账号密码,选择独立交易。 进入交易界面&…...
`accept_ra` 和 `autoconf` 和 `forwarding` 的关系 笔记250404
accept_ra 和 autoconf 和 forwarding 的关系 笔记250404 在 Linux 的 IPv6 网络配置中,accept_ra、autoconf 和 forwarding 是三个密切相关的核心参数,它们的组合直接影响设备在网络中的角色(主机或路由器)和地址配置行为。以下是…...
leetcode数组-二分查找
题目 题目链接:https://leetcode.cn/problems/binary-search/ 文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解:https://www.bilibili.com/video/BV1fA4y1o715 给定一个 n 个元素有序的&…...
vector的介绍与代码演示
由于以后我们写OJ题时会经常使用到vector,所以我们必不可缺的是熟悉它的各个接口。来为我们未来作铺垫。 首先,我们了解一下: https://cplusplus.com/reference/vector/ vector的概念: 1. vector是表示可变大小数组的序列容器…...
SDK中窗口调用
存在窗口A和B的win32程序 , 当点击窗口A中的按钮后会弹出窗口B #include <windows.h>// 窗口 B 的窗口过程 LRESULT CALLBACK WindowProcB(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_DESTROY:PostQuitMessage(0);break;default:ret…...
Web Service技术
Web Service 是一种基于网络的、分布式的技术,用于在不同的应用程序之间进行通信和数据交换。以下是关于它的详细介绍: 定义与概念 Web Service 是一种通过互联网协议(如 HTTP)提供服务的软件组件,它使用标准的 XML …...
使用内存数据库来为mapper层的接口编写单元测试
简介 使用内存数据库来测试mapper层的sql代码,这种方式可以让测试案例摆脱对数据库的依赖,进而变得可重复执行。 这里选择的内存数据库是h2,它是纯java编写的关系型数据库,开源免费,而且轻量级的,性能较好…...
PowerMonitor的使用步骤
PowerMonitor是功耗分析中常用的测试和分析工具,不仅精度高,而且遇到需要找方案提功耗单的时候,有时还需要PowerMonitor的数据作为辅助日志。 1.先接上假电池正负极,再按PowerMonior的电源键 2.桌面点击PowerMonitor快捷图标 3.调…...
【C++经典例题】杨辉三角问题
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:C经典例题 期待您的关注 目录 一、问题描述 二、解题思路 解法 1 思路 解法 2 思路 三、代码实现 解法 1 代码 解法 2 代码…...
java自主学习网站(springboot+ssm+mysql)含运行文档
java自主学习网站(springbootssmmysql)含运行文档 该系统是一个专注于Java编程的在线教育平台。系统的主要功能和特点如下: 导航栏:系统顶部设有导航栏,用户可以通过它快速访问不同的页面,包括首页、课程列表、分享资料列表、讲…...
T-SQL语言的链表查找
T-SQL语言的链表查找 在数据库系统中,数据结构的选择对性能优化至关重要。链表作为一种常见的数据结构,具有灵活性和动态存储的优势。尽管在SQL数据库中,传统的表结构已经足够应对大多数场景,但在某些情况下,将链表的…...
浅析 Spring AI 与 Python:企业级 AI 开发的技术分野
一、技术架构与生态体系对比 Spring AI 构建在 Spring Boot 生态之上,其核心架构包含以下模块: 模型适配层:通过统一 API 支持 OpenAI、Anthropic、Hugging Face 等主流模型提供商,实现跨平台模型调用。例如,调用 Cl…...
为 IDEA 设置管理员权限
IDEA 安装目录 兼容性选择管理员身份运行程序 之后 IDEA 中的操作(包括终端中的操作)都是管理员权限的了...
数据结构|排序算法(一)快速排序
一、排序概念 排序是数据结构中的一个重要概念,它是指将一组数据元素按照特定的顺序进行排列的过程,默认是从小到大排序。 常见的八大排序算法: 插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序、基数排序 二、快速…...
如何计算财富自由所需要的价格?
写在前面:【财富自由计算器】已上线,快算算财富自由要多少 多少钱,才能实现你的财富梦想? 需要多少,才能实现财务安全、财务独立,甚至财务自由? 看到结尾,你会很清楚地看到&…...
南京大学与阿里云联合启动人工智能人才培养合作计划,已将通义灵码引入软件学院课程体系
近日,南京大学与阿里云宣布启动人工智能人才培养合作计划,共同培养适应未来技术变革、具备跨学科思维的AI创新人才。 基于阿里云在云计算和AI大模型领域的技术优势和南京大学在人工智能领域的学科优势,双方将共同设计兼具前瞻性和应用性的人…...
基于 Python 的自然语言处理系列(70):检索增强生成(RAG)
1. 什么是 RAG? 在许多大模型(LLM)应用场景中,我们需要使用特定的用户数据,而这些数据并未包含在模型的训练集中。检索增强生成(Retrieval Augmented Generation,RAG)是一种有效的解…...
Flink CDC Pipeline mysql to doris
flink 与 flink-cdc版本兼容 运行同步程序 最终在 flink-1.20.1 与 flink-cdc-3.1.1 跑通测试 配置yaml文件 [rootchb1 flink-cdc-3.1.1]# cat mysql2doris.yaml ################################################################################ # Description: Sync…...
计算机网络-TCP的拥塞控制
内容来源:小林coding 本文是对小林coding的TPC拥塞控制的精简总结 为什么要有拥塞控制? 前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么 计算机网络都处在一个共享的环境,因此也…...
ArkTs的UI装饰器(自定义组件生命周期、页面组件生命周期、所有UI装饰器使用及示例)
目录 自定义组件定义 UI装饰器 @Component(V1) 自定义组件生命周期 freezeWhenInactive11+ @Entry(通用) 页面组件生命周期 EntryOptions10+ Component、Entry示例 @Reusable(V1) @Builder(通用) @BuilderParam(通用) 参数 引用传递示例 this指向 尾随…...
#管理Node.js的多个版本
在 Windows 11 上管理 Node.js 的多个版本,最方便的方法是使用 nvm-windows(Node Version Manager for Windows)。它允许你轻松安装、切换和管理多个 Node.js 版本。 📌 方法 1:使用 nvm-windows(推荐 ✅&a…...
Transformer由入门到精通(一):基础知识
基础知识 0 前言1 EncoderDecoder2 Bahdanau Attention3 Luong Attention4 Self Attention/Masked Self Attention5 MultiHead Self Attention6 Key-Value Attention7 ResNet8 总结 0 前言 我之前看transformer的论文《Attention Is All You Need》,根本看不懂&…...
Windows安装Node.js+Express+Nodemon
Windows安装Node.jsExpressNodemon 陈拓 2025/4/3-2025/4/4 1. 概述 在《Node.jsExpressNodemonSocket.IO构建Web实时通信》 https://blog.csdn.net/chentuo2000/article/details/134651743?spm1001.2014.3001.5502 一文中我们介绍了在Linux系统上的安装过程,本…...
关于JVM和OS中的指令重排以及JIT优化
关于JVM和OS中的指令重排以及JIT优化 前言: 这东西应该很重要才对,可是大多数博客都是以讹传讹,全是错误,尤其是JVM会对字节码进行重排都出来了,明明自己测一测就出来的东西,写出来误人子弟… 研究了两天&…...
LeetCode hot 100—柱状图中最大的矩形
题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释:最…...
从代码学习深度学习 - GRU PyTorch版
文章目录 前言一、GRU模型介绍1.1 GRU的核心机制1.2 GRU的优势1.3 PyTorch中的实现二、数据加载与预处理2.1 代码实现2.2 解析三、GRU模型定义3.1 代码实现3.2 实例化3.3 解析四、训练与预测4.1 代码实现(utils_for_train.py)4.2 在GRU.ipynb中的使用4.3 输出与可视化4.4 解析…...
重要头文件下的函数
1、<cctype> #include<cctype>加入这个头文件就可以调用以下函数: 1、isalpha(x) 判断x是否为字母 isalpha 2、isdigit(x) 判断x是否为数字 isdigit 3、islower(x) 判断x是否为小写字母 islower 4、isupper(x) 判断x是否为大写字母 isupper 5、isa…...
JSON-lib考古现场:在2025年打开赛博古董店的奇妙冒险
各位在代码海洋里捡贝壳的探险家们!今天我们要打开一个尘封的Java古董箱——JSON-lib!这货可是2003年的老宝贝,比在座很多程序员的工龄还大!准备好穿越回Web 1.0时代,感受XML统治时期的余晖了吗? …...
实操日志之Windows Server2008R2 IIS7 配置Php7.4.3
Windows7IIS7PHPMySQL - 适用于(2008 R2 / 8 / 10) 配置需求 操作系统:windows2008IIS版本:7.0 PHP版本:7.4.3 MySQL版本:5.7.12 及以上第一步: 安装 IIS 默认”Internet 信息服务“打勾安…...
Paraformer和SenseVoice模型训练
0.数据准备 如果是训练paraformer模型,我们只需要准备train_wav.scp和train_text.txt以及验证集val_wav.scp和val_text.txt即可。 如果是训练SenseVoice模型,我们需要准备下面几个文件: train_text.txt train_wav.scp train_text_language.…...
Axure数据可视化科技感大屏设计资料——赋能多领域,展示无限价值
可视化大屏如何高效、直观地展示数据,并将其转化为有价值的决策依据,成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板,作为一款强大的数据展示工具,正在以其出色的交互性和可定制性,赋能多个领域,…...
C# Winform 入门(7)之简单的抽奖系统邮件
由于比较喜欢英语,这里就把汉字属性名都改成英语了 声明变量,生成随机数 int key 0;Random random new Random(); 窗体加载 private void Form1_Load(object sender, EventArgs e) {timer1.Enabledfalse; } 开始按钮 private void txt_begin_Click(ob…...
scala编程语言
一、抽象类 1、抽象属性和抽象方法 1)基本语法 (1)定义抽象类:abstract class Person{} //通过 abstract 关键字标记抽象类 (2)定义抽象属性:val|var name:String //一个属性没有初始化…...
光流 | Farneback、Horn-Schunck、Lucas-Kanade、Lucas-Kanade DoG四种光流算法对比(附matlab源码)
🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅 以下是对四种光流算法的对比分析及MATLAB验证方案,包含原理说明、应用场景和可执行代码🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅🍅 🍓🍓🍓🍓🍍🍍🍍🍍🍍🍍🍍🍍🍍🍍…...
146. LRU 缓存 带TTL的LRU缓存实现(拓展)
LRU缓存 方法一:手动实现双向链表 哈希表 struct Node{int val;int key;Node* prev;Node* next;Node(int a, int b): key(a), val(b), prev(nullptr), next(nullptr) {}Node():key(0), val(0), prev(nullptr), next(nullptr) {} }; class LRUCache { private:Node* removeTai…...
【C++代码整洁之道】第九章 设计模式和习惯用法
文章目录 1. 设计原则与设计模式2. 常见的设计模式及应用场景2.1 单例模式2.2 依赖注入2.3 Adapter模式2.4 Strategy模式2.5 Command模式2.6 Command处理器模式2.7 Composite模式2.8 Observer模式2.9 Factory模式2.10 Facade模式2.11 Money Class模式2.12 特例模式 3. 常见的设…...