BroadcastReceiver是Android四大组件之一,这种组件本质上就是一种全局的监听器,用于监听系统全局的广播消息。由于BroadcastReceiver是一种全局的监听器,因此它可以非常方便地实现系统中不同组件之间的通信。
BroadcastReceiver用于接收程序(包括用户开发的程序和系统内建的程序)所发出的Broadcast Intent,与应用程序启动Activity、Service相同的是,程序启动BroadcastReceiver也只需要两步。
1)创建需要启动的BroadcastReceiver的Intent。
2)调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定BroadcastReceiver。
onXxxListener只是程序级别的监听器,这些监听器运行在指定程序所在进程中,当程序退出时,OnXxxListener监听器也就随之关闭。但BroadcastReceiver属于系统级的监听器,它拥有自己的进程,只要存在与之匹配的Intent被广播出来,BroadcastReceiver总会被激发。
每次系统Broadcast事件发生后,系统就会创建对应的BroadcastReceiver的实例,并自动触发它的onReceiver()方法,onReceiver()方法执行完后,BroadcastReveiver的实例就会被销毁。
如果BroadcastReceiver的onReceiver()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceiver()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框。
如果需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。不赢考虑使用新线程去完成耗时的操作,因为BroadcastReceiver本身的生命周期很短,可能出现的情况是子线程还没有结束,BroadcastReceiver就已经退出。
如果BroadcastReceiver所在的进程结束了,虽然该进程内还有用户启动新线程,但由于该进程内不包含任何活动组件,因此系统可能在内存紧张时有限结束该进程。这样就可能导致BroadcastReceiver启动的子线程不能执行完成。
BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
1.在应用程序的代码当中进行注册。
2.在AndroidManifest.xml当中进行注册。
Android内置的Broadcast Actions
在Andorid平台中,内置了很多Action,用于帮助开发者监听手机上所发生的各种事件,以下是一些比较常见的Action,完整的Action列表可以参考:
Acton名称 | 触发场景 |
ACTION_CAMERA_BUTTON | Broadcast Action:The "Camera Button"was pressed. |
ACTION_BATTERY_LOW | Broadcast Action:Indicates low battery condition on the device. |
ACTION_DATE_CHANGED | Broadcast Action:The date has changed. |
ACTION_POWER_CONNECTED | Broadcast Action:External power has been connected to the device. |
ACTION_REBOOT | Broadcast Action:Have the device reboot. |
ACTION_SCREEN_ON | Broadcast Action:Sent after the screen turns on. |