1.無序廣播
就是我們普通的廣播,接收者接收無序廣播沒有優先級之分,並且無序廣播不可以被攔截,接收者之間不能傳遞數據。
2.有序廣播
接收者接收有序廣播有優先級之分,有序廣播可以被接收者攔截、修改。例如廣播接收者A和B,A的優先級高於B,則廣播會先發送到A,A可以攔截廣播停止傳播,一旦攔截後面的接收者將不會收到廣播,而且A可以根據廣播的數據內容給B發送數據,B也可以接收A的數據。
1.我們定義倆個廣播接收者類,在第一個接收者中攔截廣播:
public class Receiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Log.e("Receiver1", name);
//攔截廣播
abortBroadcast();
}
}
public class Receiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Log.e("Receiver2", name);
}
}
2.在activity中註冊廣播接收者,設置優先級,併發送有序廣播:
public class MainActivity extends AppCompatActivity {
Receiver1 receiver1;
Receiver2 receiver2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//動態註冊接收者1,接收優先級1
IntentFilter intentFilter1 = new IntentFilter("com.example.leidong.action.OrderedBroadcast");
receiver1 = new Receiver1();
intentFilter1.setPriority(1);
registerReceiver(receiver1, intentFilter1);
//動態註冊接收者2,接收優先級0
IntentFilter intentFilter2 = new IntentFilter("com.example.leidong.action.OrderedBroadcast");
receiver2 = new Receiver2();
intentFilter1.setPriority(0);
registerReceiver(receiver2, intentFilter2);
//發送有序廣播
Intent intent = new Intent("com.example.leidong.action.OrderedBroadcast");
intent.putExtra("name", "張三");
sendOrderedBroadcast(intent, null);
}
@Override
protected void onDestroy() {
//廣播註銷
unregisterReceiver(receiver1);
unregisterReceiver(receiver2);
super.onDestroy();
}
}
3.打印結果:
2019-12-25 17:51:24.830 18811-18811/com.example.serializationapplication E/Receiver1: 張三
總結:
1.發送有序廣播需要調用:
sendOrderedBroadcast(intent, null);
,並且廣播接收者要設置優先級。
2.攔截廣播時需要調用:abortBroadcast();
4.修改有序廣播:
public class Receiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Log.e("Receiver1", name);
//終止廣播
// abortBroadcast();
Bundle b = new Bundle();
b.putString("age","23");
setResultExtras(b);
}
}
public class Receiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Log.e("Receiver2", name);
Bundle bundle = getResultExtras(true);
Log.e("Receiver2", bundle.getString("age"));
}
}
輸出結果:
2019-12-25 17:51:24.830 18811-18811/com.example.serializationapplication E/Receiver1: 張三
2019-12-25 17:51:24.962 18811-18811/com.example.serializationapplication E/Receiver2: 張三
2019-12-25 17:51:24.962 18811-18811/com.example.serializationapplication E/Receiver2: 23
總結:
在優先級較高的廣播接收者中調用
setResultExtras(b)
傳入一個Bundle
對象作爲數據傳遞到下層,在優先級較低的廣播接收者中調用getResultExtras()
可以獲取上一層的傳遞的數據。
需要注意的是:
android8.0後靜態註冊廣播接收者,隱式發送廣播時廣播接收者將不會收到消息。
如果要隱私發送廣播則應動態註冊,若靜態註冊則只能顯示發送廣播