Broadcast:Android中实现组件及进程间通信
目录
一,Broadcast和BroadcastReceiver
1,简介
2,广播使用
二,静态注册和动态注册
三,无序广播和有序广播
1,有序广播的使用
2,有序广播的截断
3,有序广播的信息传递
四,本地广播与全局广播
1,本地广播的使用
一,Broadcast和BroadcastReceiver
1,简介
broadcast是Android提供的一种广播机制,用于组件或进程(即应用)间通信,同时也是Android四大组件之一;
广播broadcast由两部分组成:发送者和接收者。发送者可以是Activity,Service等,广播的接收者为BroadcastReceiver,也就是广播接收器;
2,广播使用
broadcast的使用基本分为四步:
- 创建BroadcastReceiver类;
- 注册BroadcastReceiver;
- 发送广播;
- 解除注册;
(1)创建BroadcastReceiver子类,重写onReceive方法。onReceive方法接收两个参数:context和intent,context为发送者的上下文,intent是发送者发送过来的信息;
public class MyBroadcastReceiver extends BroadcastReceiver {private static final String TAG = "MyBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "MyBroadcastReceiver" + " onReceive: 收到了广播消息");}
}
(2)注册接收器,接收器的注册方式分为静态注册和动态注册两种方式,这里使用动态注册方式。注册时需要配置过滤器,并且设置action,这里的action表示该注册器能够接收到包含该action的广播;
private void registerTheReceiver() {//配置过滤器,设置actionIntentFilter intentFilter = new IntentFilter();intentFilter.addAction(TextUtil.ACTION_SEND_RESULT);//注册接收器registerReceiver(broadcastReceiver, intentFilter);
}
(3)发送广播,与其他四大组件(Activity,Service)相同,也是通过intent来发送广播,通过设置action,标识该广播可被哪些接收器接收到,通过putExtra来传递额外信息;
//设置信息
Intent intent = new Intent();
intent.setAction(TextUtil.ACTION_SEND_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, "这是广播1");
//发送广播
sendBroadcast(intent);
(4)解除注册,应当在合适的地方解除接收器的注册;
@Override
protected void onDestroy() {super.onDestroy();Log.i(TAG, "onDestroy: ");//解除注册unregisterReceiver(broadcastReceiver);
}
二,静态注册和动态注册
广播接收器有两种注册方式:在Manifest文件中注册和在java代码中注册,我们称在Manifest文件中注册为静态注册,在java代码中注册为动态注册。 上面使用的方式即为动态注册,下面为静态注册方式;
(1)静态注册前同样需要先创建接收器类,然后在Manifest文件中指明接收器的类名,可以通过<intent-filter>标签来配置过滤器,并设置action;

静态注册的广播一般用于在应用启动时自动接收待定事件,比如系统启动,网络状态变化和电池状态变化等;
常见的广播类型(Action):

三,无序广播和有序广播
无序广播:接收器接收到的广播没有先后顺序,几乎同时收到;
有序广播:接收器按优先级顺序接收广播,同一时刻只能有一个接收器接收到广播;
简单来说就是广播可以设置优先级,然后就可以按顺序接收到广播,设置了优先级的广播称为有序广播,没有设置的称为无序广播,普通广播为无序广播;
1,有序广播的使用
通过IntentFilter过滤器的setPriority方法设置优先级,数值范围一般在-1000~1000之间,数值越大,优先级越高,有序广播通过sendOrderedBroadcast方法发送;
注册三个接收器,依次设置优先级,那么接收到的顺序应为3, 2, 1;
private void registerMyReceiver() {IntentFilter intentFilter = new IntentFilter(TextUtil.ACTION_SEND_RESULT);IntentFilter intentFilter2 = new IntentFilter(TextUtil.ACTION_SEND_RESULT);IntentFilter intentFilter3 = new IntentFilter(TextUtil.ACTION_SEND_RESULT);//设置优先级intentFilter.setPriority(100);intentFilter2.setPriority(101);intentFilter3.setPriority(102);registerReceiver(myBroadcastReceiver, intentFilter);registerReceiver(myBroadcastReceiver2, intentFilter2);registerReceiver(myBroadcastReceiver3, intentFilter3);
}
Intent intent = new Intent();
intent.setAction(TextUtil.ACTION_SEND_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, "这是广播2");
//有序广播的发送
sendOrderedBroadcast(intent, null);
运行结果如下,可以看到接收顺序确实为3, 2, 1;

2,有序广播的截断
在接收器中调用abortBroadcast方法即可阻断有序广播的传递 ,截断后广播不在向下传递,类似于Android的事件分发;
以上面的例子为基础,我们在接收器2中截断广播,那么预期结果应为接收器3, 2可以接收到广播,1接收不到;
public class MyBroadcastReceiver2 extends BroadcastReceiver {private static final String TAG = "MyBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "MyBroadcastReceiver2" + " onReceive: 收到广播消息");abortBroadcast(); //有序广播的截断}
}
运行结果如下,可以看到接收器1没有接收到广播:

