Android Broadcast 笔记

Broadcast Receiver

    Broadcast receiver和activity、service组件一样都是接收intent的组件。一收到匹配的broadcast intent,broadcast receiver的onReceive(Context,Intent)方法立即运行,然后broadcast receiver就会被销毁;onReceive方法同样运行在主线程上,所以不能在此方法中进行耗时的重度任务,如网络连接或者数据的永久存储等。

    作为Android四大组件之一,Broadcast receiver同样需要在系统中登记才能使用。登记有两种方式:在manifest配置文件中登记  使用registerReceiverunregisterReceiver方法。


一、在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消息进行处理
	}

}


然后再往manifest配置文件中加入登记代码并包含相应的intent-filter:

 <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就不会在有机会处理该事件了。





猜你喜欢

转载自blog.csdn.net/u012964281/article/details/45078861