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

一文了解Android本地广播

在 Android 开发中,本地广播(Local Broadcast)是一种轻量级的通信机制,主要用于在同一应用进程内的不同组件之间传递消息,而无需通过系统的全局广播机制。这种方法既可以提高安全性(因为广播仅在应用内传播),也能提高性能(不需要跨进程通信)。

本地广播

系统广播

以下是本地广播的详细介绍,包括其使用方法和示例代码。

本地广播的特点和优势

  1. 安全性:本地广播只在应用内部传递,不会被其他应用接收,避免了敏感信息的泄露。
  2. 效率高:本地广播不需要通过系统进程(AMS,Activity Manager Service)来分发,因此效率更高。
  3. 资源节省:相比全局广播,本地广播的开销更小,适合在内部模块之间频繁通信。

使用场景

本地广播适用于以下场景:

  • 应用内组件之间需要传递状态或事件通知,例如在数据加载完成时通知 UI 更新。
  • 不需要与其他应用共享消息内容的情况,特别是涉及隐私或敏感信息的通信。
  • 不需要跨进程的通信,仅限于在同一个应用中使用。

本地广播的实现方法

从 Android API 29 开始,LocalBroadcastManager 被标记为过时(deprecated)。推荐使用其他通信方式(例如 LiveDataSharedFlow 等)。不过在老版本中仍可以使用 LocalBroadcastManager 实现本地广播。

实现步骤

1. 注册本地广播接收器

注册接收器来监听特定的广播事件:

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.localbroadcastmanager.content.LocalBroadcastManagerclass MyBroadcastReceiver : BroadcastReceiver() {override fun onReceive(context: Context?, intent: Intent?) {// 接收到广播后的处理逻辑val data = intent?.getStringExtra("key")println("接收到的数据:$data")}
}val receiver = MyBroadcastReceiver()
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, IntentFilter("com.example.ACTION_CUSTOM")
)
2. 发送本地广播

使用 LocalBroadcastManager 来发送广播,广播数据仅限于本应用接收:

val intent = Intent("com.example.ACTION_CUSTOM")
intent.putExtra("key", "广播数据")
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)
3. 注销本地广播接收器

在不再需要接收广播时(例如在 ActivityonDestroy 方法中),记得注销接收器:

LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver)

使用本地广播的注意事项

  • 生命周期管理:确保在适当的生命周期内注册和注销接收器,避免内存泄漏。
  • 性能考虑:本地广播虽比全局广播更高效,但仍不适合高频率的数据传递。
  • 替代方案:在高 API 版本中,考虑使用 LiveData 或 SharedFlow 进行组件间通信,能够更好地管理生命周期并支持异步数据流。

示例

以下是一个简单的示例应用场景:在后台服务中完成数据加载后,通过本地广播通知 Activity 更新 UI。

在 Service 中发送广播
class MyService : Service() {override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {// 模拟数据加载完成val dataLoadedIntent = Intent("com.example.ACTION_DATA_LOADED")dataLoadedIntent.putExtra("data", "加载完成的数据")LocalBroadcastManager.getInstance(this).sendBroadcast(dataLoadedIntent)return START_NOT_STICKY}
}
在 Activity 中接收广播
class MainActivity : AppCompatActivity() {private val dataReceiver = object : BroadcastReceiver() {override fun onReceive(context: Context?, intent: Intent?) {val data = intent?.getStringExtra("data")println("接收到的服务数据:$data")// 更新 UI}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)LocalBroadcastManager.getInstance(this).registerReceiver(dataReceiver, IntentFilter("com.example.ACTION_DATA_LOADED"))}override fun onDestroy() {super.onDestroy()LocalBroadcastManager.getInstance(this).unregisterReceiver(dataReceiver)}
}

总结

本地广播是一种高效、安全的应用内组件通信方式,适合轻量级的消息传递。然而随着 Android 的演进,LocalBroadcastManager 已被逐步弃用,推荐在更高版本中采用 LiveDataSharedFlow 等生命周期感知的组件来实现同样的功能。

http://www.lryc.cn/news/483062.html

相关文章:

  • Ingress nginx 公开TCP服务
  • 谷歌浏览器支持的开发者工具详解
  • 【数据结构】汇编 、机器语言 高级语言 简析。
  • 【青牛科技】GC3901,强势替代 A3901/ALLEGRO应用于摇头机等产品中
  • Java API类与接口:类的转换方法与正则表达式
  • OceanBase JDBC (Java数据库连接)的概念、分类与兼容性
  • Linux服务器定时执行jar重启命令
  • 速览!Win11 22H2/23H2 11月更新补丁KB5046633发布!
  • A day a tweet(sixteen)——The better way of search of ChatGPT
  • 【网络】HTTP 协议
  • git push报错 unexpected disconnect while reading sideband packet
  • JSX 语法与基础组件使用
  • ReactPress:构建高效、灵活、可扩展的开源发布平台
  • emulator总结
  • 【Docker】‘docker‘ 不是内部或外部命令,也不是可运行的程序 或 批处理文件
  • Mysql高可用架构方案
  • Go,15岁了[译]
  • 【大数据学习 | kafka高级部分】kafka的数据同步和数据均衡
  • 微擎框架php7.4使用phpexcel导出数据报错修复
  • Netty实现WebSocket Server是否开启压缩深度分析
  • 【Xrdp联机Ubuntu20.04实用知识点补充】
  • 【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”
  • IDC机房服务器托管的费用组成
  • Halcon深度学习网络模型简介
  • ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析
  • 基于集成Whisper 与 Pepper-GPT改进人机交互体验并实现顺畅通信
  • C++设计模式精选面试题及参考答案
  • Linux下的vim和gdb
  • (蓝桥杯C/C++)——搜索
  • 【网页设计】HTML5 和 CSS3 提高