Android 跨进程之间通信(IPC)方式之BroadcastReceiver

news2024/11/29 1:50:46

Android 跨进程之间通信

  1. Android 跨进程之间通信(IPC)方式之BroadcastReceiver
  2. Android 跨进程之间通信(IPC)方式之ContentProvider

    文章目录

    • Android 跨进程之间通信
    • 前言
    • 一、关于系统广播
    • 二、如何利用BroadcastReceiver跨进程通信
      • 1.创建广播接收器
      • 2.清单文件中声明注册
      • 3.发送广播
      • 4.杀掉进程测试
    • 小结

前言

广播是 Android 系统中一种强大的通信机制,它允许应用程序中的不同组件之间进行信息交流,甚至跨越不同应用程序之间进行通信。它类似于一个发布者-订阅者模式,其中一个组件可以发送广播,而其他组件则可以注册监听并在特定条件下接收这些广播消息。

广播可以被用来传递各种类型的信息,比如设备状态的变化、系统事件、应用内部的消息等。它的灵活性和普适性使得开发者可以利用广播来实现诸如实时更新UI、触发特定操作、响应系统级事件等功能。通过广播,Android 应用程序可以与用户进行无缝互动,并实现多个组件之间的松耦合通信,这对于实现复杂的应用逻辑和提升用户体验至关重要。


一、关于系统广播

系统会在发生各种系统事件时自动发送广播,例如当系统进入和退出飞行模式时。系统广播会被发送给所有同意接收相关事件的应用。
广播消息本身会被封装在一个 Intent 对象中,该对象的操作字符串会标识所发生的事件(例如 android.intent.action.AIRPLANE_MODE)。该 Intent 可能还包含绑定到其extra 字段中的附加信息。例如,飞行模式 intent 包含布尔值 extra 来指示是否已开启飞行模式。

二、如何利用BroadcastReceiver跨进程通信

我们创建两个项目,一个是项目A,另一个是项目B。用两个不同项目来模拟两个进程之间的通信效果,在

1.创建广播接收器

在A项目中创建 BroadcastReceiver 子类并实现 onReceive(Context, Intent)。以下示例中的广播接收器会记录并显示广播的内容

public class AReceiver extends BroadcastReceiver {
    private static final String ACTION_CUSTOM_BROADCAST_B = "com.xzhy.ademo.ACTION_CUSTOM_BROADCAST_B";
    private static final String EXTRA_MESSAGE = "message";
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_CUSTOM_BROADCAST_B.equals(action)) {
            String message = intent.getStringExtra(EXTRA_MESSAGE);
            Log.d("AReceiver", "--- AReceiver onReceive message: "+message);
        }
    }
}

2.清单文件中声明注册

在A项目中清单中声明广播接收器

  <receiver android:name=".AReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.xzhy.ademo.ACTION_CUSTOM_BROADCAST_B" />
            </intent-filter>
  </receiver>

3.发送广播

Android 为应用提供三种方式来发送广播:

  • sendOrderedBroadcast(Intent, String) 方法一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filterandroid:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行。
  • sendBroadcast(Intent) 方法会按随机的顺序向所有接收器发送广播。这称为常规广播。这种方法效率更高,但也意味着接收器无法从其他接收器读取结果,无法传递从广播中收到的数据,也无法中止广播。
  • LocalBroadcastManager.sendBroadcast 方法会将广播发送给与发送器位于同一应用中的接收器。如果您不需要跨应用发送广播,请使用本地广播。这种实现方法的效率更高(无需进行进程间通信),而且您无需担心其他应用在收发您的广播时带来的任何安全问题。

我们在B项目中用sendBroadcast(Intent) 向A项目发送一条广播消息,代码如下。

 Intent intent = new Intent("com.xzhy.ademo.ACTION_CUSTOM_BROADCAST_B");
 intent.setPackage("com.xzhy.ademo"); // 设置接收广播的应用包名
 intent.putExtra("message", "Hello,这里是B面 Demo 的默认消息~");
 sendBroadcast(intent);

