1、有序广播
类似于单位的通知,由上级一级一级往下传
2、有序广播的特点
- 有序
- 可以终止往下传达
- 可以在传达的过程中修改广播的内容
3、一个有序广播的案例
- 采用动态注册的方式去注册广播
- 涉及到有序广播的中断传递
- 涉及到有序广播传递内容中途进行修改
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".broadcast.SendOrderBroadcastActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送有序广播"
android:onClick="sendOrderBroadcastActivityMethod"/>
</LinearLayout>
package com.example.broadcastreceiverexample.broadcast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.example.broadcastreceiverexample.Contants;
import com.example.broadcastreceiverexample.R;
public class SendOrderBroadcastActivity extends AppCompatActivity {
private static final String TAG = "SendOrderBroadcastActivity";
private FirstBroadcastReceiver mFirstBroadcastReceiver;
private SecondBroadcastReceiver mSecondBroadcastReceiver;
private ThirdBroadcastReceiver mThirdBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_order_broadcast);
registerFirstBroadcastReceiver();
registerSecondBroadcastReceiver();
registerThirdBroadcastReceiver();
}
/**
* 动态注册第三个广播接收者
*/
private void registerThirdBroadcastReceiver() {
IntentFilter intentFilter3 = new IntentFilter();
intentFilter3.addAction(Contants.orderBroadcast);
//设置优先级,取值范围|1000|,默认值为0,优先级越高,越优先处理
intentFilter3.setPriority(200);
mThirdBroadcastReceiver = new ThirdBroadcastReceiver();
registerReceiver(mThirdBroadcastReceiver,intentFilter3);
}
/**
* 动态注册第二个广播接收者
*/
private void registerSecondBroadcastReceiver() {
IntentFilter intentFilter2 = new IntentFilter();
intentFilter2.addAction(Contants.orderBroadcast);
//设置优先级,取值范围|1000|,默认值为0
intentFilter2.setPriority(600);
mSecondBroadcastReceiver = new SecondBroadcastReceiver();
registerReceiver(mSecondBroadcastReceiver,intentFilter2);
}
/**
* 动态注册第一个广播接收者
*/
private void registerFirstBroadcastReceiver() {
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.addAction(Contants.orderBroadcast);
//设置优先级,取值范围|1000|,默认值为0
intentFilter1.setPriority(1000);
mFirstBroadcastReceiver = new FirstBroadcastReceiver();
registerReceiver(mFirstBroadcastReceiver,intentFilter1);
}
/**
* 为控件添加一个点击方法,用来发送广播
* @param view
*/
@RequiresApi(api = Build.VERSION_CODES.R)
public void sendOrderBroadcastActivityMethod(View view) {
Intent intent = new Intent();
intent.setAction(Contants.orderBroadcast);
Bundle bundle = new Bundle();
bundle.putString("message","有序广播发送的第一站");
//根据参数的不同使用不同的方法发送广播
//sendOrderedBroadcast(intent,null);
sendOrderedBroadcast(intent,null,null,null,null, Activity.RESULT_OK,null,bundle);
}
/**
* 创建第一个广播接收者
*/
public class FirstBroadcastReceiver extends BroadcastReceiver{
@SuppressLint("LongLogTag")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Contants.orderBroadcast)) {
Log.d(TAG, "onReceive: FirstBroadcastReceiver action ---> "+intent.getAction());
Bundle resultExtras = getResultExtras(true);
String message = resultExtras.getCharSequence("message").toString();
Log.d(TAG, "onReceive: message =="+message);
resultExtras.putCharSequence("content","有序广播发送的第二站");
setResultExtras(resultExtras);
}
}
}
/**
* 创建第二个广播接收者
*/
public class SecondBroadcastReceiver extends BroadcastReceiver{
@SuppressLint("LongLogTag")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Contants.orderBroadcast)) {
Log.d(TAG, "onReceive: SecondBroadcastReceiver action ---> "+intent.getAction());
//终止掉广播,针对有序广播
abortBroadcast();
Bundle resultExtras = getResultExtras(true);
String content = resultExtras.getCharSequence("content").toString();
Log.d(TAG, "onReceive: content=="+content);
}
}
}
/**
* 创建第三个广播接收者
*/
public class ThirdBroadcastReceiver extends BroadcastReceiver{
@SuppressLint("LongLogTag")
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Contants.orderBroadcast)) {
Log.d(TAG, "onReceive: ThirdBroadcastReceiver action ---> "+intent.getAction());
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mFirstBroadcastReceiver != null) {
unregisterReceiver(mFirstBroadcastReceiver);
}
if (mSecondBroadcastReceiver != null) {
unregisterReceiver(mSecondBroadcastReceiver);
}
if (mThirdBroadcastReceiver != null) {
unregisterReceiver(mThirdBroadcastReceiver);
}
}
}
4、场景日志
- 正常进行有序广播的传递的log
2022-03-20 17:22:33.915 2568-2568/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: FirstBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
2022-03-20 17:22:33.928 2568-2568/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: SecondBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
2022-03-20 17:22:33.930 2568-2568/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: ThirdBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
- 中断有序广播传递的log
2022-03-20 17:23:21.378 2568-2568/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: FirstBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
2022-03-20 17:23:21.380 2568-2568/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: SecondBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
- 中间修改有序广播传递信息的log
2022-03-20 17:01:23.612 2188-2188/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: FirstBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
2022-03-20 17:01:23.612 2188-2188/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: message ==有序广播发送的第一站
2022-03-20 17:01:23.624 2188-2188/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: SecondBroadcastReceiver action ---> com.android.example.SEND_ORDER_BROADCAST
2022-03-20 17:01:23.624 2188-2188/com.example.broadcastreceiverexample D/SendOrderBroadcastActivity: onReceive: content==有序广播发送的第二站