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后静态注册广播接收者,隐式发送广播时广播接收者将不会收到消息。
如果要隐私发送广播则应动态注册,若静态注册则只能显示发送广播

发布了194 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39027256/article/details/103703061
今日推荐