Android --- 广播
广播是什么?
一种相互通信,传递信息的机制,组件内、进程间(App之间)
如何使用广播?
组成部分
发送者-发送广播
与启动其他四大组件一样,广播发送也是使用intent发送。
- 设置action:表示这个广播可以被哪些接收器接收到
- 通过 putExtra,传递额外的bundle信息
Intent intent = new Intent();intent.setAction(SEND_STATIC_ACTION);intent.putExtra("data","静态广播");sendBroadcast(intent);
接收者-广播接收
创建广播接收器
继承 BroadcastReceiver 类
或直接new该类的对象实例,然后重写方法 onReceive,在该方法中处理接收到的广播消息。
注册广播接收器
注册广播接收器有两种办法,静态注册和动态注册,可以分为两种广播
- 静态广播:常驻内存中,是在Manifest文件中注册的,可在App未启动时就监听广播
- 动态广播:App启动后注册,是在代码中注册以及解除注册的广播,解除注册后,广播也随时结束。
同时注册时,动态优于静态
静态广播
创建广播接收器类
// 静态广播接收器
public class StaticBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();Log.d("BroadcastReceiver","静态广播接收器接受了一个 - "+bundle.getString("data"));}
}
在 Manifest文件中注册广播接收器
<receiver android:name=".broadcastreceiver.receiver.StaticBroadcastReceiver"android:exported="true"><intent-filter><action android:name="send_static_action"></action></intent-filter></receiver>
动态广播
创建广播接收器
直接new该类的对象实例,然后重写方法 onReceive
// 创建广播接收器private BroadcastReceiver dynamicBroadcastReceiver= new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();Log.d("BroadcastReceiver","动态广播接收器接受了一个 - "+bundle.getString("data"));}};
注册广播接收者器类
一般在Activity的onCreate方法中注册
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broadcast_study);// 动态注册广播接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(SEND_DYNAMIC_ACTION);registerReceiver(dynamicBroadcastReceiver,intentFilter);}
解除注册
@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(dynamicBroadcastReceiver);}
无序广播、有序广播
按照广播接收顺序划分
- 无序广播-普通广播:所有接收器接收的广播没有先后顺序,几乎同时收到消息
- 有序广播:发送的广播会按照接收器的优先级顺序被接受,同一时刻只会有一个接收器收到广播,且收到广播之后可以对广播进行截断和修改
有序广播
发送
使用语句 sendOrderedBroadcast
广播接收器
注册时,设置优先级,优先级越大越先收到广播
// 动态注册广播接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(SEND_DYNAMIC_ACTION);intentFilter.setPriority(100);registerReceiver(dynamicBroadcastReceiver, intentFilter);// 注册有序广播// 有序广播设置优先级,优先级越大越先收到IntentFilter intentFilter1 = new IntentFilter();intentFilter1.addAction(SEND_DYNAMIC_ACTION);intentFilter1.setPriority(101);registerReceiver(broadcastReceiver2, intentFilter1);
截断广播
abortBroadcast(); 优先级高的广播接收器截断广播之后,下游的广播就不再会收到。
修改广播
上游的广播 使用 setResultExtras 传递一个新的 Bundle 或者使用 setResultData 传递一个字符串下游使用 getResultExtras 接收 Bundle,使用 getResultData 接收字符串
全局广播、本地广播
按照广播的传播范围划分
- 本地广播:app内部
- 全局广播:整个手机内部
全局广播
普通广播就是全局广播。
一个发送全局广播,在另一个app中接收到的例子:
App1
1.发送广播
Intent intent = new Intent();
intent.setAction(SEND_GLOBAL_ACTION);
intent.putExtra("data_global", "发送了一条全局广播");
sendBroadcast(intent);
App2
1.创建广播接收器,处理接收数据
// 接收来自 Androidsutdio App的广播// 创建广播接收器private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, intent.getExtras().getString("data_global"), Toast.LENGTH_LONG).show();Log.d("接受全局广播", intent.getExtras().getString("data_global"));}};
2.注册广播接收器
action与发送广播的action相同
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 注册广播接收器IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("send_global_action");registerReceiver(broadcastReceiver, intentFilter);}
3.解除广播接收器
@Overrideprotected void onDestroy() {super.onDestroy();// 解除广播接收器unregisterReceiver(broadcastReceiver);}

此时是由App2弹出的这条弹窗。
app2的logcat:

本地广播
只能使用动态注册,因为本地广播只能监听这个app内部的广播,在注册发送广播时,需要使用到LocalBroadcastManager 类。
注册
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broadcast_study);// 注册本地广播 - 只能动态注册LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);IntentFilter local_intentFilter = new IntentFilter();intentFilter1.addAction(SEND_LOCAL_ACTION);localBroadcastManager.registerReceiver(new LocalBroadcastReceiver(),local_intentFilter);}
发送
Intent intent = new Intent();intent.setAction(SEND_LOCAL_ACTION);intent.putExtra("data", "本地广播");localBroadcastManager.sendBroadcast(intent);
解除注册
Intent intent = new Intent();intent.setAction(SEND_LOCAL_ACTION);intent.putExtra("data", "本地广播");localBroadcastManager.sendBroadcast(intent);
广播的作用?
传递信息。
相关文章:
Android --- 广播
广播是什么? 一种相互通信,传递信息的机制,组件内、进程间(App之间) 如何使用广播? 组成部分 发送者-发送广播 与启动其他四大组件一样,广播发送也是使用intent发送。 设置actionÿ…...
AR 眼镜之-蓝牙电话-实现方案
目录 📂 前言 AR 眼镜系统版本 蓝牙电话 来电铃声 1. 🔱 技术方案 1.1 结构框图 1.2 方案介绍 1.3 实现方案 步骤一:屏蔽原生蓝牙电话相关功能 步骤二:自定义蓝牙电话实现 2. 💠 屏蔽原生蓝牙电话相关功能 …...
stl-set
目录 目录 内部自动有序、不含重复元素 关于能不能自己造一个cmp,还挺复杂。 访问:只能用迭代器且受限 添加元素:没有pushback,用insert 复杂度:ologn 编辑 查找元素find()࿱…...
【Stable Diffusion】(基础篇五)—— 使用SD提升分辨率
使用SD提升分辨率 本系列博客笔记主要参考B站nenly同学的视频教程,传送门:B站第一套系统的AI绘画课!零基础学会Stable Diffusion,这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 在前期作画的…...
5.CSS学习(浮动)
浮动(float) 是一种传统的网页布局方式,通过浮动,可以使元素脱离文档流的控制,使其横向排列。 其编写在CSS样式中。 float:none(默认值) 元素不浮动。 float:left 设置的元素在其包含…...
Spring Cloud微服务项目统一封装数据响应体
在微服务架构下,处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发,统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体,并分享…...
java算法day20
java算法day20 701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点108 将有序数组转换为二叉搜索树 本次的题目都是用递归函数的返回值来完成,多熟悉这样的用法,很方便。 其实我感觉,涉及构造二叉树的题目,用递归函数的返回值…...
web自动化测试-python+selenium+unitest
文章目录 Web自动化测试工具1. 主流的Web自动化测试工具2. Selenium家族史 Web自动化测试环境搭建基于Python环境搭建示例:通过程序启动浏览器,并打开百度首页,暂停3秒,关闭浏览器 页面元素定位1. 如何进行元素定位?2.…...
LeetCode题练习与总结:组合两个表--175
一、题目描述 SQL Schema > Pandas Schema > 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主…...
数据结构:二叉搜索树(简单C++代码实现)
目录 前言 1. 二叉搜索树的概念 2. 二叉搜索树的实现 2.1 二叉树的结构 2.2 二叉树查找 2.3 二叉树的插入和中序遍历 2.4 二叉树的删除 3. 二叉搜索树的应用 3.1 KV模型实现 3.2 应用 4. 二叉搜索树分析 总结 前言 本文将深入探讨二叉搜索树这一重要的数据结构。二…...
深入理解Prompt工程
前言:因为大模型的流行,衍生出了一个小领域“Prompt工程”,不知道大家会不会跟小编一样,不就是写提示吗,这有什么难的,不过大家还是不要小瞧了Prompt工程,现在很多大模型把会“Prompt工程”作为…...
代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和
文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…...
vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。
1、上个图,要实现这样的: Vxe Table v4.6 官方文档 2、使用 row-config.isCurrent 显示高亮行,当前行是唯一的;用户操作点击选项时会触发事件 current-change <template><div><p><vxe-button click"sel…...
Linux没有telnet 如何测试对端的端口状态
前段时间有人问uos没有telnet,又找不到包。 追问了一下为什么非要安装telnet,答复是要测试对端的端口号。 这里简单介绍一下,测试端口号的方法有很多,telent只是在windows上经常使用,linux已很少安装并使用该命令&…...
花几千上万学习Java,真没必要!(二十九)
1、基本数据类型包装类: 测试代码1: package apitest.com; //使用Integer类的不同方法处理整数。 //将字符串转换为整数(parseInt)和Integer对象(valueOf), //将整数转换回字符串(…...
C#如何引用dll动态链接库文件的注释
1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意:XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下,之后又将XML文件复制到相同的目录下,需要删除引用&am…...
WordPress原创插件:自定义文章标题颜色
插件设置截图 文章编辑时,右边会出现一个标题颜色设置,可以设置为任何颜色 更新记录:从输入颜色css代码,改为颜色选择器,更方便! 插件免费下载 https://download.csdn.net/download/huayula/89585192…...
Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化
如果某些字段在每个构造函数中都要进行初始化,很多人都喜欢在字段声明时就进行初始化,对于一个非继承自MonoBehaviour的脚步,这样做是没有问题的,然而继承自MonoBehaviour后就会造成内存的浪费,为什么呢?因…...
.NET Core中如何集成RabbitMQ
在.NET Core中集成RabbitMQ主要涉及到几个步骤,包括安装RabbitMQ的NuGet包、建立连接、定义队列、发送和接收消息等。下面是一个简单的指南来展示如何在.NET Core应用程序中集成RabbitMQ。 目录 1. 安装RabbitMQ.Client NuGet包 2. 建立连接 3. 定义队列 4. 发…...
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)
目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器与传感器代码 代码讲解 2. MQTT Broker设置 3. 数据接收与处理 代码讲解 4. 数据存储与分析 5. 数据分析与可视化 代码讲解 6. 数据可视化 项目总结 项目概述 随着电子商务的快…...
别再混淆了!JavaScript与Java的10个本质区别(附常见面试题解析)
别再混淆了!JavaScript与Java的10个本质区别(附常见面试题解析) 当面试官问"Java和JavaScript有什么区别"时,超过60%的初级开发者会给出"它们就像汽车和地毯的关系"这类玩笑式回答。但真正理解这两种语言的核…...
3步实战指南:在Kodi上实现115网盘原码播放的完整方案
3步实战指南:在Kodi上实现115网盘原码播放的完整方案 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 115proxy-for-kodi插件是一款专为Kodi媒体中心设计的115网盘代理服务工具…...
Closure Library调试技巧:10个高效调试方法提升开发效率
Closure Library调试技巧:10个高效调试方法提升开发效率 【免费下载链接】closure-library Googles common JavaScript library 项目地址: https://gitcode.com/gh_mirrors/cl/closure-library Closure Library是Google开发的强大JavaScript库,提…...
菊水PBZ40可编程电源RS232C通信协议实战指南
1. 认识菊水PBZ40可编程电源 如果你正在实验室里捣鼓自动化测试系统,大概率会遇到需要精确控制电源输出的场景。菊水PBZ40就是这样一款专业选手,它不仅能提供稳定的直流输出,还能模拟各种交流波形信号。我第一次接触这台设备时,就…...
MPO光纤跳线:从结构解析到数据中心高密度布线实战
1. MPO光纤跳线:高密度布线的秘密武器 第一次接触MPO光纤跳线时,我被它的"小身材大容量"震惊了。这个看起来和普通SC连接器差不多大小的家伙,居然能塞下12根甚至24根光纤!这就像在普通U盘大小的空间里装下了整个移动硬盘…...
【实战】VSCode插件离线安装全攻略:从下载到部署
1. 为什么需要离线安装VSCode插件 作为一名在开发一线摸爬滚打多年的老码农,我遇到过太多因为网络问题导致插件安装失败的场景。比如去年在某大型制造企业的工厂MES系统升级项目中,开发环境完全隔离外网,但团队又急需使用GitLens和Python插件…...
告别NVIDIA?ZLUDA让你的AMD显卡秒变CUDA设备
告别NVIDIA?ZLUDA让你的AMD显卡秒变CUDA设备 【免费下载链接】ZLUDA CUDA on Intel GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 在AI计算和高性能图形处理领域,CUDA生态曾长期被NVIDIA显卡垄断,高昂的硬件成本让许…...
如何在Ozon产品测款?用CaptainAI精准锁定爆款潜力款
做Ozon运营,测款是店铺长期盈利的关键——选对款能事半功倍,测错款则会积压库存、浪费成本,中小卖家资金精力有限,盲目铺货测款易陷入“高投入、低回报”困境。很多卖家测款常踩坑:凭感觉跟风选热门款,竞争…...
别再手动算了!用Matlab RF Toolbox一键搞定S/Z/Y/ABCD参数转换(附3dB电桥实例代码)
射频工程师的救星:Matlab RF Toolbox参数转换全攻略 每次面对S/Z/Y/ABCD参数的手动转换,是不是总有种想摔计算器的冲动?那些复杂的矩阵运算和容易出错的推导过程,简直是在浪费生命。作为一名射频工程师,我深知这种痛苦…...
基于SenseVoice-Small的语音日记应用开发指南
基于SenseVoice-Small的语音日记应用开发指南 1. 语音日记应用的核心价值 你有没有想过,每天用说话的方式记录生活,然后自动变成文字日记?这种语音日记的方式特别适合忙碌的现代人,不用打字,随时随地都能记录心情和想…...
