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

深入分析 Android BroadcastReceiver (六)

文章目录

    • 深入分析 Android BroadcastReceiver (六)
      • 1. 广播机制的高级优化策略
        • 1.1 使用 Sticky Broadcast(粘性广播)
          • 示例:粘性广播(过时,不推荐)
        • 1.2 使用 LiveData 和 ViewModel 进行组件通信
          • 示例:使用 LiveData 进行组件通信
        • 1.3 使用 EventBus 进行事件总线模式通信
          • 示例:使用 EventBus 进行事件总线模式通信
      • 2. 总结与高级优化策略

深入分析 Android BroadcastReceiver (六)

1. 广播机制的高级优化策略

在广播机制的实际应用中,还有一些高级优化策略和注意事项,可以进一步提升应用的性能和可靠性。

1.1 使用 Sticky Broadcast(粘性广播)

粘性广播(Sticky Broadcast)是一种特殊的广播,系统会保存最近一次的广播数据,即使在广播发送后再注册接收器,接收器也能接收到最近的广播消息。不过,粘性广播在 Android API 21 后被标记为过时(deprecated),因此不建议在新的开发中使用粘性广播,建议使用其他机制替代。

示例:粘性广播(过时,不推荐)
Intent intent = new Intent("com.example.STICKY_ACTION");
intent.putExtra("data", "Sticky data");
sendStickyBroadcast(intent);// 在接收器中接收粘性广播
public class StickyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String data = intent.getStringExtra("data");Toast.makeText(context, "Received sticky broadcast: " + data, Toast.LENGTH_SHORT).show();}
}
1.2 使用 LiveData 和 ViewModel 进行组件通信

在现代 Android 应用开发中,推荐使用 LiveDataViewModel 进行组件间通信,尤其是在 MVVM 架构中。这种方式不仅符合生命周期感知,还能有效地避免内存泄漏和提升代码可维护性。

示例:使用 LiveData 进行组件通信

定义 ViewModel:

public class SharedViewModel extends ViewModel {private final MutableLiveData<String> liveData = new MutableLiveData<>();public void setData(String data) {liveData.setValue(data);}public LiveData<String> getData() {return liveData;}
}

在发送方设置数据:

public class SenderFragment extends Fragment {private SharedViewModel viewModel;@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);viewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);}private void sendData() {viewModel.setData("New data from Sender");}
}

在接收方观察数据变化:

public class ReceiverFragment extends Fragment {private SharedViewModel viewModel;@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);viewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);viewModel.getData().observe(getViewLifecycleOwner(), new Observer<String>() {@Overridepublic void onChanged(String data) {// 处理接收到的数据Toast.makeText(getContext(), "Received data: " + data, Toast.LENGTH_SHORT).show();}});}
}
1.3 使用 EventBus 进行事件总线模式通信

EventBus 是一个流行的事件总线库,广泛用于 Android 应用中进行组件间通信。它简化了事件发布和订阅的机制,并支持线程切换。

示例:使用 EventBus 进行事件总线模式通信

添加依赖项:

implementation 'org.greenrobot:eventbus:3.2.0'

定义事件类:

public class MessageEvent {public final String message;public MessageEvent(String message) {this.message = message;}
}

发布事件:

EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));

订阅事件:

public class EventSubscriber {@Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(MessageEvent event) {Toast.makeText(context, "Received message: " + event.message, Toast.LENGTH_SHORT).show();}public void register() {EventBus.getDefault().register(this);}public void unregister() {EventBus.getDefault().unregister(this);}
}

在合适的生命周期方法中注册和取消注册订阅者:

@Override
protected void onStart() {super.onStart();eventSubscriber.register();
}@Override
protected void onStop() {super.onStop();eventSubscriber.unregister();
}

2. 总结与高级优化策略

广播机制(BroadcastReceiver)在 Android 中提供了强大的组件间通信功能,但在现代应用开发中,推荐逐步使用更为高效和灵活的方式来实现组件间通信,如 LiveDataViewModelEventBus 等。这些方法不仅能更好地适应复杂的应用场景,还能提高应用的可维护性和稳定性。

  • 粘性广播:虽然提供了方便的历史广播消息,但因安全和效率问题不推荐在新的应用中使用。
  • LiveData 和 ViewModel:符合生命周期感知的组件通信方式,适用于 MVVM 架构,能有效避免内存泄漏。
  • EventBus:事件总线模式的实现,简化了事件发布和订阅,适合复杂的事件驱动系统。

通过合理选择和优化广播机制及其替代方案,开发者可以构建更加高效、稳定和安全的 Android 应用。在实际项目中,应根据具体需求选择最合适的组件通信方式,并遵循最佳实践以确保应用的性能和可维护性。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

相关文章:

深入分析 Android BroadcastReceiver (六)

