美文网首页技术笔记每日杂谈
BroadcaseReceiver 学习笔记

BroadcaseReceiver 学习笔记

作者: Gzw丶南山 | 来源:发表于2017-06-16 00:34 被阅读14次

正如昨天写过的 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.

ACTION_NEW_PICTURE

ACTION_NEW_VIDEO

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

相关文章

网友评论

    本文标题:BroadcaseReceiver 学习笔记

    本文链接:https://www.haomeiwen.com/subject/lsxpqxtx.html