簡介:
有序廣播,
從優先級別最高的廣播接收器開始接收,接收完了如果沒有丟棄,就下傳給下一個次高優先級別的廣播接收器進行處理,
依次類推,直到最後。
如果多個應用程序設置的優先級別相同,執行順序不確定,如果沒有設置優先級,默認是0。
API:
sendOrderedBroadcast(intent,null);
作用是:發送Ordered Broadcast
sendOrderedBroadcast(intent, receiverPermission, resultReceiver,
scheduler, initialCode, initialData, initialExtras);
作用是:發送Ordered Broadcast
參數 resultReceiver,可以自己重寫一個類,作爲一個最終的receive 最後都能夠接收到廣播,最終的receiver 不需要再清單文件裏面配置,
參數 initialData可以作爲傳輸的數據。
靜態註冊
android:priority="10"
動態註冊
intentFilter.setPriority(100);
作用是:設置優先級,優先級越高的越早能接收到廣播。(取值範圍:-1000~10000)
setResultExtras(Bundle)
作用是:將數據存入Broadcast , 再傳遞給下一級接收者。
Bundle bundle = getResultExtras(true)
作用是:獲取上一級傳遞過來的數據。(上上一級也闊以)
abortBroadcast()
作用是:中斷廣播,不會再響比它有優先級低得廣播再傳播下去了
事例:
public class SendOrderBroadcastActivity extends Activity {
static final String TAG = "SendOrderBroadcastActivity";
static final String ACTION = "com.x.text.SendOrderBroadcastActivity";
static final String KEY = "com.x.text.SendOrderBroadcastActivity";
static final String KEY_MAIN = "com.x.text.main";
@BindView(R.id.order_btn)
TextView orderBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order_broadcast);
ButterKnife.bind(this);
initReceiver1();
initReceiver2();
initReceiver3();
}
EndReceiver myReceiver;
private void initReceiver3() {
myReceiver = new EndReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION);
registerReceiver(myReceiver, intentFilter);
}
private void initReceiver2() {
MyReceiver2 myReceiver = new MyReceiver2();
IntentFilter intentFilter = new IntentFilter();
intentFilter.setPriority(-200);
intentFilter.addAction(ACTION);
registerReceiver(myReceiver, intentFilter);
}
private void initReceiver1() {
MyReceiver myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.setPriority(200);
intentFilter.addAction(ACTION);
registerReceiver(myReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@OnClick(R.id.order_btn)
public void onViewClicked() {
Intent intent = new Intent(ACTION);
intent.putExtra(KEY_MAIN,"存入數值KEY_MAIN");
sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"最後的廣播");
}
}, null,
0, null, null);
}
private class EndReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
String name = bundle.getString(KEY);
Log.i(TAG, "EndReceiver onReceive:"+name);
}
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "MyReceiver onReceive");
Bundle bundle = new Bundle();
bundle.putString(KEY,"優先級高的廣播存入數值");
setResultExtras(bundle);
}
}
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
String name = bundle.getString(KEY);
Log.i(TAG, "MyReceiver2 onReceive:"+name);
}
}
}
- Log輸出:
- MyReceiver onReceive
- EndReceiver onReceive:優先級高的廣播存入數值
- MyReceiver2 onReceive:優先級高的廣播存入數值
- 最後的廣播
參考:
Android學習筆記(十二)BroadcastReceiver的有序廣播和優先級:
https://www.cnblogs.com/codingblock/p/4856559.html