android里的广播机制可以用在应用程序之间,或者应用程序与系统之间方便灵活的通信,只需要注册感兴趣的广播事件就可以接收到相对应的事件。android中的广播主要分为两种类型:
1. 标准广播
这种广播在发出后,所有注册了该广播的广播接收器几乎在同一时刻都会收到这个广播事件,它不能被截断。
2. 有序广播
这种广播可以定义接受它的广播接收器的优先级,并且先收到此广播的接收器能截断广播的继续传播,使得其它的广播接收器不能再收到此广播。
对于广播事件的注册方式,有动态注册 和 静态注册两种方式。
1. 动态注册
一般在应用程序初始化的地方进行注册感兴趣的事件,以及对该事件的广播接收器。 下面以网络状态变化这个广播事件作为例子
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 添加具体的广播事件
networkChangeReceiver = new NetworkChangeReceiver(); // 广播接收器实例对象(NetworkChangeReceiver自定义类)
registerReceiver(networkChangeReceiver, intentFilter); // 注册
对于动态注册的播接收器,一般会在程序退出时去取消注册
unregisterReceiver(networkChangeReceiver);
2. 静态注册
对于动态注册方式,只有在程序启动之后才能捕获到这个广播事件,如果即使程序没有启动也能捕获广播事件的,那么就需要用静态注册方式了。静态注册方式需要在manifest.xml文件里声明,下面注册接收开机完成广播事件
<receiver android:name=".BootCompleteReceiver" > // BootCompleteReceiver自定义的广播接收器类
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> // 感兴趣的广播事件
<intent-filter>
</receiver>
先前提到的标准广播和有序广播,那我们怎样去发送它们, 怎样定义有序广播的优先级,又是怎样去截断广播呢,以下一一说明
1. 发送广播:
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent); // 发送标准广播
sendOrderedBroadcast(intent, null); // 发送有序广播
2. 截断广播
发出的广播事件是会在注册的广播接收器的onReceive函数里处理的,对于有序广播,我们可以通过以下方法截断
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceive", Toast.LENGTH_SHORT).show();
abortBroadcast(); // 截断广播
}
3. 在intent-filter 里定义有序广播事件的优先级
<receiver android:name=".MyBroadcastReceiver"> // MyBroadcastReceiver自定义的广播接收器类
<intent-filter android:priority="100"> // 优先级定义,数字越小,越早收到
<action android:name="com.example.broadcasttest.MY_BROADCAST" /> // 感兴趣的广播事件,MY_BROADCAST为自定义的广播事件
<intent-filter>
</receiver>