当前位置: 首页 > news >正文

深入分析 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 实现有序广播

  1. 发送有序广播
Intent intent = new Intent("com.example.ORDERED_ACTION");
sendOrderedBroadcast(intent, null);
  1. 接收有序广播

在 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 使用粘性广播

  1. 发送粘性广播
Intent intent = new Intent("com.example.STICKY_ACTION");
sendStickyBroadcast(intent);
  1. 接收粘性广播

动态注册接收器来接收粘性广播。

IntentFilter filter = new IntentFilter("com.example.STICKY_ACTION");
registerReceiver(stickyReceiver, filter);
  1. 清除粘性广播
removeStickyBroadcast(intent);

4. 本地广播(LocalBroadcastManager)

本地广播是一种在应用内部发送广播的机制,避免跨进程通信的开销,同时增加安全性。

4.1 使用本地广播

  1. 发送本地广播
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
Intent localIntent = new Intent("com.example.LOCAL_ACTION");
localBroadcastManager.sendBroadcast(localIntent);
  1. 接收本地广播
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. 有序广播&#xff08;Ordered Broadcasts&#xff09;2.1 实现有序广播 3. 粘性广播&#xff08;Sticky Broadcasts&#xff09;3.1 使用粘性广播 4. 本地广播&#xff08;…...

Linux常⽤服务器构建-ssh和scp

目录 1.ssh <1>ssh介绍 <2>安装ssh A.安装ssh服务器 B.远程登陆 <3>使⽤ssh连接服务器 2.scp 本地⽂件复制到远程&#xff1a; 本地⽬录复制到远程&#xff1a; 远程⽂件复制到本地&#xff1a; 远程⽬录复制到本地&#xff1a; 1.ssh <1>…...

《QT实用小工具·七十》openssl+qt开发的P2P文件加密传输工具

1、概述 源码放在文章末尾 该项目实现了P2P的文件加密传输功能&#xff0c;具体包含如下功能&#xff1a; 1、 多文件多线程传输 2、rsaaes文件传输加密 3、秘钥随机生成 4、断点续传 5、跨域传输引导服务器 项目界面如下所示&#xff1a; 接收界面 发送界面 RSA秘钥生成…...

短链接生成器排名前三!长链接转化成短链接工具有哪些?

在现今的网络营销环境中&#xff0c;短链接的应用越来越广泛。它不仅能简化长链接&#xff0c;提高分享效果&#xff0c;还能提升企业品牌形象和用户体验。于是&#xff0c;市场上涌现出众多短链接生成工具。本文将为您揭秘短链接生成器排名前三的产品&#xff0c;帮您找到最适…...

Vue50-mixin混入

一、为什么要使用 mixin混入 两个组件共享一个配置。 二、使用 mixin混入 2-1、创建一个混合js文件 2-2、引入混合js文件 1、局部混合 在每个组件中都引入混合js文件 注意&#xff1a; 混合就是复用配置&#xff0c;vm实例中的所有的配置项&#xff0c;都能在混合.js文件中写…...

Java创建线程的方式

继承Thread类 这是创建线程的基本方式之一。你需要创建一个新的类&#xff0c;该类继承自Thread类&#xff0c;并重写run()方法。然后&#xff0c;你可以创建这个类的一个实例并调用它的start()方法来启动新线程。 public class MyThread extends Thread { Override public vo…...

C# 程序结构

C# 程序结构 C#(读作“C-sharp”)是一种由微软开发的高级编程语言,它是.NET框架的一部分。C# 设计用于现代软件开发,具有强大的类型系统、丰富的库支持和面向对象的特性。本文将详细介绍C#程序的基本结构,包括其语法、类型系统、控制结构、类和对象等。 C# 程序的基本结…...

【Linux】使用 iptables 验证访问HDFS 所使用到的端口

目录 ​编辑 一、实操背景 二、iptables 简介 三、模拟操作 一、实操背景 背景&#xff1a; 在客户有外网的服务器需要访问内网大数据集群HDFS&#xff0c;使用iptable模拟测试需要开放的端口。 二、iptables 简介 具体介绍看文章&#xff1a; 【Linux】Iptables 详解与实战…...

工程设计问题---多盘离合器制动器设计问题

这个问题的主要目的是使多片式离合器制动器的质量最小化。在这个问题中&#xff0c;使用了五个整数决策变量&#xff0c;它们是内半径&#xff08;x1&#xff09;、外半径&#xff08;x2&#xff09;、盘厚度&#xff08;x3&#xff09;、致动器的力&#xff08;x4&#xff09;…...

triton矩阵乘以及缓存优化

