android開發:無序廣播和有序廣播區別

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後靜態註冊廣播接收者,隱式發送廣播時廣播接收者將不會收到消息。
如果要隱私發送廣播則應動態註冊,若靜態註冊則只能顯示發送廣播

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