这是我参与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 方法来发送广播,那么接收到的广播是在发送广播所在的线程