这里triton.cdiv(M, META[BLOCK_SIZE_M]) * triton.cdiv(N, META[BLOCK_SIZE_N])&#xff0c;所以grid的形状是一维的。 观察函数内部 pid tl.program_id(axis0)&#xff0c;因为grid是一维的&#xff0c;所以这里就是总块数&#xff0c;我们假设实际A*BC&#xff0c; A&…...

springboot 搭建一个 测试Kafka 集群连通性demo

废话不多说直接上代码&#xff1a; 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 动态表头和数据填充

创作动态表头和数据填充的前端应用&#xff1a;使用 Ant Design Vue 在现代前端开发中&#xff0c;动态表格是一个常见而且非常有用的功能。Ant Design Vue作为一个优秀的UI组件库&#xff0c;为开发者提供了丰富的组件和API来实现复杂的前端需求&#xff0c;包括动态表头和数…...

在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析

在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析 在Spring Cloud项目中生成OpenAPI 3文档&#xff0c;可以使用Springdoc OpenAPI。Springdoc OpenAPI提供了一种简单的方法来生成符合OpenAPI 3规范的API文档。以下是详细的步骤和解析&#xff0c;展示如…...

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&#xff0c;基本使用&#xff0c;可参考 此文 想法 1、点击按钮导出&#xff0c;弹出选择保存文件夹 2、保存成功后&#xff0c;自动打开保存后文件夹窗口并关闭窗口 实现 获取保存文件夹路径&#xff0…...

curl命令行发送post/get请求

文章目录 curl概述post请求get请求 curl概述 curl 是一个命令行实用程序&#xff0c;允许用户创建网络请求curl 在Windows、 Linux 和 Mac 上皆可使用 post请求 一个简单的 POST 请求 -X&#xff1a;指定与远程服务器通信时将使用哪种 HTTP 请求方法 curl -X POST http://ex…...

Redis 分片集群

一. 前言 前面文章介绍了主从集群和哨兵模式。其中主从集群可以通过读写分离的方式解决高并发场景下的读问题&#xff1b;而在主节点出现故障时&#xff0c;又可以通过哨兵模式的自动选举来实现高可用。 Redis 主从集群 && 哨兵模式 二. Redis 分片集群 2.1 分片集群…...

学习分享-Callable 和 Runnable 任务

前言 顺带回顾学习一下Callable 或 Runnable 任务 Callable 和 Runnable 任务 Callable 和 Runnable 是 Java 中用于定义任务的接口&#xff0c;它们主要用于并发编程&#xff0c;允许任务在独立的线程中运行。 Runnable 任务 Runnable 是一个函数式接口&#xff0c;只包含…...

three.js 基础01

