前言 Android App 可以接收来自系统和其他 App 的广播消息,也可以向它们发送广播消息,比较类似于“发布-订阅”的设计模式,本文主要介绍广播的类型,如何注册广播,如何发送广播以及使用广播需要注意的一些事儿。 广播的分类
注册广播 编写一个广播接收者,通常是继承 BroadcastReceiver 并重写onReceive(Context,Intent) 方法。 编写完广播接收者后,就需要进行注册(订阅),告诉系统这个广播接收者对哪些广播感兴趣。注册的方式有静态注册和动态注册两种:
通过动态注册的广播接收者,在宿主(注册时所使用的 Context)的生命周期期间都是有效的。当然你也可以在适当的时间调用unregisterReceiver(BroadcastReceiver) 来解除注册,这个“适当”取决于具体的业务需求。例如使用 Activity 的 Context 在onCreate(Bundle) 中注册的一个广播接收者,可以在 onDestory() 方法回调时解除注册来防止广播接收者泄漏。原则:不重复注册,不泄露。 以上注册的广播接收者对 android.intent.action.BOOT_COMPLETED 和 jdqm.intent.action.TEST 这两种action的广播感兴趣,后者是自定义的广播,前者是开机完成时由系统发出(通常自启动的应用会注册这个广播),但注册这个广播须要以下权限: 发送广播
本地广播只有本应用内通过LocalBroadcastManager.getInstance(this).registerReceiver 方法注册的广播接收者能收到,具有更高的安全性,效率也更高(不用跨进程通信)。
这种类型广播在 Android6.0 中已经被标记被过时, 它有不安全(任何 App 都能访问), 没有保护 (任何 App 都能修改)等问题。另外发送这种广播需要以下权限 接收顺序
然后在其 processNextBroadcast(boolean fromMsg) 方法中,首先是处理了 mParallelBroadcasts 集合。
安全性与实践
其他
如果Intent不包含(或都包含)这两个flag,则表现形式是包含处于“停止”转态的应用,但是系统默认添加了FLAG_EXCLUDE_STOPPED_PACKAGES这个flag,这一点在源码中有所体现: ActivityManagerService#broadcastIntentLocked 这就意味着如果你想启动处于“停止”状态的应用,必须添加FLAG_INCLUDE_STOPPED_PACKAGES这个flag。那么一个应用在什么情况下会处于停止状态?①应用首次安装并且没有启动过;②被人为地强制停止。开机完成的广播就是FLAG_EXCLUDE_STOPPED_PACKAGES这种类型的Intent,这意味着如果你的应用被停止了,开机自启就会失效。下一篇文章将从源码的角度来分析广播的工作流程。 送书 日 更 精 彩 微信号:code-xiaosheng 公众号 「code小生」 |
|
来自: codingSmart > 《待分类》