广播接收器(Broadcast Receivers)只是接收广播并对广播信息做出作出反应,多数的广播是由系统代码发出的——比如反应时区变化的通知,电量低的通知,照了一张照片的通知,或者用户修改了系统语言的通知。应用程序也可以自己定义广播,比如定义这样一个广播,让其他的应用程序知道某些数据已经下载完毕了可以使用了。

应用程序可以有任意数量的广播接收器来对他所关心的广播进行监听并作出反应。所有的广播接收器都继承自BroadcastReceiver基类。

广播接收器不显示在用户界面上,但是可以启动一个活动来对接收到的信息进行响应,或者可以使用BroadcastReceiver来警告用户。Notifications(通知)可以通过不同的方式引起用户的注意,比如使背景灯闪烁,使设备振动,播放声音等等。通常是在状态栏上显示一个不会消失的图标,用户可以打开这个图标查看通知。

广播接收器仅有一个回调方法:


void onReceive(ContextcurContext, Intent broadcastMsg)

当一个broadcast信息到达该receiver,Android调用它的onReceive()方法并将含有该广播信息的intent 对象传递它。Broadcast receiver仅仅在执行该方法时才被认为是活跃的。当onReceive()返回后,它又处于非活跃状态。也就是说,它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束。

一个包含活跃的broadcast receiver的进程会被保护起来不被杀死。但是一个仅仅含有非活跃组件的进程,在它消耗的内存被其它进程需要时可能随时被系统杀死。

广播接收器的生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息。当该broadcast信息的响应很耗时时会存在问题,这时应该单独给他一个线程运行,而不是在其他组件所在的与用户交互的线程中。如果onReceive()生成该线程后返回,整个进程,包括那个新的线程,都被判断为非活跃的(除非该进程里的其他组件是活跃的),归入了可以被杀死的一类。解决该问题的答案是使用onReceive()开始一个service,让该service进行该处理,那样一来,系统就会知道该进程里仍有活跃的处理在进行。

广播接收器在AndroidManifest.xml文件中注册方式为:

<span >	</span><receiver android:name=".BootCompleteReceiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".MyBoardcastReceiver">
            <intent-filter android:priority="100" >
                <action android:name="com.broadcast.MY_BROADCAST"/>
            </intent-filter>
        </receiver>