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>

 

原文地址:https://www.cnblogs.com/android-deli/p/10133423.html