有序廣播 sendOrderedBroadcast

簡介:

有序廣播,
從優先級別最高的廣播接收器開始接收,接收完了如果沒有丟棄,就下傳給下一個次高優先級別的廣播接收器進行處理,
依次類推,直到最後。
如果多個應用程序設置的優先級別相同,執行順序不確定,如果沒有設置優先級,默認是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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章