先打开A项目保持在后台运行,再打开B项目会发行A项目的日志显示已经收到了B发送的广播消息。既然B发送广播给A能够正常送达,那么A发送给B消息只要和上面的步骤一样就可以做到A、B进程之间相互通信了。
在这里插入图片描述

4.杀掉进程测试

在A进程被系统意外杀死或者说主动关闭掉的话,B通过广播发送消息给A,通过日志可以发现A是无法收到消息。

在这里插入图片描述

B日志显示已经发送了广播消息,但是A的日志情况显示没有收到B发送的消息

在这里插入图片描述

小结

本文简单的介绍了如何利用广播在两个不同进程内进行相互通信操作,但是广播的接收者必须在运行状态下才能接收到广播消息。当一个进程被杀死时,它注册的广播接收者也会随之销毁,因此其他进程发送的广播消息将无法被接收到。因为广播是一种基于 Android 组件的通信方式,需要组件处于活动状态才能接收到广播。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

08-接口文档管理工具-项目集成knife4j__ev

2、knife4j快速入门 2.1 knife4j介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! gitee地址&#xff1a;knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增…

目标检测-Two Stage-Mask RCNN

文章目录 前言一、Mask RCNN的网络结构和流程二、Mask RCNN的创新点总结 前言 前文目标检测-Two Stage-Faster RCNN提到了Faster RCNN主要缺点是&#xff1a; ROI Pooling有两次量化操作&#xff0c;会引入误差影响精度 Mask RCNN针对这一缺点做了改进&#xff0c;此外Mask …

功能真强大!5个令人惊叹的 Jupyter 黑科技

Jupyter 是一种功能强大的交互式计算环境&#xff0c;被广泛应用于数据分析、机器学习、科学计算等领域。 除了常见的基本功能外&#xff0c;Jupyter还隐藏着许多令人惊叹的黑科技&#xff0c;这些功能可以帮助用户更高效地完成工作&#xff0c;提升工作体验。 在本文中&…

.NET Core中灵活使用反射

前言 前段时间有朋友问道一个这样的问题&#xff0c;.NET Core中如何通过Attribute的元数据信息来调用标记的对应方法。我第一时间想到的就是通过C#反射获取带有Custom Attribute标记的类&#xff0c;然后通过依赖注入&#xff08;DI&#xff09;的方式获取对应服务的方法并通…

Elasticsearch8集群部署

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 本文记录在3台服务器上离线搭建es8.7.1版本集群。 1. 修改系统配置 1.1 hosts配置 在三台es节点服务器加入hostname解析&…

电脑系统报错msvcr100.dll丢失的解决方法

本文将详细介绍msvcr100.dll的作用、丢失原因以及解决方法。 一、msvcr100.dll是什么文件&#xff1f; msvcr100.dll是Microsoft Visual C 2010 Redistributable Package的一部分&#xff0c;它是运行许多Windows应用程序所必需的动态链接库文件。它包含了C运行时库&#xff…

AI时代系列丛书(由北京大学出版社出版)

前言 在AI时代&#xff0c;程序员面临着新的机遇和挑战。为了适应这个快速发展的时代&#xff0c;掌握新技能并采取相应的应对策略是至关重要的。 对于办公人员或程序员来说&#xff0c;利用AI可以提高工作效率。例如&#xff0c;使用AI助手可以帮助自动化日常的重复性工作&a…

C++八股学习心得.1

1.面向对象程序设计 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持面向过程编程、面向对象编程和泛型编程。 C 完全支持面向对象的程序设计&#xff0c;包括面向对象开发的四大特性&#xff1a;封装、抽象、继承、多态 2.标准库 …

车牌识别系统设计与实现

车牌识别系统设计与实现 项目概述 本项目旨在设计和实现一套车牌识别系统&#xff0c;通过使用车牌字符数据集进行训练&#xff0c;应用OpenCV、CNN&#xff08;卷积神经网络&#xff09;和PyQt5技术&#xff0c;实现车牌图像的预处理、位置选定、定位、字符分割和最终的车牌…

