广播是安卓的重要组件之一,一个广播的使用流程如下:
- 注册广播接收器
- 发送广播
- 广播接收器接收消息做出回应
广播接收器
广播接收器继承自BroadCastReceiver,分为静态广播接收器和动态广播接收器。
静态广播接收器
静态注册的广播接收器需要在AndroidManifest.xml
中注册,程序不需要启动也可以接收广播。开机启动的应用很多用静态广播实现。
动态广播接收器
代码中注册广播,程序未启动时,无法接收广播。
发送广播
标准广播
标准广播发出后所有广播接受器几乎同一时刻收到广播,并且没有顺序,所以广播不可被截断。
有序广播
有序广播发出后同一时刻只能有有一个广播接收器收到广播消息,优先级高的广播接收器的先收到广播,高优先级的接受器可以截断广播。
- 如果想要发送有序广播,注册广播时要使用setPriority()设置广播接受器的优先级。
- 广播接收器的优先级与数字大小正相关,在广播接收器中使用abortBroadcast()可拦截广播。
- 本地广播管理器无法发送有序广播。
Demo
在第二个广播接收器的监听内加入 abortBroadcast()后,第三个广播接收器无法继续收到广播。
有序广播Demo
本地广播
为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自应用程序发出的广播。
本地广播的使用方法
- 获取LocalBroadcastManager实例mLocalBroadcastManager
- mLocalBroadcastManager.registerReceiver()注册广播接收器
- mLocalBroadcastManager.sendBroadcast()发送广播
- mLocalBroadcastManager.unregisterReceiver()取消注册
注意事项
- 本地广播无法通过静态注册来接收,相比起系统全局广播更加高效
- 在广播中启动Activity的话,需要为Intent加入FLAG_ACTIVITY_NEW_TASK的标记,不然会报错,因为需要一个栈来存放新打开的Activity。
- 广播中弹出AlertDialog的话,需要设置对话框的类型为:TYPE_SYSTEM_ALERT不然是无法弹出的。
评论 (0)