Android系统有一套广播消息机制,方便进行每个应用程序之间的消息通知。而且广播接受者作为Android四大组件之一,经常被使用到。我也接触到广播消息机制,因此有必要对自己所学的知识梳理整理下。
动态注册经典代码
静态注册经典代码
在AndroidManifest文件Application节点内添加如下代码:
该广播接受者名为MyBroadcastReceiver。其有两个属性:enabled属性表示是否启用这个广播接受者;exported属性表示是否允许这个广播接受者接受本程序以外的广播。
说明
:
Android 3.1开始系统在Intent与广播相关的flag增加了参数:
1) FLAG_INCLUDE_STOPPED_PACKAGES
:包含已经停止的包(停止:即包所在的进程已经退出)
2) FLAG_EXCLUDE_STOPPED_PACKAGES
:不包含已经停止的包
自Android3.1开始,系统本身增加了对所有App当前是否处于运行状态的跟踪。在发送广播时,不管是什么广播类型,系统默认直接增加了值为FLAG_EXCLUDE_STOPPED_PACKAGES
的flag,导致即使是静态注册的广播接收器,对于其所在进程已经退出的App,同样无法接收到广播。
因此对于系统广播,由于是系统内部直接发出的,无法更改此intent的flag值。因此,从3.1开始对于静态注册的接收系统广播的BroadcastReceiver,如果App进程已经退出,将不能接收到广播。
但是对于自定义的广播,可以通过覆写此flag为FLAG_INCLUDE_STOPPED_PACKAGES
,使得静态注册的BroadcastReceiver,即使所在App进程已经退出,也能接收到广播,并会启动应用进程,但此时的BroadcastReceiver是新建的。
实现代码为:
在3.1以前,不少App可能通过静态注册方式监听各种系统广播,以此进行一些业务上的处理(如即使App已经退出,仍然能接收到,可以启动service等..)。
3.1后,静态注册接受广播方式的改变,将直接导致此类方案不再可行。于是,通过将Service与App本身设置成不同的进程已经成为实现此类需求的可行替代方案。
需要在AndroidManifest文件中通过设定广播接受者的intent-filter节点的priority属性来确定接受广播的顺序。
如果想把广播截断,可以在onReceive()
中调用abortBoradcast()
为了让广播只在应用程序中传递,这就需要LocalBroadcastManager大显身手。我们通过代码来熟悉。
0x06 广播的最佳实践
广播可以应用于强制下线或者被挤下线的逻辑操作
作者:猴哥,公众号:极客猴。爱好读书,喜欢钻研技术,梦想成为文艺青年的IT Boy。
- END -