BroadcastReceiver(二)--本地广播LocalBroadcastManager

178 阅读2分钟

这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

一、本地广播概念

本地广播是指发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自应用程序发出的广播,这样就能保证广播的安全。用来在同一个应用内的不同组件间发送Broadcast

需要注意的是本地广播只能被动态注册,不能静态注册,主要用法都在LocalBroadcastManager类中

一、本地广播和全局广播区别

1. 全局广播
  • 可以接收其他应用发的广播,也可以发送广播让其他应用接收
  • 既可以动态注册,也可以静态注册
2. 本地广播
  • 本地广播无法通过静态注册来接收
  • 程序内部传递,防止机密数据泄露
  • 其他程序无法将广播发送到我们的程序内部,防止安全漏洞的隐患
  • 比全局广播成本低且更加高效

二、本地广播的用法

  • 调用LocalBroadcastManager.getInstance()方法来获得实例
val localBroadcastManager = LocalBroadcastManager.getInstance(this)
  • 调用LocalBroadcastManager的registerReceiver()方法来注册广播
val broadcastReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
         Log.e(TAG, "本地广播demo")
    }
}
localBroadcastManager.registerReceiver(broadcastReceiver, IntentFilter("LOCAL_ACTION"))
  • 调用LocalBroadcastManager的sendBroadcast()方法发送广播
localBroadcastManager.sendBroadcast(Intent("LOCAL_ACTION"))
  • 调用LocalBroadcastManager的unregisterReceiver()方法取消注册
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)

三、本地广播信息的触发

  • 本地广播使用了观察者模式
  • 调用 sendBroadcast,传输广播 Intent
  • 利用 Intent 中的Action 索引广播数组列表,索引出广播实体。
  • 通过 Handler 回调到主线程,通过 executePendingBroadcasts 来运行广播。
  • 调用注册的 BroadReciver 的 onReceive 方法来完成广播触发内容
  • 如果调用 sendBroadcast 则接收广播永远在主线程,因为通过handler转到了主线程。如果调用sendBroadcastSync 方法来发送广播,那么接收到的广播是在发送广播所在的线程