【期末复习】 计算机操作系统

第一章 操作系统引论 历史上最重要的阶段可能会考选择填空&#xff0c;牢记三大特点&#xff0c;四大特征&#xff0c;五大功能 1.1 OS的目标和作用 1.2 OS的发展过程 1.3 OS的基本特性&#xff08;必考&#xff09; 并发 共享 虚拟 异步 1.4 OS的主要功能 后续都是一个大章 五…

Halcon开运算opening

Halcon开运算 文章目录 Halcon开运算 开运算的计算步骤是先腐蚀&#xff0c;后膨胀。通过腐蚀运算能去除小的非关键区域&#xff0c;也可以把离得很近的元素分隔开&#xff0c;再通过膨胀填补过度腐蚀留下的空隙。因此&#xff0c;通过开运算能去除一些孤立的、细小的点&#x…

27、web攻防——通用漏洞SQL注入Tamper脚本Base64Jsonmd5

文章目录 数字型&#xff1a;0-9。http;//localhost:8081/blog/news.php?id1 字符型&#xff1a;a-z、中文&#xff0c;需要闭合符号。http;//localhost:8081/blog/news.php?idsimple 搜索型&#xff1a;在字符型的基础上加入了通配符%。http;//localhost:8081/blog/news.…

Apache Doris (五十五): Doris Join类型 - Colocation Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Colocation Join原理

数据结构--队列【详解】~(˶‾᷄ꈊ‾᷅˵)~

目录 队列定义&#xff1a; 队列的声明与头文件的包含&#xff1a; 队列的声明&#xff1a; 头文件的包含&#xff1a; 队列的基本操作: 初始化队列 : 摧毁队列&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 返回队头数据&#xff1a; 返回队尾数据&#xff1…

C#编程-使用变量

使用变量 请考虑以下场景:您必须创建一个程序,接受来自用户的两个数字并在屏幕上显示着两个数字之和。现在,读取用户提供的数字时,您需要将这些数字存储在内存中的某个位置,以便您能对这些数字执行加操作。您可以使用变量将这些数字存储在内存中。 下图显示了使用变量将…

乐观者成功,悲观者正确|2023年个人总结

上周一个好久没联系的朋友&#xff0c;突然微信问我&#xff1a;“土司&#xff0c;年终总结啥时候发出来&#xff0c;等着学习呢&#xff1f;”&#xff0c;听到这话既感动又愧疚&#xff0c;感动的是一个个人年终总结还被人惦记着&#xff0c;有一种稳稳的幸福&#xff1b;愧…

字符串与模拟法

加密英文 输入一个字符串可用getline(cin,数组名) 字典序 在字符串中寻找子字符串 分糖果 代码 猴子选大王 代码 如果n号猴子被选中&#xff0c;则使得n号的猴子变成false&#xff0c;未出局的猴子为true。 if(pn1) p1;这个是将超出的下标重新变回1号&#xff0c;使其重新循…

Selenium教程04:鼠标+键盘网页的模拟操作

在webdriver 中&#xff0c;鼠标操作都封装在ActionChains类中&#xff0c;使用的时候需要导入这个包。 from selenium.webdriver import ActionChainsActionChains方法列表如下&#xff1a; click(on_elementNone) ——单击鼠标左键click_and_hold(on_elementNone) ——点击…

webpack的深入学习与实战(持续更新)

一、何为Webpack Webpack是 一个开源的JavaScript模块打包工具&#xff0c;其最核心的功能是解决模块之间的依赖&#xff0c;把各个模块按照特定的规则和顺序组织在一起&#xff0c;最终合并为一个JS文件或多个。 二、带宽的换算 目前我们的云服务器带宽为5M 三 、bundle 体…

Java 动态树的实现思路分析

Java 动态树的实现 目录概述需求&#xff1a; 设计思路实现思路分析1. 简单Java实现&#xff1a;2.建立父子表存储3.前端的对应的json 字符串方式 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0…