简介
-
broadcast 是使用 broadcast intent 发送,使用 broadcast receiver 监听并处理的机制。
-
broadcast intent 能够被多个 broadcast receiver 接收。
- 普通
intent
只能够被一个Activity
、 服务 或 broadcast receiver 接收。
-
broadcast receiver 的生命非常短暂,无法使用任何 异步API 或注册任何监听器,一旦
onReceive(...)
运行完毕, broadcast receiver 就不复存在了。因此适合运行一些便利型任务,比如启动Activity
或服务,以及系统重启后重置定时运行的定时器。
-
broadcast receiver 的
onReceive(...)
运行在 UI主线程 上。
-
broadcast intent 可实现系统内全局性的消息传递。如果只需要应用内的消息事件广播,可以使用事件总线库,比如: EventBus 、 RxJava 以及 Otto 。
静态broadcast receiver
简介
- 即使应用未运行,只要有匹配的 broadcast intent , broadcast receiver 就会醒来接收。
简单示例
1. AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
...
<receiver
android:name=".StartupReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
-
broadcast receiver 接收满足
<intent-filter>
定义的操作的 broadcast intent 。
-
android:exported
:设置是否导出,使得 broadcast receiver 能被应用外部调用。
2. 定义broadcast receiver
public class StartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 主线程,不宜进行耗时长的任务
// 此处根据intent进行接收者需要处理的任务
}
}
3. 发送broadcast intent
sendBroadcast(new Intent(/* String类型的Action */));
动态broadcast receiver
简介
- 动态 broadcast receiver 在代码中 注册 ,而非在 AndroidManifest.xml 中 注册 。
- 在 AndroidManifest.xml 中 注册 的 broadcast receiver 会不断地监听 broadcast intent 。
- 在代码中 注册 的好处是:可以通过使用
registerReceiver(...)
注册 和使用unregisterReceiver(...)
注销 来控制什么时候需要监听,什么时候不需要。
- 动态 broadcast receiver 注册 可以使得 broadcast receiver 监听时期与
Activity
或Fragment
的生命周期对齐。
简单示例
1. 定义broadcast receiver
private BroadcastReceiver mOnShowNotification = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 主线程,不宜进行耗时长的任务
// 此处根据intent进行接收者需要处理的任务
}
};
2. 注册与注销broadcast receiver
注册
IntentFilter filter = new IntentFilter(PollService.ACTION_SHOW_NOTIFICATION);
getActivity().registerReceiver(mOnShowNotification, filter, PollService.PERM_PRIVATE, null);
-
registerReceiver(...)
,参数说明:
-
BroadcastReceiver
对象:不解释。
-
IntentFilter
对象:不解释,参考 AndroidManifest.xml 。
-
String
对象:权限。
-
Handle
对象:可以让BroadcastReceiver
对象运行在Handler
所在的线程,而非主线程。
注销
getActivity().unregisterReceiver(mOnShowNotification);
注意事项
- 注意生命周期对应问题:
-
onStart()
对应onStop()
-
onResume()
对应onPause()
-
onActivityCreated()
对应onActivityDestroyed()
-
Fragment.onCreate()
对应Fragment.onDestroy()
:注意这两个方法中getActivity()
会返回不同的值,应该使用getActivity().getApplicationContext()
方法。
3. 发送 broadcast intent
// 自定义Action
public static final String ACTION_SHOW_NOTIFICATION = "com.bignerdranch.android.photogallery.SHOW_NOTIFICATION";
// ...
// 发送带有自定义Action的broadcast intent,参数二是自定义权限
sendBroadcast(new Intent(ACTION_SHOW_NOTIFICATION), PERM_PRIVATE);
有序broadcast
简介
- 使用 有序broadcast 可以实现 broadcast receiver 和 broadcast intent 双向通信。
-
有序broadcast 允许多个 broadcast receiver 依序处理 broadcast intent 。
-
result receiver 是一个特殊的 broadcast receiver ,会在整个 broadcast receiver链 执行完毕后执行。
- 通过 result receiver , 有序broadcast 支持让 broadcast intent 接收 broadcast receiver 的返回结果。
简单示例
1. 定义broadcast receiver和设置返回结果
private BroadcastReceiver mOnShowNotification = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 主线程,不宜进行耗时长的任务
// 此处根据intent进行接收者需要处理的任务
// 设置返回结果
setResultCode(Activity.RESULT_CANCELED);
}
};
- 有以下设置结果的方式:
setResultCode(int)
setResultData(String)
setResultExtras(Bundle)
setResult(int, String, Bundle)
2. 注册 broadcast receiver 和设置优先级
- 在 AndroidManifest.xml 中,或者在代码中 注册 。省略,参考上文。
- 为 broadcast receiver 设置优先级,优先级的范围为
-999
到999
,值大者优先:
- 在 AndroidManifest.xml 中:在
<intent-filter>
使用android:priority="-999"
- 在代码中:使用
IntentFilter.setPriority(int)
。
3. 发送有序broadcast
Intent i = new Intent(ACTION_SHOW_NOTIFICATION);
i.putExtra(REQUEST_CODE, requestCode);
i.putExtra(NOTIFICATION, notification);
sendOrderedBroadcast(i, PERM_PRIVATE, null, null, Activity.RESULT_OK, null, null);
-
sendOrderedBroadcast(...)
的参数说明:
-
Intent
对象:传送给 broadcast receiver 的。
-
String
对象:声明 权限 ,需要具有这种 权限 的 broadcast receiver 才能接收。
-
BroadcastReceiver
对象:代表 result receiver ,只有在 broadcast receiver链 中的所有 broadcast receiver 结束运行后,它才开始运行。
-
Handler
对象:支持 result receiver 运行的Handler
。
-
int
对象:结果初始值,可被 broadcast receiver链 中任何一个调用setResultCode(int)
设置。
-
String
对象:结果初始值。可被 broadcast receiver链 中任何一个调用setResultData(String)
设置。
-
Bundle
对象:结果初始值。可被 broadcast receiver链 中任何一个调用setResultExtras(Bundle)
设置。
-
sendOrderedBroadcast(...)
发送 broadcast intent 的时候会带上三个 结果值 :
- 整个 broadcast receiver链 的所有 broadcast receiver 共享这三个 结果值 。
- 整个 broadcast receiver链 的所有 broadcast receiver 都可以通过
getResultCode()
等方法 获得 这些 结果值 。
- 整个 broadcast receiver链 的所有 broadcast receiver 都可以通过
setResultCode(int)
等方法 修改 这些 结果值 。
- 前一个 broadcast receiver 修改了 结果值 会影响后面的 broadcast receiver 。
-
broadcast receiver 能够通过设置优先级来决定在 broadcast receiver链 中响应的先后顺序。
4. 关于result receiver
-
result receiver 是一个特殊的 broadcast receiver ,会在整个 broadcast receiver链 执行完毕后执行。
- 若想利用 result receiver 在最后处理结果,必须确保 result receiver 还没有消亡。若无法保证 result receiver 还没有消亡,可以使用替代方案:使用静态 broadcast receiver ,设置最低优先级。
系统broadcast intent
-
android.intent.action.BOOT_COMPLETED
:在设备重启完毕时发送。需要android.permission.RECEIVE_BOOT_COMPLETED
权限。