当前位置: 首页 > 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。如果我们…...

JIT热路径识别失效?手撕Python 3.14 _pyjitsymbol.c源码,定位3个未文档化的profile阈值陷阱(内附补丁POC)

第一章&#xff1a;JIT热路径识别失效&#xff1f;手撕Python 3.14 _pyjitsymbol.c源码&#xff0c;定位3个未文档化的profile阈值陷阱&#xff08;内附补丁POC&#xff09;Python 3.14 引入的 _pyjitsymbol JIT 框架在实际压测中频繁出现热路径“失焦”现象&#xff1a;高频率…...

技能大赛备赛避坑指南:搞定软件测试五大任务(功能/自动化/性能/单元/接口)的常见错误与调试技巧

技能大赛备赛避坑指南&#xff1a;软件测试五大任务实战排错手册 参加职业院校技能大赛软件测试赛项的师生们&#xff0c;往往在备赛过程中遇到各种"坑"&#xff1a;脚本突然报错、环境配置冲突、报告格式被扣分…这些问题看似琐碎&#xff0c;却可能直接影响比赛成绩…...

Python内存管理策略对比评测报告(2024权威版):仅1种策略通过了金融级SLA压力测试,其余4种已淘汰

第一章&#xff1a;Python智能体内存管理策略对比评测报告&#xff08;2024权威版&#xff09;概述Python智能体&#xff08;如基于LLM的Agent框架、自主任务调度器、多步推理引擎&#xff09;在运行过程中面临高频对象创建、长生命周期缓存、跨线程引用共享等复杂内存场景。传…...

树莓派4B上跑YOLOv8n-NCNN,实测2FPS?别急,这有份从模型转换到C++代码的完整调优指南

树莓派4B上跑YOLOv8n-NCNN性能调优实战&#xff1a;从2FPS到流畅推理的完整指南 当你在树莓派4B上成功部署YOLOv8n-NCNN后&#xff0c;发现推理速度只有可怜的2FPS时&#xff0c;是否感到沮丧&#xff1f;别担心&#xff0c;这不是硬件性能的终点。本文将带你深入分析性能瓶颈&…...

新手必看:Neeshck-Z-lmage_LYX_v2界面状态管理,让你的设置不再丢失

新手必看&#xff1a;Neeshck-Z-lmage_LYX_v2界面状态管理&#xff0c;让你的设置不再丢失 1. 工具简介&#xff1a;为什么需要状态管理&#xff1f; 当你第一次打开Neeshck-Z-lmage_LYX_v2这个绘画工具时&#xff0c;可能会被它简洁的界面所吸引。但真正让它与众不同的&…...

SMUDebugTool核心功能全解析:从故障排查到性能优化

SMUDebugTool核心功能全解析&#xff1a;从故障排查到性能优化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitco…...

保姆级教程:从WOS下载文献到Citespace出图,手把手搞定科研可视化(附避坑指南)

科研可视化实战&#xff1a;从WOS数据采集到Citespace图谱优化的完整指南 第一次打开Citespace时&#xff0c;看着满屏的英文参数和报错提示&#xff0c;我盯着屏幕发了十分钟呆——这大概是每个科研新手都会经历的"震撼教育"。文献计量分析本应是揭示知识脉络的利器…...

保姆级教程:手把手教你用GLM-4v-9b搭建图片问答机器人

保姆级教程&#xff1a;手把手教你用GLM-4v-9b搭建图片问答机器人 你是不是经常遇到这样的情况&#xff1a;看到一张复杂的图表&#xff0c;想快速了解里面的数据含义&#xff1b;或者收到一张产品图&#xff0c;想知道它的具体型号和功能&#xff1b;又或者辅导孩子作业时&am…...

电路设计与漫画艺术的跨界融合

1. 当电路遇见漫画&#xff1a;工程师的艺术表达在大多数人眼中&#xff0c;电路设计是冰冷的数据和复杂的公式&#xff0c;而漫画则是天马行空的创意表达。但作为一名从业十年的硬件工程师&#xff0c;我发现这两者其实有着惊人的相似之处——它们都需要严谨的结构设计&#x…...

NOR FLASH和NAND FLASH的对比

一、擦写寿命与数据可靠性 FLASH芯片的擦写次数一般来说都是有限的&#xff0c;目前主流产品的擦写寿命普遍在10万次左右。当FLASH芯片接近使用寿命终点时&#xff0c;写操作可能会出现失败。不过&#xff0c;需要注意NAND FLASH采用整块擦写机制&#xff0c;一旦块内出现一位数…...