1.场景创建 Scene() 2.常用形状集几何体「Geometry」[可设置长宽高等内容&#xff0c;如&#xff1a;new THREE.BoxGeometry(...)] 长方体 BoxGeometry圆柱体 CylinderGeometry 球体SphereGeometry圆锥体ConeGeometry矩形平面 PlaneGeometry 圆面体 CircleGeo…...

使用file.transferTo()做Java文件复制,目标文件存在时,是抛异常还是覆盖写入?

背景 最近在做一个项目&#xff0c;在服务端涉及到文件的复制操作&#xff0c;于是想到了 Java 中 FileInputStream 类的 transferTo() 方法。这里简单记录一下用法&#xff0c;另外&#xff0c;如果目标文件已经存在&#xff0c;该如何处理这种情况呢&#xff1f;是出现异常还…...

Python:线性查找法

什么是线性搜索算法&#xff1f; 线性搜索算法是一种基本的搜索技术&#xff0c;用于查找目标元素是否存在于一个集合&#xff08;通常是列表或数组&#xff09;中。该算法的工作原理非常简单&#xff1a;它从集合的第一个元素开始逐个检查&#xff0c;直到找到目标元素或遍历完…...

IDEA 设置主题、背景图片、背景颜色

一、设置主题 1、点击菜单 File -> Settings : 点击 Settings 菜单 2、点击 Editor -> Color Scheme -> Scheme, 小哈的 IDEA 版本号为 2022.2.3 , 官方默认提供了 4 种主题&#xff1a; Classic Light &#xff08;经典白&#xff09; ;Darcula &#xff08;暗黑主…...

【elementui源码解析】如何实现自动渲染md文档-第三篇

目录 1.前言 2.webpack.demo.js 3.markdown文档 4.fence.js 1&#xff09;tokens 2&#xff09;::: 3&#xff09; 5.containers.js 1&#xff09;markdown-it-container 2&#xff09;md.use() 3&#xff09;代码逻辑 4&#xff09;containers小结 6.congfig.js …...

this指针如何使C++成员指针可调用

在C中&#xff0c;this指针是一个隐藏的指针&#xff0c;指向当前对象实例。它在成员函数中自动可用&#xff0c;用于访问该对象的成员变量和成员函数。理解this指针的工作原理有助于理解为什么指向成员的指针是可调用的。在本文中&#xff0c;我们将详细探讨this指针的概念&am…...

Redis数据结构之字符串(sds)

Redis数据结构之字符串(sds) redisObject 定义如下 struct redisObject {unsigned type:4; //数据类型unsigned encoding:4; /*encoding 编码格式&#xff0c;及存储数据使用的数据结构&#xff0c;同一类型的数据&#xff0c;Redis 会根据数据量&#xff0c;占用内…...

tokenization(二)子词切分方法

文章目录 概述BPE构建词表词元化代码实现 WordPieceUnigram估算概率&#xff08;E&#xff09;删除词元&#xff08;M&#xff09; 参考资料 概述 接上回&#xff0c;子词词元化&#xff08;Subwords tokenization&#xff09;是平衡字符级别和词级别的一种方法&#xff0c;也…...

慈善组织管理系统设计

一、用户角色与权限 慈善组织管理系统设计首先需要考虑的是用户角色与权限的划分。系统应明确区分不同的用户角色&#xff0c;如管理员、项目负责人、财务人员、捐赠者等&#xff0c;并为每个角色分配相应的权限。管理员应拥有最高的权限&#xff0c;能够管理系统全局&#xf…...

大疆Pocket3手持记录仪格式化恢复方法

大疆Pocket系列是手持类产品&#xff0c;此类产品处理过不少像Pocket、Pocket2、Pocket3基本上涉及Pocket全系列&#xff0c;今天来看一个Pocket3误格式化之后的恢复方法。 故障存储: 120G存储卡 /文件系统&#xff1a;exFAT 故障现象: 在备份视频数据时由于操作失误导致初…...

Mybatis的面试题

1. 什么是一级缓存什么是二级缓存&#xff1f; MyBatis是一款优秀的持久层框架&#xff0c;它提供了一级缓存和二级缓存来提高数据库访问性能。 一级缓存 一级缓存是指在同一个SqlSession中进行的缓存。当MyBatis执行查询时&#xff0c;查询结果会被缓存在SqlSession的内存中…...

渗透测试之内核安全系列课程:Rootkit技术初探(五)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…...

刚建设的网站多久能在百度查到/如何刷关键词指数

#sudo vim /etc/ssh/sshd_config 找到并用#注释掉这行&#xff1a;PermitRootLogin prohibit-password 新建一行 添加&#xff1a;PermitRootLogin yes 重启服务 #sudo service ssh restart sudo passwd root #设置密码 然后ssh root192.168.2.21就可以登录了...

政府采购网站的建设情况/每日财经要闻

这个性质叫“稀缺”。魔法世界里也得有稀缺。《西游记》里的神仙们日子过得好像什么都不缺&#xff0c;可也得定期吃些蟠桃、人参果之类能增寿的东西。谁控制稀缺资源&#xff0c;谁就掌握权力。王母娘娘控制了蟠桃&#xff0c;定期召开蟠桃大会给各路神仙延长寿命&#xff0c;…...

wordpress真伪查询主题/微博营销策略

当MySQL单表的数据库过大时&#xff0c;数据库的访问速度会下降&#xff0c;“数据量大”问题的常见解决方案是“水平切分”。MySQL常见的水平切分方式有哪些&#xff1f;回答&#xff1a;分库分表&#xff0c;分区表什么是MySQL的分库分表&#xff1f;回答&#xff1a;把一个很…...

青海公司网站建设哪家好/网站测速工具

1、大致介绍&#xff1a; >_<" 大致执行顺序是&#xff1a;ipl10.nas->asmhead.nas->bootpack.c PS: 这里bootpack.c要调用graphic.c、dsctbl.c、fifo.c、int.c实现功能&#xff0c;其中有些函数还必须汇编来写&#xff0c;所以单独写一个汇编文件naskfunc.na…...

网站建设方案模板高校/东莞今日头条最新消息

09 Eclipse设置代码注释模版背景博客正文背景 在团队协作开发的项目中&#xff0c;为了降低沟通和维护成本&#xff0c;项目组成员使用统一的编码规范和注释规范显得尤为重要。本文就说一说如果在Eclipse中设置代码注释模版&#xff0c;技术经理可以要求所有的开发人员设置为统…...

给传销做网站什么罪/腾讯广告投放推广平台

前面一篇展示了一个简单工厂模式&#xff0c;这一篇主要是对比&#xff0c;工厂方法模式比简单工厂模式好在哪里&#xff1f;为什么要用这个模式&#xff1f;这个模式的精髓在哪里&#xff1f; 就以计算器为例&#xff0c;结果图如下&#xff1a; 加减乘除运算都是继承自基类运…...