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