文章目录 深入分析 Android BroadcastReceiver (六)1. 广播机制的高级优化策略1.1 使用 Sticky Broadcast&#xff08;粘性广播&#xff09;示例&#xff1a;粘性广播&#xff08;过时&#xff0c;不推荐&#xff09; 1.2 使用 LiveData 和 ViewModel 进行组件通信示例&#xf…...

mysql 查询的一般思路

能用单表优先用单表&#xff0c;即便是需要用group by、order by、limit等&#xff0c;效率一般也比多表高 不能用单表时优先用连接&#xff0c;连接是SQL中非常强大的用法&#xff0c;小表驱动大表建立合适索引合理运用连接条件&#xff0c;基本上连接可以解决绝大部分问题。…...

【Web APIs】DOM 文档对象模型 ⑤ ( 获取特殊元素 | 获取 html 元素 | 获取 body 元素 )

文章目录 一、获取特殊元素1、获取 html 元素2、获取 body 元素3、完整代码示例 本博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/APIgetElementById 函数参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/API/Document/getE…...

Android11 以Window的视角来看FallbackHome的启动

在WMS中&#xff0c;使用WindowState代表着一个Window并维护着一个Window的"层级树"&#xff0c;每个Window需要按照"层级"的规则进行排列。对于FallbackHome&#xff0c;其Window是挂载在home task上&#xff0c;而home task挂载在DefaultTaskDisplayArea…...

9 RestClient客户端操作文档

