正如昨天写过的 Service 一样,BroadcaseReceiver 也是 Android 四大组件之一,Android 的广播可以用来接收来自系统和其他 App 的发来的广播,当然也可以发送任意的广播。
今天如下几个方面来说说我说认识的广播(不过就不展示具体代码了):
- 使用场景
- 广播类型
- 使用方式
- 内部实现机制
- 本地广播
- 其他
广播的使用场景
1.用于获取系统的某些变化信息,如网络状态改变,电量改变等等,从而做出相应处理。
2.同一 App 内的多进程通信。
3.不同 App 间通信(当然还有其他选项)。
广播类型
- 普通广播(发送后所有人都可同时收到)
- 有序广播(收到广播刻有先后顺序)
- 本地广播(安全高效的广播)
- 粘性广播(在广播未注册时发送,等到接收该消息的广播注册后可以收到,但因为安全原因,5.0 被废弃)
使用方式
当我们需要接收某一消息的时候,我们需要自定义一个广播接收者,然后并进行广播的注册,而注册的方式有以下两种:
-
在清单文件中注册,也叫静态注册,这样 App 可以一直接收该内容的广播
-
在代码注册,也交动态注册,此时该广播接收者会跟随着注册它的 Activity 生命周期,随着创建而注册,随着销毁而反注册,也就不再接收任何该内容的广播
内部实现机制
首先我们会创建一个自定义的广播接收者,并重写 onReveice(),因为广播涉及到跨进程通信,所以会通过 Binder 机制向 AMS 进行注册,当广播发送者通过 Binder 机制向 AMS 发送广播,然后 AMS 会查找符合相应条件(IntentFilter / 权限)的 BroadcastReceive,将广播发送到 BroadcastReceive 相应的消息循环队列中,最后消息循环队列拿到这个广播,回调 BroadcastReceive 中的 onReveice()。
本地广播
出于安全和效率我们会使用本地广播来发送和接收广播,而本地广播只在当前进程中协助注册和发送广播。
使用方式如下:
- 自定义广播接收者以及注册广播
- 获取 LocalBroadcastManager 实例
- 通过 LocalBroadcastManager 的实例来发送广播
为什么说它安全呢?因为其他 App 无法对你的 App 发送该广播。
为啥说它高效呢?一般广播的是实现机制是通过 Binder 进行跨进程通信,而本地广播内部其实是通过 Handler 实现的,当我们通过 LocalBroadcastManager 发送消息时其实就是通过 Handler 发送消息,这就是其相比较一般广播高效的原因,不过也真是因为它使用的 Handler,所以哪怕是别的消息发送了相同的广播其实也是无效的,因为根本不会受到,并不会有跨进程产生。
其他
1.其实我们还可以自己定义广播来使用,这也就是自定义广播。
2.onReveice() 运行在主线程,不要做耗时操作。
3.终止广播仅适用于有序广播。
4.防止接收到来自其他 App 发的广播
- 清单文件注册时加上 android:exported=false
- 本地广播
- 自定义权限
5.某些系统广播可能会在 Android 版本迭代中不再发送。
如文档中提及到 Android 7.0 and higher no longer sends the following system broadcasts. This optimization affects all apps, not only those targeting Android 7.0.
当然这些内容只是我在学习过程的一些总结,总结的不全,更多关于广播的知识,你可以去官方文档中进行查阅。
网友评论