深入分析 Android BroadcastReceiver (二)
文章目录
- 深入分析 Android BroadcastReceiver (二)
- 1. 深入理解 BroadcastReceiver 的高级使用和优化
- 2. 有序广播(Ordered Broadcasts)
- 2.1 实现有序广播
- 3. 粘性广播(Sticky Broadcasts)
- 3.1 使用粘性广播
- 4. 本地广播(LocalBroadcastManager)
- 4.1 使用本地广播
- 5. 安全性与权限管理
- 5.1 声明权限
- 6. 性能优化
- 6.1 避免耗时操作
- 6.2 动态注册和取消注册
- 6.3 使用本地广播
- 7. 实战示例
- 7.1 本地广播接收器
- 7.2 动态注册和取消注册
- 7.3 有序广播接收器
- 7.4 AndroidManifest.xml 中声明
- 8. 总结
深入分析 Android BroadcastReceiver (二)
1. 深入理解 BroadcastReceiver 的高级使用和优化
BroadcastReceiver
是 Android 中用于接收广播消息的重要组件。通过对 BroadcastReceiver
的高级使用和优化,开发者可以实现更加高效、灵活的应用逻辑。
2. 有序广播(Ordered Broadcasts)
有序广播允许多个接收器按照优先级顺序接收广播,并且可以中断广播的传播。
2.1 实现有序广播
- 发送有序广播:
Intent intent = new Intent("com.example.ORDERED_ACTION");
sendOrderedBroadcast(intent, null);
- 接收有序广播:
在 AndroidManifest.xml 中声明接收器,并设置优先级。
<receiver android:name=".OrderedReceiver" android:priority="100"><intent-filter><action android:name="com.example.ORDERED_ACTION" /></intent-filter>
</receiver>
实现 BroadcastReceiver
:
public class OrderedReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 处理有序广播// 可以调用 abortBroadcast() 来中断广播abortBroadcast();}
}
3. 粘性广播(Sticky Broadcasts)
粘性广播已被弃用,但仍然可以在某些特定场景下使用。它允许广播在发送后被系统保留,后续接收器可以获取到最后一次的广播内容。
3.1 使用粘性广播
- 发送粘性广播:
Intent intent = new Intent("com.example.STICKY_ACTION");
sendStickyBroadcast(intent);
- 接收粘性广播:
动态注册接收器来接收粘性广播。
IntentFilter filter = new IntentFilter("com.example.STICKY_ACTION");
registerReceiver(stickyReceiver, filter);
- 清除粘性广播:
removeStickyBroadcast(intent);
4. 本地广播(LocalBroadcastManager)
本地广播是一种在应用内部发送广播的机制,避免跨进程通信的开销,同时增加安全性。
4.1 使用本地广播
- 发送本地广播:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
Intent localIntent = new Intent("com.example.LOCAL_ACTION");
localBroadcastManager.sendBroadcast(localIntent);
- 接收本地广播:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
BroadcastReceiver localReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 处理本地广播}
};
IntentFilter localFilter = new IntentFilter("com.example.LOCAL_ACTION");
localBroadcastManager.registerReceiver(localReceiver, localFilter);
5. 安全性与权限管理
为了提高安全性,广播接收器可以声明权限,以确保只有具有相应权限的应用程序才能发送或接收广播。
5.1 声明权限
在 AndroidManifest.xml 中声明接收器的权限:
<receiver android:name=".MyBroadcastReceiver" android:permission="com.example.MY_PERMISSION"><intent-filter><action android:name="com.example.SENSITIVE_ACTION" /></intent-filter>
</receiver>
发送广播时指定权限:
Intent intent = new Intent("com.example.SENSITIVE_ACTION");
sendBroadcast(intent, "com.example.MY_PERMISSION");
6. 性能优化
6.1 避免耗时操作
在 onReceive
方法中执行耗时操作会阻塞广播的处理,导致应用卡顿。可以通过启动 Service
或使用 AsyncTask
来处理耗时操作。
@Override
public void onReceive(Context context, Intent intent) {Intent serviceIntent = new Intent(context, MyIntentService.class);context.startService(serviceIntent);
}
6.2 动态注册和取消注册
动态注册的 BroadcastReceiver
应在合适的生命周期方法中注册和取消注册,以避免内存泄漏和无用的广播接收。
@Override
protected void onStart() {super.onStart();IntentFilter filter = new IntentFilter("com.example.MY_ACTION");registerReceiver(myReceiver, filter);
}@Override
protected void onStop() {super.onStop();unregisterReceiver(myReceiver);
}
6.3 使用本地广播
尽量使用 LocalBroadcastManager
发送和接收广播,减少跨进程通信的开销。
7. 实战示例
以下是一个综合示例,展示了如何使用本地广播、有序广播以及优化策略:
7.1 本地广播接收器
public class LocalReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 处理本地广播}
}
7.2 动态注册和取消注册
public class MainActivity extends AppCompatActivity {private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);localBroadcastManager = LocalBroadcastManager.getInstance(this);localReceiver = new LocalReceiver();}@Overrideprotected void onStart() {super.onStart();IntentFilter filter = new IntentFilter("com.example.LOCAL_ACTION");localBroadcastManager.registerReceiver(localReceiver, filter);}@Overrideprotected void onStop() {super.onStop();localBroadcastManager.unregisterReceiver(localReceiver);}private void sendLocalBroadcast() {Intent intent = new Intent("com.example.LOCAL_ACTION");localBroadcastManager.sendBroadcast(intent);}
}
7.3 有序广播接收器
public class OrderedReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 处理有序广播}
}
7.4 AndroidManifest.xml 中声明
<receiver android:name=".OrderedReceiver" android:priority="100"><intent-filter><action android:name="com.example.ORDERED_ACTION" /></intent-filter>
</receiver>
8. 总结
BroadcastReceiver
是 Android 中处理广播消息的重要组件。通过合理使用本地广播、有序广播、粘性广播等高级特性,以及优化注册和处理过程,可以提高应用的性能和安全性。在实际项目中,开发者需要根据具体需求选择合适的广播机制,并遵循最佳实践以确保应用的稳定性和高效性。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |
相关文章:
深入分析 Android BroadcastReceiver (二)
文章目录 深入分析 Android BroadcastReceiver (二)1. 深入理解 BroadcastReceiver 的高级使用和优化2. 有序广播(Ordered Broadcasts)2.1 实现有序广播 3. 粘性广播(Sticky Broadcasts)3.1 使用粘性广播 4. 本地广播(…...
Linux常⽤服务器构建-ssh和scp
目录 1.ssh <1>ssh介绍 <2>安装ssh A.安装ssh服务器 B.远程登陆 <3>使⽤ssh连接服务器 2.scp 本地⽂件复制到远程: 本地⽬录复制到远程: 远程⽂件复制到本地: 远程⽬录复制到本地: 1.ssh <1>…...
《QT实用小工具·七十》openssl+qt开发的P2P文件加密传输工具
1、概述 源码放在文章末尾 该项目实现了P2P的文件加密传输功能,具体包含如下功能: 1、 多文件多线程传输 2、rsaaes文件传输加密 3、秘钥随机生成 4、断点续传 5、跨域传输引导服务器 项目界面如下所示: 接收界面 发送界面 RSA秘钥生成…...
短链接生成器排名前三!长链接转化成短链接工具有哪些?
在现今的网络营销环境中,短链接的应用越来越广泛。它不仅能简化长链接,提高分享效果,还能提升企业品牌形象和用户体验。于是,市场上涌现出众多短链接生成工具。本文将为您揭秘短链接生成器排名前三的产品,帮您找到最适…...
Vue50-mixin混入
一、为什么要使用 mixin混入 两个组件共享一个配置。 二、使用 mixin混入 2-1、创建一个混合js文件 2-2、引入混合js文件 1、局部混合 在每个组件中都引入混合js文件 注意: 混合就是复用配置,vm实例中的所有的配置项,都能在混合.js文件中写…...
Java创建线程的方式
继承Thread类 这是创建线程的基本方式之一。你需要创建一个新的类,该类继承自Thread类,并重写run()方法。然后,你可以创建这个类的一个实例并调用它的start()方法来启动新线程。 public class MyThread extends Thread { Override public vo…...
C# 程序结构
C# 程序结构 C#(读作“C-sharp”)是一种由微软开发的高级编程语言,它是.NET框架的一部分。C# 设计用于现代软件开发,具有强大的类型系统、丰富的库支持和面向对象的特性。本文将详细介绍C#程序的基本结构,包括其语法、类型系统、控制结构、类和对象等。 C# 程序的基本结…...
【Linux】使用 iptables 验证访问HDFS 所使用到的端口
目录 编辑 一、实操背景 二、iptables 简介 三、模拟操作 一、实操背景 背景: 在客户有外网的服务器需要访问内网大数据集群HDFS,使用iptable模拟测试需要开放的端口。 二、iptables 简介 具体介绍看文章: 【Linux】Iptables 详解与实战…...
工程设计问题---多盘离合器制动器设计问题
这个问题的主要目的是使多片式离合器制动器的质量最小化。在这个问题中,使用了五个整数决策变量,它们是内半径(x1)、外半径(x2)、盘厚度(x3)、致动器的力(x4)…...
triton矩阵乘以及缓存优化
这里triton.cdiv(M, META[BLOCK_SIZE_M]) * triton.cdiv(N, META[BLOCK_SIZE_N]),所以grid的形状是一维的。 观察函数内部 pid tl.program_id(axis0),因为grid是一维的,所以这里就是总块数,我们假设实际A*BC, A&…...
springboot 搭建一个 测试Kafka 集群连通性demo
废话不多说直接上代码: 1.pom <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka --><dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><ve…...
Ant Design Vue 动态表头和数据填充
创作动态表头和数据填充的前端应用:使用 Ant Design Vue 在现代前端开发中,动态表格是一个常见而且非常有用的功能。Ant Design Vue作为一个优秀的UI组件库,为开发者提供了丰富的组件和API来实现复杂的前端需求,包括动态表头和数…...
在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析
在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析 在Spring Cloud项目中生成OpenAPI 3文档,可以使用Springdoc OpenAPI。Springdoc OpenAPI提供了一种简单的方法来生成符合OpenAPI 3规范的API文档。以下是详细的步骤和解析,展示如…...
Linux shell 重定向输入和输出
Linux shell 重定向输入和输出 1. Standard I/O streams2. Redirecting to and from the standard file handles (标准文件句柄的重定向)2.1. command > file2.2. command >> file2.3. command 2> file2.4. command 2>> file2.5. command < file2.6. comm…...
electron录制工具-视频保存、编辑页面
效果如下 electron录屏-保存录制视频 资源 导出视频使用了 mp4-wasm,基本使用,可参考 此文 想法 1、点击按钮导出,弹出选择保存文件夹 2、保存成功后,自动打开保存后文件夹窗口并关闭窗口 实现 获取保存文件夹路径࿰…...
curl命令行发送post/get请求
文章目录 curl概述post请求get请求 curl概述 curl 是一个命令行实用程序,允许用户创建网络请求curl 在Windows、 Linux 和 Mac 上皆可使用 post请求 一个简单的 POST 请求 -X:指定与远程服务器通信时将使用哪种 HTTP 请求方法 curl -X POST http://ex…...
Redis 分片集群
一. 前言 前面文章介绍了主从集群和哨兵模式。其中主从集群可以通过读写分离的方式解决高并发场景下的读问题;而在主节点出现故障时,又可以通过哨兵模式的自动选举来实现高可用。 Redis 主从集群 && 哨兵模式 二. Redis 分片集群 2.1 分片集群…...
学习分享-Callable 和 Runnable 任务
前言 顺带回顾学习一下Callable 或 Runnable 任务 Callable 和 Runnable 任务 Callable 和 Runnable 是 Java 中用于定义任务的接口,它们主要用于并发编程,允许任务在独立的线程中运行。 Runnable 任务 Runnable 是一个函数式接口,只包含…...
three.js 基础01
1.场景创建 Scene() 2.常用形状集几何体「Geometry」[可设置长宽高等内容,如:new THREE.BoxGeometry(...)] 长方体 BoxGeometry圆柱体 CylinderGeometry 球体SphereGeometry圆锥体ConeGeometry矩形平面 PlaneGeometry 圆面体 CircleGeo…...
使用file.transferTo()做Java文件复制,目标文件存在时,是抛异常还是覆盖写入?
背景 最近在做一个项目,在服务端涉及到文件的复制操作,于是想到了 Java 中 FileInputStream 类的 transferTo() 方法。这里简单记录一下用法,另外,如果目标文件已经存在,该如何处理这种情况呢?是出现异常还…...
Python:线性查找法
什么是线性搜索算法? 线性搜索算法是一种基本的搜索技术,用于查找目标元素是否存在于一个集合(通常是列表或数组)中。该算法的工作原理非常简单:它从集合的第一个元素开始逐个检查,直到找到目标元素或遍历完…...
IDEA 设置主题、背景图片、背景颜色
一、设置主题 1、点击菜单 File -> Settings : 点击 Settings 菜单 2、点击 Editor -> Color Scheme -> Scheme, 小哈的 IDEA 版本号为 2022.2.3 , 官方默认提供了 4 种主题: Classic Light (经典白) ;Darcula (暗黑主…...
【elementui源码解析】如何实现自动渲染md文档-第三篇
目录 1.前言 2.webpack.demo.js 3.markdown文档 4.fence.js 1)tokens 2)::: 3) 5.containers.js 1)markdown-it-container 2)md.use() 3)代码逻辑 4)containers小结 6.congfig.js …...
this指针如何使C++成员指针可调用
在C中,this指针是一个隐藏的指针,指向当前对象实例。它在成员函数中自动可用,用于访问该对象的成员变量和成员函数。理解this指针的工作原理有助于理解为什么指向成员的指针是可调用的。在本文中,我们将详细探讨this指针的概念&am…...
Redis数据结构之字符串(sds)
Redis数据结构之字符串(sds) redisObject 定义如下 struct redisObject {unsigned type:4; //数据类型unsigned encoding:4; /*encoding 编码格式,及存储数据使用的数据结构,同一类型的数据,Redis 会根据数据量,占用内…...
tokenization(二)子词切分方法
文章目录 概述BPE构建词表词元化代码实现 WordPieceUnigram估算概率(E)删除词元(M) 参考资料 概述 接上回,子词词元化(Subwords tokenization)是平衡字符级别和词级别的一种方法,也…...
慈善组织管理系统设计
一、用户角色与权限 慈善组织管理系统设计首先需要考虑的是用户角色与权限的划分。系统应明确区分不同的用户角色,如管理员、项目负责人、财务人员、捐赠者等,并为每个角色分配相应的权限。管理员应拥有最高的权限,能够管理系统全局…...
大疆Pocket3手持记录仪格式化恢复方法
大疆Pocket系列是手持类产品,此类产品处理过不少像Pocket、Pocket2、Pocket3基本上涉及Pocket全系列,今天来看一个Pocket3误格式化之后的恢复方法。 故障存储: 120G存储卡 /文件系统:exFAT 故障现象: 在备份视频数据时由于操作失误导致初…...
Mybatis的面试题
1. 什么是一级缓存什么是二级缓存? MyBatis是一款优秀的持久层框架,它提供了一级缓存和二级缓存来提高数据库访问性能。 一级缓存 一级缓存是指在同一个SqlSession中进行的缓存。当MyBatis执行查询时,查询结果会被缓存在SqlSession的内存中…...
渗透测试之内核安全系列课程:Rootkit技术初探(五)
今天,我们来讲一下内核安全! 本文章仅提供学习,切勿将其用于不法手段! 目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在…...
刚建设的网站多久能在百度查到/如何刷关键词指数
#sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行:PermitRootLogin prohibit-password 新建一行 添加:PermitRootLogin yes 重启服务 #sudo service ssh restart sudo passwd root #设置密码 然后ssh root192.168.2.21就可以登录了...
政府采购网站的建设情况/每日财经要闻
这个性质叫“稀缺”。魔法世界里也得有稀缺。《西游记》里的神仙们日子过得好像什么都不缺,可也得定期吃些蟠桃、人参果之类能增寿的东西。谁控制稀缺资源,谁就掌握权力。王母娘娘控制了蟠桃,定期召开蟠桃大会给各路神仙延长寿命,…...
wordpress真伪查询主题/微博营销策略
当MySQL单表的数据库过大时,数据库的访问速度会下降,“数据量大”问题的常见解决方案是“水平切分”。MySQL常见的水平切分方式有哪些?回答:分库分表,分区表什么是MySQL的分库分表?回答:把一个很…...
青海公司网站建设哪家好/网站测速工具
1、大致介绍: >_<" 大致执行顺序是:ipl10.nas->asmhead.nas->bootpack.c PS: 这里bootpack.c要调用graphic.c、dsctbl.c、fifo.c、int.c实现功能,其中有些函数还必须汇编来写,所以单独写一个汇编文件naskfunc.na…...
网站建设方案模板高校/东莞今日头条最新消息
09 Eclipse设置代码注释模版背景博客正文背景 在团队协作开发的项目中,为了降低沟通和维护成本,项目组成员使用统一的编码规范和注释规范显得尤为重要。本文就说一说如果在Eclipse中设置代码注释模版,技术经理可以要求所有的开发人员设置为统…...
给传销做网站什么罪/腾讯广告投放推广平台
前面一篇展示了一个简单工厂模式,这一篇主要是对比,工厂方法模式比简单工厂模式好在哪里?为什么要用这个模式?这个模式的精髓在哪里? 就以计算器为例,结果图如下: 加减乘除运算都是继承自基类运…...