zoukankan      html  css  js  c++  java
  • Android-有序广播明确指定接收者

    在上一篇博客,Android-有序广播是可以中断的,介绍了 有序广播是可以中断的,但还有一种例外情况:明确指定接收者的有序广播是无法中断的,一定会发送到指定的接收者

    AndroidManifest.xml形式订阅两个接收者,两个接收者的 action/data一模一样,只是优先级不一样

    MyBroadcastReceiver2 优先级 600 会先接收到

    MyBroadcastReceiver1 优先级 200 会后接收到

         <!--
                订阅(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 在 onReceive()方法  中断广播 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())) {
                // 做相应的业务逻辑处理
                // ...
            }
        }
    }

    发送广播

    发送明确指定(MyBroadcastReceiver1) 的广播

      /**
         * 发送有序广播 明确指定MyBroadcastReceiver1接收者
         */
        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", "大海歌曲"); // 而外携带值
    
            /**
             * 参数三:明确指定 接收者 MyBroadcastReceiver1
             */
            sendOrderedBroadcast(intent, // 意图
                                 null, // 谁能接收我的广播(自定义权限)
                                  new MyBroadcastReceiver1(), // 可以指定的 接收者
                                 null, // 用于处理的Handler
                                 9,    // 初始化Code
                                 null, // 初始化数据
                                 null // Bundle携带的参数
            );
        }

    Log日志:【222222222】的优先级最高 先接收到广播(然后中断广播),   【1111111111】还可以接收到广播 (是因为【1111111111】是明确指定的 接收者,一定会接收到)

    12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getAction():my.MyBroadcastReceiver.custom.action
    12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【222222222】intent.getDataString():OOO:张雨生第四张专辑
    12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getAction():my.MyBroadcastReceiver.custom.action
    12-17 19:54:54.987 2374-2374/liudeli.croadcast1 D/MyBroadcastReceiver: 【1111111111】intent.getDataString():OOO:张雨生第四张专辑

  • 相关阅读:
    js 创建函数,传递三个参数,返回最大值
    JS 实现 计算1~任意数字之间的所有整数阶乘的和
    npm install
    如何在浏览器上安装 VueDevtools工具
    前端日历插件
    css隐藏元素的几种方法
    less和sass的区别
    vue.js 自定义事件
    vue简单的导航栏
    用jetty启动idea中的maven项目报错Caused by: java.lang.ClassNotFoundException: org.apache.jasper.runtime.JspApplicationContextImpl
  • 原文地址:https://www.cnblogs.com/android-deli/p/10135089.html
Copyright © 2011-2022 走看看