什么是广播?
用于监听或接收系统和应用发出的广播消息,并做出响应,因此广播分为两个角色:广播发送者、广播接收者。
接收广播的分类
- 普通广播:
使用sendBroadcast()方法发送, 他们是完全异步的,广播的全部接收者以未定义的顺序运行,通常在同一时间,这种方法非常高效,但是接收者不能使用结果或者终止API。 - 有序广播:
使用sendOrderedBroadcast()方法发送,他们每次只发送给一个接收者,由于每个接收者依次运行,它能为下一个接收者生成一个结果,或者它能完全终止广播以便不传递给其他接收者,有序接收者运行顺序由匹配的intent-filter的android:priority属性控制,具有相同优先级的接收者运行顺序随机。 - 系统广播
- 粘性广播
注册与注销
BroadcastReceiver的注册与注销推荐在OnStart()、OnStop()中进行。
广播的注册机制
静态注册:
在AndroidManifest.xml中用标签注册,并在标签内用标签设置过滤器。
静态注册为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发程序还是会响应。动态注册:
registerReceiver()。
动态注册为非常驻型广播,即它会跟随Activity的生命周期,所以在Activity结束前我们需要主动撤销注册否则会出现异常。-
区别:
静态注册时
执行完onReceive()方法,BroadcastReceiver对象的生命周期就已经到头了。因此不能在onReceive()中进行异步操作, 有可能异步操作还没完成,BroadcastReceiver所在的进程就被kill了。同样,成员变量无法保存它们的值,它们每次都是重新创建的, 之前的已经随着BroadcastReceiver对象被销毁了.。 某些情况下(进程不会被kill的)是可以用static变量的。动态注册时
BroadcastReceiver的成员变量是可用的, BroadcastReceiver对象的生命周期是可控的。每次收到广播都是使用我们registerReceiver()时传入的对象处理的。 当然, 此时静态变量也是可用的。
注意:通过这种方式注册的广播为非常驻型广播,即它会跟随Activity的生命周期,所以在Activity结束前我们需要调用unregisterReceiver()方法移除它。