深入分析 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 应用。在实际项目中,应根据具体需求选择最合适的组件通信方式,并遵循最佳实践以确保应用的性能和可维护性。

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/33066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑需求响应与储能寿命模型的火储协调优化运行策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

云原生容器技术入门:Docker、K8s技术的基本原理和用途

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、容器技术概述 1、什么是容器技术 2、容器技术的历史与发展 3…

五十八周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;使用 Transformer 进行长期预测-PatchTST 一、现有问题 二、提出方法 三、相关知识 1、Patch 2、Vanilla Transformer 四、提出的方法 1、模型结构 2、表征学习 3、模型优点 五、研究实验 1、数据集 2、评估指标 3、基…

Spring+SpringMVC介绍+bean实例化+依赖注入实战

Spring介绍 Spring是一个轻量级的Java 开发框架&#xff0c;核心是IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09; Spring解决了业务层&#xff08;Service包&#xff09;与其他各层&#xff08;表现层&#xff0c;包括Model&#xff0c;Vie…

车辆数据的提取、定位和融合(其二.一 共十二篇)

第一篇&#xff1a; System Introduction 第二篇&#xff1a;State of the Art 第三篇&#xff1a;localization 第四篇&#xff1a;Submapping and temporal weighting 第五篇&#xff1a;Mapping of Point-shaped landmark data 第六篇&#xff1a;Clustering of landma…

【Spring】Spring Boot 快速入门

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

计算机网络期末

1、IP 地址为:192.168.0.254,它的子网掩码应该为( ) A.255.255.255.0 B.255.255.254.0 C.255.255.252.0 D.255.255.0.0 2、最容易产生网络可靠性瓶颈问题的拓扑构型是&#xff08; &#xff09;。 A 总线型 B 星型 C 环型 D 网状型 3、HTTP 就是电子邮件阅读协议&#xff0…

UE5 中的碰撞问题

文章目录 一、初始准备二、重叠和碰撞三、自定义碰撞 一、初始准备 首先我们创建一个 BP_ThirdPerson 项目&#xff0c;然后在项目中创建两个 Actor 的蓝图 Blueprint 首先是一个移动的 BP_Push&#xff0c;这里使用 time line 循环旋转 cube 的相对位置 得到效果如下 然后是…

计算机网络 —— 应用层(FTP)

计算机网络 —— 应用层&#xff08;FTP&#xff09; FTP核心特性&#xff1a;运作流程&#xff1a; FTP工作原理主动模式被动模式 我门今天来看应用层的FTP&#xff08;文件传输协议&#xff09; FTP FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#x…

qt基本窗口类(QWidget,QDialog,QMainWindow)

1.三个基本窗口类 1.1QWidget 所有窗口的基类 可以内嵌到其他窗口的内部&#xff0c;无边框 也可以作为独立窗口显示&#xff0c;有边框 1.2QDialog 继承于QWidget 对话框窗口类 不可以内嵌到其他窗口 有模态和非模态两种显示方式 1.3QMainWind 继承于QWidget 主窗口类 不可以…

【服务器07】之【GitHub项目管理】及【Unity异步加载场景】

登录GitHub官网 GitHub: Let’s build from here GitHub 注册账号 登录账号 输入一个自定义名字&#xff0c;点击创建存储库就可以了 现在我们下载Fork Fork - a fast and friendly git client for Mac and Windows (git-fork.com) 免费的 下载完成之后点击File下的Clone …

TLS握手中的RTT

文章目录 TLS 1.2 握手过程中的 RTT 次数TLS 1.3 1-RTT 初次TLS1.3 0-RTT 握手过程总结 TLS 1.2 握手过程中的 RTT 次数 TLS 1.2 握手通常需要2 RTT 才能完成。具体步骤如下&#xff1a; 第一次 RTT&#xff1a; 客户端发送 ClientHello&#xff1a;客户端生成一个随机数&…

Pytest和Unitest框架对比

在学到自动化的时候,很多同学都遇到了Pytest和Unitest框架,有的人是两个都学,但是学的不精只是知道分别怎么用.不了解两个区别是什么.有的是犹豫到底要学习那个框架.其实要做好自动化测试,是有必要了解不同框架之间的差异化的. Pytest 特点: Pytest采用了更简洁、更灵活的语法…

Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置

文章目录 PreLinux 的 /proc/sys/vm 简述什么是 /proc/sys/vm&#xff1f;主要的配置文件及其用途参数调整对系统的影响dirty_background_ratio 和 dirty_ratioswappinessovercommit_memory 和 overcommit_ratiomin_free_kbytes 实例与使用建议调整 swappiness设置 min_free_kb…

移动展厅:便捷高效的展示新模式—轻空间

在现代社会&#xff0c;移动展厅作为一种创新的展示模式&#xff0c;逐渐成为各行业的重要工具。凭借其便捷高效的特点&#xff0c;移动展厅为企业和组织提供了全新的展示解决方案。 快速部署与灵活性 移动展厅采用气膜结构&#xff0c;能够在短时间内快速部署。这种高效的搭建…

【非常实验】如何在移动设备上运行 Docker?

本章就从在 DevOps 中最基本但也是最强大的工具 Docker 开始。最近,我在尝试更多Termux的可能性,于是就想着试试Docker适不适合arm架构。 我用的是天玑9000芯片,而不是高通,所以显示不出来 Qualcomm。所以我决定从在手机上运行 docker 开始,但这可能吗?让我们一起来看看吧…

什么是超级智能?

“超级智能”可以理解为将多个人的智能、机器智能以及环境智能融合在一起。这个定义强调了跨越不同领域和系统的综合与协同&#xff0c;以实现更强大和高效的智能能力。 多个人的智能融合指的是将多个个体的知识、经验和创造力结合起来。通过协作和信息共享&#xff0c;能够集思…

论文阅读--Cross-view Transformers for real-time Map-view Semantic Segmentation

一种新的2D维度的bev特征提取方案&#xff0c;其通过引入相机先验信息&#xff08;相机内参和外参&#xff09;构建了一个多视图交叉注意力机制&#xff0c;能够将多视图特征映射为BEV特征。 cross view attention&#xff1a;BEV位置编码由根据相机标定结果&#xff08;内参和…

ChatGPT原理和训练【 ChatGPT是由OpenAI开发】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

oracle 外连接(+)和left join用法

案例1&#xff1a; select count(1) FROM TFUNDINFO A, TFUNDTYPE B WHERE A.VC_FUNDCODEB.VC_FUNDCODE() select count(1) FROM TFUNDINFO A, TFUNDTYPE B WHERE A.VC_FUNDCODEB.VC_FUNDCODE SELECT count(1): 这表示查询将返回一个计数&#xff0c;count(1)是一种常见的计数…