BroadcastReceiver
标准广播与有序广播
- 标准广播 Normal broadcasts 完全异步执行
在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
- 有序广播 Ordered broadcasts 同步执行
在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
创建广播接收器
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//.......
abortBroadcast();//截断有序广播
}
}
注册广播接收器
- 静态注册
AndroidManifest.xml
<application> <receiver android:name=".MyReceiver"> <intent-filter android:priority="100" > <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> - 动态注册 必须要在程序启动之后才能接收到广播
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); MyReceiver myReceiver=new MyReceiver(); registerReceiver(myReceiver, intentFilter); - 取消注册
@Override protected void onDestroy() { //activity super.onDestroy(); unregisterReceiver(myReceiver); }
发送广播
- 标准广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); - 有序广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendOrderedBroadcast(intent, null);//null权限 - 本地广播
private LocalBroadcastManager localBroadcastManager; localBroadcastManager = LocalBroadcastManager.getInstance(this); //发送本地广播 Intent intent = new Intent("com.example.broadcasttest.MY_LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); //注册本地广播 localBroadcastManager.registerReceiver(myReceiver, intentFilter);