技术笔记每日杂谈

BroadcaseReceiver 学习笔记

2017-06-16  本文已影响14人  Gzw丶南山

正如昨天写过的 Service 一样,BroadcaseReceiver 也是 Android 四大组件之一,Android 的广播可以用来接收来自系统和其他 App 的发来的广播,当然也可以发送任意的广播。

今天如下几个方面来说说我说认识的广播(不过就不展示具体代码了):

广播的使用场景

1.用于获取系统的某些变化信息,如网络状态改变,电量改变等等,从而做出相应处理。

2.同一 App 内的多进程通信。

3.不同 App 间通信(当然还有其他选项)。

广播类型

使用方式

当我们需要接收某一消息的时候,我们需要自定义一个广播接收者,然后并进行广播的注册,而注册的方式有以下两种:

内部实现机制

首先我们会创建一个自定义的广播接收者,并重写 onReveice(),因为广播涉及到跨进程通信,所以会通过 Binder 机制向 AMS 进行注册,当广播发送者通过 Binder 机制向 AMS 发送广播,然后 AMS 会查找符合相应条件(IntentFilter / 权限)的 BroadcastReceive,将广播发送到 BroadcastReceive 相应的消息循环队列中,最后消息循环队列拿到这个广播,回调 BroadcastReceive 中的 onReveice()。

本地广播

出于安全和效率我们会使用本地广播来发送和接收广播,而本地广播只在当前进程中协助注册和发送广播。

使用方式如下:

为什么说它安全呢?因为其他 App 无法对你的 App 发送该广播。

为啥说它高效呢?一般广播的是实现机制是通过 Binder 进行跨进程通信,而本地广播内部其实是通过 Handler 实现的,当我们通过 LocalBroadcastManager 发送消息时其实就是通过 Handler 发送消息,这就是其相比较一般广播高效的原因,不过也真是因为它使用的 Handler,所以哪怕是别的消息发送了相同的广播其实也是无效的,因为根本不会受到,并不会有跨进程产生。

其他

1.其实我们还可以自己定义广播来使用,这也就是自定义广播。

2.onReveice() 运行在主线程,不要做耗时操作。

3.终止广播仅适用于有序广播。

4.防止接收到来自其他 App 发的广播

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.

ACTION_NEW_PICTURE

ACTION_NEW_VIDEO

当然这些内容只是我在学习过程的一些总结,总结的不全,更多关于广播的知识,你可以去官方文档中进行查阅。

上一篇 下一篇

猜你喜欢

热点阅读