1. 程式人生 > >Android-有序廣播明確指定接收者

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:張雨生第四張專輯