1. match_all GetMapping("matchAll")public void matchAll() throws IOException {//1. 准备requestSearchRequest request new SearchRequest("hotel");//2. 组织DSL参数request.source().query(QueryBuilders.matchAllQuery());SearchResponse respon…...

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者&#xff1a;Hongbo 01 &#x1f4a1;TL;DR 在加密投资领域如何找到真正的“价值”&#xff1a;Crypto 作为一种新兴资产&#xff0c;应该找到一种区别于传统公司股票资产的估值方法&#xff0c;本文重点阐述了加密货币作为新的资产类型与传统资…...

酒店预定系统

酒店预定系统本身设计过程中会遇到售卖系统两个常见问题&#xff0c;第一个同一个房间同一日期被多个订单预定&#xff0c;或者预定和库存数据不一致&#xff0c;这些都会涉及到金钱&#xff0c;需要在系统涉及是被重点考虑。 问题1:同一个房间同一个日期被多个订单预定 酒店…...

Redis的实战常用一、验证码登录(解决session共享问题)(思路、意识)

一、基于session实现登录功能 第一步&#xff1a;发送验证码&#xff1a; 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff1a; 如果不合法&#xff0c;则要求用户重新输入手机号如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行…...

基于Spring Boot的智能分析平台

项目介绍&#xff1a; 智能分析平台实现了用户导入需要分析的原始数据集后&#xff0c;利用AI自动生成可视化图表和分析结论&#xff0c;改善了传统BI系统需要用户具备相关数据分析技能的问题。该项目使用到的技术是SSMSpring Boot、redis、rabbitMq、mysql等。在项目中&#…...

HTML(13)——显示模式

目录 显示模式 块级元素 行内元素 行内块元素 转换显示模式 显示模式&#xff1a;标签的显示方式 作用&#xff1a;布局网页时&#xff0c;根据标签的显示模式选择合适的标签摆放内容 显示模式 块级元素 独占一行宽度默认为父级的100%添加宽高属性生效 行内元素 …...

【Spring】Spring Boot 快速入门

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…...

Go自定义数据的序列化流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

贪心算法练习题(2024/6/18)

什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 1分发饼干 假设你是一位很棒的家长&#xff0c…...

4.1 四个子空间的正交性

一、四个子空间的正交性 如果两个向量的点积为零&#xff0c;则两个向量正交&#xff1a; v ⋅ w v T w 0 \boldsymbol v\cdot\boldsymbol w\boldsymbol v^T\boldsymbol w0 v⋅wvTw0。本章着眼于正交子空间、正交基和正交矩阵。两个子空间的中的向量&#xff0c;一组基中的向…...

RabbitMQ实践——使用WebFlux响应式方式实时返回队列中消息

大纲 Pom.xml监听队列实时返回消息测试完整代码工程代码 在之前的案例中&#xff0c;我们在管理后台收发消息都是通过短连接的形式。本文我们将探索对队列中消息的实时读取&#xff0c;并通过流式数据返回给客户端。 webflux是反应式Web框架&#xff0c;客户端可以通过一个长连…...

SpringBoot前后端传递数据时常用的JSON格式数据是什么?【讲解JSON概念、语法、以及Java对象互转】

SpringBoot前后端传递数据时常用的JSON格式数据是什么&#xff1f; JSON概念JSON语法JSON的两种结构&#xff1a;JSON字符串和Java对象互转&#xff1a;objectMapper.writeValueAsString(person);objectMapper.readValue(jsonStr,Person.class); 在SpringMVC框架中&#xff0c;…...

mysql学习——SQL中的DQL和DCL

SQL中的DQL和DCL DQL基本查询条件查询聚合函数分组查询排序查询分页查询 DCL管理用户权限控制 学习黑马MySQL课程&#xff0c;记录笔记&#xff0c;用于复习。 DQL DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记…...

windows系统上nginx搭建文件共享

1、下载windows版nginx 下载地址 2、配置nginx 编辑nginx.conf配置文件 在http模块下添加这个参数 underscores_in_headers on;#修改location内容&#xff0c;共享哪个文件夹&#xff0c;就写哪个文件夹&#xff0c;最后一定要跟上/&#xff0c;否则无法访问 location / {…...

星闪指向遥控,做家电交互的破壁人

“面壁者罗辑&#xff0c;我是你的破壁人。” 科幻小说《三体》中&#xff0c;当人类的基础科学被三体人封锁&#xff0c;变得停步不前&#xff0c;人类启动了自救的面壁计划&#xff0c;通过一次又一次破壁&#xff0c;找到战胜三体人的办法。 现实中&#xff0c;有一点已经成…...

SpringBoot使用AutoConfigure实现依赖库自动导入配置

我们知道导入配置有两种&#xff0c;一种是Value&#xff0c;一种是ConfigurationProperties&#xff0c;将对应的类标记为Component即可导入。但是被注解标识的类创建Bean有一个前提&#xff0c;只对启动类所在的包路径下的所有带有Component等注解的类才会创建Bean。如果我们…...

QT中利用动画弄一个侧边栏窗口,以及贴条效果

1、效果 2、关键代码 void Widget::on_sliderBtn_clicked() {m_sliderWidget->show();QPropertyAnimation* animation = new QPropertyAnimation(m...

win10免安装配置MySQL8.4.0

注&#xff1a;此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接&#xff1a;MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download&#xff08;当前时间2024-06-19最新版本是8.4.0&#xff09; 2、解压并添加配置文件 下载完毕后&#xff0c;解压缩…...

VS Code安装及环境配置(超详细)

VS Code简介 Visual Studio Code&#xff08;简称 VS Code &#xff09;是 Microsoft 于2015年4月发布的一款代码编辑器&#xff0c;以界面简洁、轻量著称。 它是一款免费开源的现代化轻量级代码编辑器&#xff0c;支持几乎所有主流开发语言的语法高亮、智能代码补全、自定义…...

shell脚本通过解析日志使用串口开关屏知识点整理

#!/bin/bash #logPath 写日志的存放路径 #logPath/home/workspace/tvs/trainborne logPath/home/firefly tmpFile$$ function getLogName() { #echo "$logPath/LCDController_"date "%Y%m%d000000.log" echo "LCDController_20240424000000.log&quo…...

速盾:视频cdn和网站cdn的相同点与不同点

CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;旨在为用户提供高效、高质量的内容传送服务。CDN主要通过将内容分发到全球各地的边缘节点&#xff0c;并根据用户的地理位置选择最近的节点来提供内容&#xff0c;从而加速内容的传输并降…...

37.自定义协议

自定义协议要素 1.魔数:用来第一时间判定是否是无效数据包。 2.版本号:主持协议升级。 3.序列化算法:消息正文到底采用那种序列化方式,可以由此扩展,例如:json,protobuf(google的序列化算法,基于二进制,虽然可读性不好,但是字节数占用更少),hessian(基于二进制)…...

【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息

问题描述&#xff1a; 在React Native中&#xff0c;我们可以使用measureInWindow的方式去获取一个View在屏幕中的位置信息&#xff1a; 下面这个Demo中&#xff0c;我们写了一个页面HomePage和一个列表项组件ListItemA&#xff0c;我们期望每过5s监测一次列表中每一项在屏幕中…...

C++ 教程 - 04 类的使用

文章目录 类的定义类定义案例构造函数 类的定义 C 在 C 语言的基础上增加面向对象编程&#xff0c;类是用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;封装了数据和函数。类可以被看作是一种模板&#xff0c;可以用来创建具有相同属性和行为的多个对象…...

excel按模板文件导出多个文件并压缩为ZIP格式返回前端

思路&#xff1a;先准备好模板文件和与之对应的实体类&#xff0c;数据库数据等&#xff0c;还是之前思路&#xff0c;根据查出的数据&#xff0c;填充模板文件&#xff0c;生成一个临时文件&#xff0c;最后将这些个临时文件打包为zip返回前端&#xff0c;并将多个临时文件删除…...

自动驾驶仿真测试用例表格示例 ACC ELK FCW

自动驾驶仿真测试用例表格示例 测试用例概览 本测试用例表格涵盖了自动驾驶系统中多个关键功能和场景的测试&#xff0c;旨在确保系统在不同条件下的表现和稳定性。 用例编号测试项目测试描述预期结果实际结果通过/失败TC-001ACC功能测试在高速公路上启用ACC&#xff0c;测试车…...