Android-有序广播是可以中断的

Posted 原创Android 努力学习 专一安卓 持之以恒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-有序广播是可以中断的相关的知识,希望对你有一定的参考价值。

在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现:

 

有序广播:接收者 可以自己设置接受的顺序,所以叫有序广播

 

有序广播是可以中断的,而指定某个接收者的有序广播是无法中断的

 

androidManifest.xml订阅 两个接收者

<!--
            订阅(Xml形式订阅接收者)
            注意:订阅的是接收者,和广播发送没有半毛钱关系
         -->
        <receiver android:name=".br.MyBroadcastReceiver1">

            <intent-filter
                        android:priority="200"> <!-- 设置优先级别为 200 (最大100 / 最小 -1000) -->
                <!-- Action这是必写的 -->
                <action android:name="my.MyBroadcastReceiver.custom.action" />

                <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
                <data android:scheme="OOO" /> <!-- 注意:这里不能加 : -->

            </intent-filter>

        </receiver>

        <!--
            订阅(Xml形式订阅接收者)
            注意:订阅的是接收者,和广播发送没有半毛钱关系
         -->
        <receiver android:name=".br.MyBroadcastReceiver2">

            <intent-filter
                        android:priority="600"> <!-- 设置优先级别为 600 (最大100 / 最小 -1000) -->
                <!-- Action这是必写的 -->
                <action android:name="my.MyBroadcastReceiver.custom.action" />

                <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
                <data android:scheme="OOO" /> <!-- 注意:这里不能加 : -->

            </intent-filter>

        </receiver>

 

定义 MyBroadcastReceiver1 接收者

package liudeli.croadcast1.br;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 定义 接收者
 */
public class MyBroadcastReceiver1 extends BroadcastReceiver {

    private final String TAG = "MyBroadcastReceiver";

    /**
     * 接收的方法
     * @param context 传递过来的上下文
     * @param intent 传递过来的意图,可以获取很多信息
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "【1111111111】intent.getAction():" + intent.getAction());
        Log.d(TAG, "【1111111111】intent.getDataString():" + intent.getDataString());

        // 真实开发中是这样写的
        if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
            String data = intent.getDataString();
            String[] dataArray = data.split(":");
            Log.d(TAG, "【1111111111】data:" + dataArray[1]);
            Log.d(TAG, "【1111111111】music:" + intent.getStringExtra("music"));
        } else if ("xxx.action".equals(intent.getAction())) {
            // 做相应的业务逻辑处理
            // ...
        } else if ("xxx.action".equals(intent.getAction())) {
            // 做相应的业务逻辑处理
            // ...
        }
    }
}

 

定义 MyBroadcastReceiver2 接收者

package liudeli.croadcast1.br;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 定义 接收者
 */
public class MyBroadcastReceiver2 extends BroadcastReceiver {

    private final String TAG = "MyBroadcastReceiver";

    /**
     * 接收的方法
     * @param context 传递过来的上下文
     * @param intent 传递过来的意图,可以获取很多信息
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "【222222222】intent.getAction():" + intent.getAction());
        Log.d(TAG, "【222222222】intent.getDataString():" + intent.getDataString());

        // 真实开发中是这样写的
        if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
            String data = intent.getDataString();
            String[] dataArray = data.split(":");
            Log.d(TAG, "【222222222】data:" + dataArray[1]);
            Log.d(TAG, "【222222222】music:" + intent.getStringExtra("music"));
        } else if ("xxx.action".equals(intent.getAction())) {
            // 做相应的业务逻辑处理
            // ...
        } else if ("xxx.action".equals(intent.getAction())) {
            // 做相应的业务逻辑处理
            // ...
        }
    }
}

 

发送有序广播send:

  /**
     * 发送有序广播
     */
    public void sendOrderBroadcast(View view) {
        /**
         * 两个接收者在AndroidManifest.xml是这样订阅的:怎么订阅,就怎么发送
         *         <intent-filter>
         *                 <!-- Action这是必写的 -->
         *                 <action android:name="my.MyBroadcastReceiver.custom.action" />
         *
         *                 <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
         *                 <data android:scheme="OOO" /> <!-- 注意:这里不能加 : -->
         *         </intent-filter>
         */
        Intent intent = new Intent();
        intent.setAction("my.MyBroadcastReceiver.custom.action");
        intent.setData(Uri.parse("OOO:四环奥迪,五环奥运")); // 注意:要加 :
        intent.putExtra("music", "奥林匹克风歌曲"); // 而外携带值

        // 参数一:意图    参数二:谁能接收我的广播(自定义权限)
        sendOrderedBroadcast(intent, null);
    }

 

没在 MyBroadcastReceiver2 加入中断的日志

12-17 08:49:52.885 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:49:52.885 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:四环奥迪,五环奥运
12-17 08:49:52.887 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:49:52.887 4872-4872/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getDataString():OOO:四环奥迪,五环奥运

 

由于MyBroadcastReceiver2 接收者,优先接受到信息,所以在 MyBroadcastReceiver2中断广播,abortBroadcast();

package liudeli.croadcast1.br;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

/**
 * 定义 接收者
 */
public class MyBroadcastReceiver2 extends BroadcastReceiver {

    private final String TAG = "MyBroadcastReceiver";

    /**
     * 接收的方法
     * @param context 传递过来的上下文
     * @param intent 传递过来的意图,可以获取很多信息
     */
    @Override
    public void onReceive(Context context, Intent intent) {

        /**
         * 中断广播
         */
        abortBroadcast();

        Log.d(TAG, "【222222222】intent.getAction():" + intent.getAction());
        Log.d(TAG, "【222222222】intent.getDataString():" + intent.getDataString());

        // 真实开发中是这样写的
        if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
            String data = intent.getDataString();
            String[] dataArray = data.split(":");
            Log.d(TAG, "【222222222】data:" + dataArray[1]);
            Log.d(TAG, "【222222222】music:" + intent.getStringExtra("music"));
        } else if ("xxx.action".equals(intent.getAction())) {
            // 做相应的业务逻辑处理
            // ...
        } else if ("xxx.action".equals(intent.getAction())) {
            // 做相应的业务逻辑处理
            // ...
        }
    }
}

 

在 MyBroadcastReceiver2 加入中断的日志

12-17 08:56:36.008 5070-5070/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
12-17 08:56:36.008 5070-5070/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:四环奥迪,五环奥运

 

以上是关于Android-有序广播是可以中断的的主要内容,如果未能解决你的问题,请参考以下文章

android有序广播和无序广播的区别

Android之广播

alexkn android第一行代码-7.广播

android有序广播和无序广播的区别

Android--静态广播和动态广播的区别

Android四大组件——BroadcastReceiver普通广播有序广播拦截广播本地广播Sticky广播系统广播