• 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>

     

  • 相关阅读:
    Oracle+PL+SQL从入门到精通.丁士锋.清华大学出版社.2012
    《 Oracle查询优化改写 技巧与案例 》电子工业出版社
    HTML5从入门到精通(明日科技) 中文pdf扫描版
    《JavaWeb从入门到精通》(明日科技,清华大学出版社)
    JavaScript从入门到精通(附光盘1张):作者:明日科技出版社:清华大学出版社出版时间:2012年09月
    ORACLE_修改实例的内存大小
    JAVA图书管理系统汇总共27个
    IntelliJ Idea 2017 免费激活方法
    spring springMvc spring-boot spring-cloud分别是什么
    nodejs环境 + 入门 + 博客搭建
  • 原文地址:https://www.cnblogs.com/android-deli/p/10133423.html
Copyright © 2020-2023  润新知