3,有序广播的信息传递
在有序广播的传递过程中,可以通过一系列方法来传递一些信息,上游接收器通过这些方法来向下游传递额外信息:
//传递Bundle信息setResultExtras(Bundle);//传递字符串信息
setResultData(String);//传递int型信息
setResultCode(int);//同时传递int, String, Bundle型数据
setResult(int, String, Bundle);
下游接收器通过对应的get方法来获取信息:
//获取Bundle信息
getResultExtras(true);//true表示如果传递过来的数据为空,则返回一个空的Map//获取int型信息
getResultCode();//获取String型信息
getResultData();
例如我们在接收器3中向下游传递一些信息,因为接收器2的优先级小于接收器3,所以可以在接收器2中接收到传递的信息:
public class MyBroadcastReceiver3 extends BroadcastReceiver {private static final String TAG = "MyBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {//向下游传递额外信息Bundle bundle = intent.getExtras();bundle.putString("name", "MyBroadcastReceiver3" + " 喜多郁代");setResultExtras(bundle);Log.i(TAG, "MyBroadcastReceiver3" + " onReceive: 收到静态广播消息");}
}
public class MyBroadcastReceiver2 extends BroadcastReceiver {private static final String TAG = "MyBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = getResultExtras(true);//true表示如果传递过来的数据为空,则返回一个空的MapString name = bundle.getString("name");Log.i(TAG, "发件人: " + name + " " + "收件人: " + "MyBroadcastReceiver2");Log.i(TAG, "MyBroadcastReceiver2" + " onReceive: 收到静态广播消息");}
}
运行结果如下:

