android 系统提供了两种广播类型,有序广播和无序广播,可以根据不同的程序设计不同的类型。
无序广播是完全异步执行,发送广播时所有监听 这个广播的接受者都会接受,但接受的顺序不确定。
有序广播是按接受者的优先级接受,只有一个能接受消息,在此广播站接受者逻辑执行完成后,才会继续传递。
如图:
无序广播
有序广播
public class SendOrderActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_order);
}
public void send1(View view)
{
Intent intent = new Intent();
intent.setAction("Intercept_Stitch");
sendOrderedBroadcast(intent,null);
}
}
创建3个有序广播MyReceiver1 ,MyReceiver2 ,MyReceiver3
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Log.i("MyReceiver1","接受到广播1");
//throw new UnsupportedOperationException("Not yet implemented");
}
}
清单文件中
使他们的优先级不同
1.
<receiver
android:name=".MyReceiver1"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="1000">
<action android:name="Intercept_Stitch"></action>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="200">
<action android:name="Intercept_Stitch"></action>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver3"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="600">
<action android:name="Intercept_Stitch"></action>
</intent-filter>
</receiver>
可以看出优先级大的先接受
2.
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="1000">
<action android:name="Intercept_Stitch"></action>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver1"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="1000">
<action android:name="Intercept_Stitch"></action>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver3"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="600">
<action android:name="Intercept_Stitch"></action>
</intent-filter>
</receiver>
优先级相同的按创建的顺序接收
3.使用abortBroadcast();拦截有序广播
public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Log.i("MyReceiver2","接受到广播2");
abortBroadcast();//拦截有序广播
Log.i("MyReceiver2","我是广播终结者2");
//throw new UnsupportedOperationException("Not yet implemented");
}
}
可以看到有序广播1,3都被拦截了