1 简介
作为入门,本篇将对BroadCast做个简单介绍。
2 什么是广播
广播其实很简答,直接拿现实中的广播做比,其实主要分两部分,一部分是发广播,一部分是收广播。换做我们的专业术语就是广播发送者和广播接收者。
3 广播有什么用处
- 同一app内部的同一组件内的消息通信(单个或多个线程之间)
- 同一app内部的不同组件之间的消息通信(单个进程)
- 同一app具有多个进程的不同组件之间的消息通信;
- 不同app之间的组件之间消息通信;
- Android系统在特定情况下与App之间的消息通信。
4 广播的类别
以下是几种常见的广播:
-
有序广播
广播的接收者会按照优先级接受广播,广播接受者还可以决定该广播是否被后续接收者接收。 -
无序广播
所有的广播接收者都会无序收到广播发送者发出的广播 -
系统广播
这里说的系统广播,其实就是系统已经定义好的一些广播,比如系统开机广播,电池电量改变的广播等。 -
粘性广播
粘性广播在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Receiver如果被销毁,那么下次重建时会自动接收到消息数据。 -
权限广播
使用广播的同时,会遇到以下两种需求。
1.一些敏感的广播并不想让第三方的应用收到
2.要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰
这种情况,可以考虑使用有序广播来实现。参考权限广播的使用 -
App应用内广播
简单来说就是限制了广播发送者和广播接收者的范围,范围限定在同一应用进程内,避免该应用收到其他应用的影响,又或者可以避免其他进程接收到该进程的广播。
5 广播接受者的注册方式
常见的注册方式有两种:
- 静态注册
简单来说就是使用XML进行代注册的形式,例如:
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
静态注册的广播接收器即使app已经退出,主要有相应的广播发出,依然可以接收到,但此种描述自Android 3.1开始有可能不再成立。
Android 3.1开始系统在Intent与广播相关的flag增加了参数,分别是FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES。
FLAG_INCLUDE_STOPPED_PACKAGES:包含已经停止的包(停止:即包所在的进程已经退出)
FLAG_EXCLUDE_STOPPED_PACKAGES:不包含已经停止的包
主要原因如下:
自Android3.1开始,系统本身则增加了对所有app当前是否处于运行状态的跟踪。在发送广播时,不管是什么广播类型,系统默认直接增加了值为FLAG_EXCLUDE_STOPPED_PACKAGES的flag,导致即使是静态注册的广播接收器,对于其所在进程已经退出的app,同样无法接收到广播。
详情参加Android官方文档:http://developer.android.com/about/versions/android-3.1.html#launchcontrols
由此,对于系统广播,由于是系统内部直接发出,无法更改此intent flag值,因此,3.1开始对于静态注册的接收系统广播的BroadcastReceiver,如果App进程已经退出,将不能接收到广播。
但是对于自定义的广播,可以通过复写此flag为FLAG_INCLUDE_STOPPED_PACKAGES,使得静态注册的BroadcastReceiver,即使所在App进程已经退出,也能能接收到广播,并会启动应用进程,但此时的BroadcastReceiver是重新新建的。
- 动态注册
其实就是使用代码动态注册,例如:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
registerReceiver(mBroadcastReceiver, intentFilter);