四,本地广播与全局广播
本地广播:仅在本app内部传播,其他app接收不到,保证了数据的安全性;
全局广播:可以在整个手机所有app之间传播,会有安全性问题,普通广播默认是全局广播;
本地广播的注册,发送和解除注册都需要通过LocalBroadcastManager类来完成,使用LocalBroadcastManager需要添加依赖:
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
另外,本地广播只能使用动态注册的方式,因为静态注册一般用于在应用启动时自动接收待定事件,而这些广播一定是全局广播;
1,本地广播的使用
(1)创建接收器,还是常规操作:
public class MyLocalBroadcastReceiver extends BroadcastReceiver {private static final String TAG = "MyLocalBroadcastReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "onReceive: 收到了本地广播");}
}
(2)通过LocalBroadcastManager类注册接收器:
//获取localBroadcastManager类
localBroadcastManager = LocalBroadcastManager.getInstance(this);IntentFilter intentFilter1 = new IntentFilter(TextUtil.ACTION_SEND_LOACL_RESULT);localBroadcastManager.registerReceiver(myLocalBroadcastReceiver, intentFilter1);
(3)发送广播:
Intent intent = new Intent();
intent.setAction(TextUtil.ACTION_SEND_LOACL_RESULT);
intent.putExtra(TextUtil.KEY_RESULT, "这是本地广播");
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
(4)解除注册:
@Override
protected void onDestroy() {super.onDestroy();localBroadcastManager.unregisterReceiver(myLocalBroadcastReceiver);
}
相关文章:
Broadcast:Android中实现组件及进程间通信
目录 一,Broadcast和BroadcastReceiver 1,简介 2,广播使用 二,静态注册和动态注册 三,无序广播和有序广播 1,有序广播的使用 2,有序广播的截断 3,有序广播的信息传递 四&am…...
5分钟熟练上手ES的具体使用
5分钟上手ES的具体使用 相信有很多同学想要去学习elk时会使用docker等一些方式去下载相关程序,但提到真正去使用es的一系列操作时又会知之甚少。于是这一篇博客应运而生。 本文就以下载好elk/efk系统后应该如何去使用为例,介绍es的具体操作。 es关键字…...
lambda 自调用递归
从前序与中序遍历序列构造二叉树 官方解析实在是记不住,翻别人的题解发现了一个有意思的写法 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {auto dfs [](auto&& dfs, auto&&…...
mac中git操作账号的删除
命令行玩的很溜的可以跳过 找到钥匙串访问 搜github、gitee就行了...
AI Agent的20个趋势洞察
结论整理自【QuestMobile2024 AI智能体应用洞察半年报】: AI原生应用(APP)一路高歌;豆包用户突破3000万;TOP10 APP以综合类应用为主。无论何种类型的AIGC APP都以智能体为“抓手”,专注于解决各种细分场景中的问题&am…...
Spring Boot-定时任务问题
Spring Boot 定时任务问题及其解决方案 1. 引言 在企业级应用中,定时任务是一项常见需求,通常用于自动化执行某些操作,如数据备份、日志清理、系统监控等。Spring Boot 提供了简洁易用的定时任务机制,允许开发者通过简单的配置来…...
从混乱到清晰!借助Kimi掌握螺旋型论文结构的秘诀!
AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 写学术论文有时会让人感到头疼,特别是在组织结构和理清思路时,往往觉得无从下手。 其实,找到合适的结构不仅能帮你清晰地表达研究成果,还能让你的论文更有说…...
中国电子学会202306青少年软件编程(Python)等级考试试卷(二级)真题
一、单选题(共25题,每题2分,共50分) 1、运行以下程序,如果通过键盘先后输入的数是1和3,输出的结果是?( ) a = int(input()) b = int(input()) if a < b:a = b print(a)A. 3 1 B. 1 3 C. 1 D. 3 2、运行以下程序,输出的结果是?( ) n = 10 s = 0 m = 1 while…...
样本册3D翻页电子版和印刷版同时拥有是一种什么体验
在数字化时代,样本册3D翻页电子版的兴起,让传统印刷版样本册面临着前所未有的挑战。与此同时,许多企业也开始尝试将两者相结合,以满足更多元化的市场需求。那么,拥有一份既具备数字化优势,又保留传统印刷…...
8586 括号匹配检验
### 思路 1. **初始化栈**:创建一个空栈用于存储左括号。 2. **遍历字符串**:逐个字符检查: - 如果是左括号(( 或 [),则入栈。 - 如果是右括号() 或 ]),则检查栈是…...
案例精选 | 聚铭助力河北省某市公安局筑牢网络安全防护屏障
近年来,各级公安机关积极响应信息化发展趋势,致力于提升公安工作的效能与核心战斗力。河北省某市公安局作为主管全市公安工作的市政府部门,承担着打击违法犯罪、维护社会稳定的重任。随着信息化建设的推进,局内系统数量、种类及数…...
VBS学习2:问题解决(文件中含义中文运行报错或者中文乱码)
文件中含义中文运行报错或者中文乱码 问题 msgbox"fdsfdsf大蘇打撒旦dsfsdffsdfsd发斯蒂芬斯蒂芬"解决 文件编码修改成GB2312...
首次揭秘行业内幕!范罗士、希喂、有哈、小米、安德迈宠物空气净化器实测分析
前段时间有个朋友来我家做客,看到我家三只长毛猫,家里还是干干净净的,他家一只短毛猫都猫毛满天飞。也是很细心,留意到我家猫拉完粑粑后,我立刻就去把宠物空气净化器开上了,他一点味都没闻到。 回家后立刻…...
1267:【例9.11】01背包问题(信奥一本通)
题目链接:信息学奥赛一本通(C版)在线评测系统 (ssoier.cn) 今天刚看完卡尔大哥讲解的01背包,今天手敲了一遍,还是很多问题,只能说自己还是刷题太少或者说是没理解到位。 代码如下 # include <iostrea…...
信息化时代下的高标准农田灌区:变革与机遇并存
在信息化时代的浪潮中,高标准农田灌区的建设与管理正经历着前所未有的变革,这既是一个挑战重重的历程,也孕育着无限的发展机遇。随着物联网、大数据、云计算以及人工智能等先进技术的飞速发展与融合应用,传统的农田灌溉模式正在被…...
【系统架构设计师-2013年真题】案例分析-答案及详解
更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【材料1】问题1问题2【材料2】问题1问题2问题3问题4【材料3】问题1问题2问题3【材料4】问题1问题2问题3【材料5】问题1问题2问题3【材料1】 阅读以下关于企业应用系统集成架构设计的说明,在答题纸上回答问题1和问题…...
git merge如何忽略部分路径
参考文章: Git - Ignore files during merge How to make git ignore a directory while merging 在进行git merge时,想忽略部分路径的回合。 如:将develop分支merge回master,但是忽略/path/to/folder路径 操作: gi…...
spring boot导入多个配置文件
1、简介 Spring Boot从2.4.x版本开始支持了导入文件的方式来加载配置参数,与spring.config.additional-location不同的是不用提前设置而且支持导入的文件类型相对来说要丰富很多。 我们只需要在application.properties/application.yml配置文件中通过spring.config.…...
硬件工程师笔试面试——无线通讯模块
目录 15、无线通讯模块 15.1 基础 无线通讯模块实物图 15.1.1 概念 15.1.2 常见的无线通讯模块及其特点 15.1.3 无线通讯模块参数 15.1.4 无线通讯模块工作原理 15.2 相关问题 15.2.1 如何根据项目需求选择合适的无线通讯模块? 15.2.2 无线通讯模块的安全性如何,如…...
开源PHP免费家谱应用Webtrees简介
1. 介绍 Webtrees是一个开源的在线家谱管理系统,支持 GEDCOM 格式,允许用户协作管理家谱数据。它是免费的,并且功能强大。Webtrees有大量活跃用户参与的交流社区,在全世界约有6800个服务器。这是一个服务器应用,可以多…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...
