zoukankan      html  css  js  c++  java
  • Android-无序广播

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

    无序广播:接收者 同时接收到,没有顺序,所以叫无序广播

    1.点击按钮发送广播出去,---> 给广播接收者,广播接收者需要订阅才能接收得到:

    AndroidManifest.xml方式订阅 接收者

         <!--
                订阅(Xml形式订阅接收者)
                注意:订阅的是接收者,和广播发送没有半毛钱关系
             -->
            <receiver android:name=".MyBroadcastReceiver">
    
                <intent-filter>
                    <!-- Action这是必写的 -->
                    <action android:name="my.MyBroadcastReceiver.custom.action" />
    
                    <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
                    <data android:scheme="EXO" /> <!-- 注意:这里不能加 : -->
    
                </intent-filter>
    
            </receiver>

    定义 MyBroadcastReceiver 接收者

    package liudeli.croadcast1;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    /**
     * 定义 接收者
     */
    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        private final String TAG = MyBroadcastReceiver.class.getSimpleName();
    
        /**
         * 接收的方法
         * @param context 传递过来的上下文
         * @param intent 传递过来的意图,可以获取很多信息
         */
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "intent.getAction():" + intent.getAction());
            Log.d(TAG, "intent.getDataString():" + intent.getDataString());
        }
    }

    2.发送广播

    注意:发送广播的原则:接收者怎么订阅的,我就怎么发送send:

      /**
         * 发送无序广播
         * @param view
         */
        public void sendDisorderBroadcast(View view) {
            /**
             * 接收者是这样订阅的:
             *             <intent-filter>
             *                 <!-- Action这是必写的 -->
             *                 <action android:name="my.MyBroadcastReceiver.custom.action" />
             *
             *                 <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
             *                 <data android:scheme="EXO" /> <!-- 注意:这里不能加 : -->
             *
             *             </intent-filter>
             */
            Intent intent = new Intent();
            intent.setAction("my.MyBroadcastReceiver.custom.action");
            intent.setData(Uri.parse("EXO:")); // 注意:要加 :
            sendBroadcast(intent);
        }

    Log日志打印:

    12-17 07:15:47.317 2358-2358/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getAction():my.MyBroadcastReceiver.custom.action
    12-17 07:15:47.317 2358-2358/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getDataString():EXO:


    第二种方式订阅接收者(Java代码中订阅),比AndroidManifest.xml更加灵活

    private MyBroadcastReceiver myBroadcastReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_new);
    
            /**
             * 【Java代码方式订阅 接收者】
             * 唯一可以new的组件就是 广播 接收者
             */
            myBroadcastReceiver = new MyBroadcastReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("my.MyBroadcastReceiver.custom.action2");
            intentFilter.addDataScheme("Beyond"); // 注意:这里不能加 :
            registerReceiver(myBroadcastReceiver, intentFilter);
        }
    
        /**
         * 发送无序广播
         */
        public void sendDisorderBroadcastJava(View view) {
            /**
             * 接收者是这样订阅的:怎么订阅,就怎么发送
             *         IntentFilter intentFilter = new IntentFilter();
             *         intentFilter.addAction("my.MyBroadcastReceiver.custom.action2");
             *         intentFilter.addDataScheme("Beyond"); // 注意:这里不能加 :
             */
            Intent intent = new Intent();
            intent.setAction("my.MyBroadcastReceiver.custom.action2");
            intent.setData(Uri.parse("Beyond:香港著名殿堂级乐队灵魂人物黄家驹")); // 注意:要加 :
            intent.putExtra("music", "海阔天空 作词作曲 黄家驹");
            sendBroadcast(intent);
        }
    
        /**
         * Java方式订阅接收者后 必须要解除订阅
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (myBroadcastReceiver != null)
                unregisterReceiver(myBroadcastReceiver);
        }

    定义MyBroadcastReceiver接收者:

    package liudeli.croadcast1;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    /**
     * 定义 接收者
     */
    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        private final String TAG = MyBroadcastReceiver.class.getSimpleName();
    
        /**
         * 接收的方法
         * @param context 传递过来的上下文
         * @param intent 传递过来的意图,可以获取很多信息
         */
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "intent.getAction():" + intent.getAction());
            Log.d(TAG, "intent.getDataString():" + intent.getDataString());
    
            // 真实开发中是这样写的
            if ("my.MyBroadcastReceiver.custom.action2".equals(intent.getAction())) {
                String data = intent.getDataString();
                String[] dataArray = data.split(":");
                Log.d(TAG, "data:" + dataArray[1]);
                Log.d(TAG, "music:" + intent.getStringExtra("music"));
            } else if ("xxx.action".equals(intent.getAction())) {
                // 做相应的业务逻辑处理
                // ...
            } else if ("xxx.action".equals(intent.getAction())) {
                // 做相应的业务逻辑处理
                // ...
            }
        }
    }

    Log日志打印:

    12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getAction():my.MyBroadcastReceiver.custom.action2
    12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: intent.getDataString():Beyond:香港著名殿堂级乐队灵魂人物黄家驹
    12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: data:香港著名殿堂级乐队灵魂人物黄家驹
    12-17 07:37:24.002 3214-3214/liudeli.croadcast1 D/MyBroadcastReceiver: music:海阔天空 作词作曲 黄家驹


    AndroidManifest.xml订阅方式  与  Java订阅方式,是一样的,只是代码语法稍微有点差别而已:

        /**
             * 【Java代码方式订阅 接收者】
    * 唯一可以new的组件就是 广播 接收者
    */ myBroadcastReceiver = new MyBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("my.MyBroadcastReceiver.custom.action2"); intentFilter.addDataScheme("Beyond"); // 注意:这里不能加 : registerReceiver(myBroadcastReceiver, intentFilter);
         <!--
                订阅(Xml形式订阅接收者)
                注意:订阅的是接收者,和广播发送没有半毛钱关系
             -->
            <receiver android:name=".MyBroadcastReceiver">
    
                <intent-filter>
                    <!-- Action这是必写的 -->
                    <action android:name="my.MyBroadcastReceiver.custom.action" />
    
                    <!-- 这个可有可无,一旦加了,发送者也必须要设置 -->
                    <data android:scheme="EXO" /> <!-- 注意:这里不能加 : -->
    
                </intent-filter>
    
            </receiver>

     

  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/android-deli/p/10133423.html
Copyright © 2011-2022 走看看