0
点赞
收藏
分享

微信扫一扫

Android---有序广播

王远洋 2022-03-20 阅读 81

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==有序广播发送的第二站
举报

相关推荐

0 条评论