Broadcast Receiver
Broadcast receiver和activity、service组件一样都是接收intent的组件。一收到匹配的broadcast intent,broadcast receiver的onReceive(Context,Intent)方法立即运行,然后broadcast receiver就会被销毁;onReceive方法同样运行在主线程上,所以不能在此方法中进行耗时的重度任务,如网络连接或者数据的永久存储等。
作为Android四大组件之一,Broadcast receiver同样需要在系统中登记才能使用。登记有两种方式:在manifest配置文件中登记 和 使用registerReceiver和unregisterReceiver方法。
一、在manifest配置文件中登记
假如你的应用需要开机自启动,那么你就需要一个能监听BOOT_COMPLETED操作的broadcast intent的broadcast receiver。首先创建一个StartupReceiver新类:
public class StartupReceiver extends BroadcastReceiver { private static final String TAG = "StartupReceiver"; @Override public void onReceive(Context context, Intent intent) { // 对intent消息进行处理 } }
<receiver android:name=".StartupReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <!-- 系统启动时,为匹配Android的Broadcast Intent --> </intent-filter> </receiver>然后再添上可以接收BOOT_COMPLETED广播的权限就大功告成了:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
二、动态Broadcast receiver
通过Context.registerReceiver和Context.unregisterReceiver,动态的将触发器组件与所需要监听的事件进行绑定。通常会在Activity.onResume中进行触发器组件的注册,而在Activity.onPause中注销对应的触发组件。
广播事件的发送
一、无序广播
通过Context.sendBroadcast方法进行发送。所有注册了该广播事件的触发器组件都会获得事件通知,并不会按一定的顺序运行。
二、有序广播
通过Context.sendOrderedBroadcast方法进行发送。明显所有监听该事件的触发器组件,都会按照相应的优先级排序,从高到低依次处理该事件,下面是一个优先级最低的触发器组件的注册代码:
<receiver android:name="NotificationReceiver" android:exported="false" > <intent-filter android:priority="-999" > <action android:name="com.example.photogallery.SHOW_NOTIFICATION" /> </intent-filter> </receiver>同时,优先级高的broadcast receiver可以通过BroadcastReceiver.setResultCode(Activity.RESULT_CANCELED)来终止这个广播事件的传播,这样优先级低的broadcast receiver就不会在有机会处理该事件了。