Android廣播:Broadcast與BroadcastReceiver

一、廣播簡介

1. 廣播傳播機制:

  廣播接收器,也被稱爲全局事件,或系統事件。
  當Android系統中任何程序有動作時,如果想通知其他程序,採用廣播的方式進行傳播是非常有效的。廣播從理論上說,可以將一個動作傳播給任意多個程序(當然,廣播接收器的數量會收到系統限制)。
  在Android中,有一些操作完成以後,會發送廣播,比如說發出一條短信,或打出一個電話,如果某個程序接收了這個廣播,就會做相應的處理。這個廣播跟我們傳統意義中的電臺廣播有些相似之處。之所以叫做廣播,就是因爲它只負責“說”而不管你“聽不聽”,也就是不管你接收方如何處理。另外,廣播可以被不只一個應用程序所接收,當然也可能不被任何應用程序所接收。
  廣播機制最大的特點就是發送方並不關心接收方是否接到數據,也不關心接收方是如何處理數據的。
  Android中廣播的是操作系統中產生的各種各樣的事件。例如,收到一條短信就會產生一個收到短信息的事件。而Android操作系統一旦內部產生了這些事件,就會向所有的廣播接收器對象來廣播這些事件。

2. 廣播傳播機制的三要素:

  Android廣播機制包含三個基本要素:
  1、廣播(Broadcast) - 用於發送廣播;
  2、廣播接收器(BroadcastReceiver) - 用於接收廣播;
  3、意圖內容(Intent)-用於保存廣播相關信息的媒介。

3. 廣播的分類:

  • 普通廣播 (Normal broadcast)
       a. 所有監聽該廣播接受者都可以監聽到該廣播
       b. 同級別接收先後順序是隨機的(無序)
       c. 級別低的後收到廣播
       d. 接收器不能截斷廣播的繼續傳播,也不能處理廣播
       e. 同級別動態註冊高於靜態註冊
  • 有序廣播 (Oredered broadcast)
       a. 按照接收者的優先順序來接收廣播,優先級別在intent-filter中的priority中聲明,-1000到1000之間,
       值越大優先級越高,可以終止廣播的繼續傳播,接受者可以修改intent的內容。
       b. 同級別接收先後順序是隨機的(無序)
       c. 級別低的後收到廣播
       d. 能截斷廣播的繼續傳播,高級別的廣播接收器接收廣播後能決定是否截斷。
       e. 能處理廣播
       f. 同級別動態註冊高於靜態註冊
  • 異步廣播 (粘滯性滯留廣播) ps:已被棄用
       a. 不能處理結果給下一個接收者,無法終止廣播。
       b. 一直存在
       c. 可以先發送廣播,再註冊接收器
       d. 需要在清單文件添加android.permission.BROADCAST_STICKY權限

4. 發送廣播:

  把信息裝入一個Intent對象(如:Action、Category),通過調相應的方法將Intent對象以廣播的方式發送出去:
  sendBroadcast();
  sendOrederBroadcast();
  sendStickyBroadcast();

二、廣播接收器BroadcastReceiver

1. 概念:

  BroadcastReceiver(廣播接收器)是爲了實現系統廣播而提供的一種組件,並且廣播事件處理機制是系統級別的。比如,我們可以發出一種廣播來測試是否收到短信,這時候就可以定義一個BraodcastReceiver來接受廣播,當收到短信時提示用戶。我們既可以用Intent來啓動一個組件,也可以用sendBroadcast()方法發起一個系統級別的事件廣播來傳遞消息。
  我們也可以在自己的應用程序中開發BroadcastReceiver,然後把廣播接收器這個類或者對象註冊到Android操作系統上去,讓操作系統知道現在有這樣一個廣播接收器正在等待接收Android操作系統的廣播,即在自己的應用程序中實現BroadcastReceiver來監聽和響應廣播的Intent。
  當有廣播事件產生時,Android操作系統首先告訴註冊到其上面的廣播接收器產生了一個怎麼樣的事件,每個接收器首先判斷是不是我這個接收器需要的事件,如果是它所需要的事件,再進行相應的處理。
  例子:我們把騷擾電話的黑名單放到數據庫中去,當接到電話時會產生一個接電話事件,事先在Android操作系統中註冊一個BroadcastReceiver的對象,當產生事件的時候,會通知我們的廣播接收器對象,接收器對象接收到消息之後,就會到數據庫裏面去取所有黑名單電話和接到的這個電話號碼進行比較,如果匹配就直接掛掉。

2. 生命週期:

  1、廣播接收器僅在它執行這個方法時處於活躍狀態。當onReceive()返回後,它即爲失活狀態
  2、擁有一個活躍狀態的廣播接收器的進程被保護起來而不會被殺死,但僅擁有失活狀態組件的進程則會在其它進程需要它所佔有的內存的時候隨時被殺掉。
  3、如果響應一個廣播信息需要很長的一段時間,一般會將其納入一個子線程中去完成,而不是在主線程內完成它,從而保證用戶交互過程的流暢。廣播接收程序的時間限制爲10秒。(注意不要直接在onReceive()方法中創建新線程)

3. 註冊BroadcastReceiver:

  BroadcastReceiver用於監聽被廣播的事件(Intent),爲了達到這個目的,BroadcastReceiver必須進行註冊,註冊的方法有以下兩種:
3.1 靜態註冊
  靜態註冊——即,在AndroidManifest.xml的application裏面定義receiver並設置要接收的action。
  如果在清單配置文件中配置了廣播接收器,那麼程序在安裝後會自動註冊廣播接收器。
  靜態註冊方式的特點:不管該應用程序是否處於活動狀態,都會進行監聽。
  

<receiver
    android:name=".MessageReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="1">

        <!-- 監聽短信 -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

  其中,MessageReceiver爲繼承BroadcastReceiver的類,重寫了onReceiver方法,並在onReceiver方法中對廣播進行處理。intent-filter標籤設置過濾器,接收指定action廣播。
3.2 動態註冊
  動態註冊——即,在activity裏面調用當前上下文對象的registerReceiver() 方法來註冊。
  和靜態的註冊差不多,一個形參是receiver對象,另一個是IntentFilter對象。而IntentFilter構造方法的參數是要接收的action。
  動態註冊方式特點:在代碼中進行註冊後,當應用程序關閉後,就不再進行監聽。
  補充:動態註冊廣播接收器的特點,就是當用來註冊的 Activity 關掉後,廣播也就失效了。同時反映了靜態註冊的一個優勢,就是無需擔憂廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器就是打開着的。
  

 ScreenReceiver screenReceiver = new ScreenReceiver();
 IntentFilter filter = new IntentFilter();
 // 監聽鎖屏
 filter.addAction(Intent.ACTION_SCREEN_OFF);
 // 解鎖屏幕
 filter.addAction(Intent.ACTION_SCREEN_ON);

  其中,screenReceiver 爲繼承BroadcastReceiver的類,重寫了onReceiver方法,並在onReceiver方法中對廣播進行處理。IntentFilter對象調用addAction()方法設置過濾器,接收指定action廣播。

4. 廣播接收器的優先級:

<receiver android:name=".EngineerReceiver">
    // priority屬性表示廣播的優先級,數值越大優先級越高,該接收器也就越先收到廣播
    <intent-filter android:priority="1">
         <action android:name="MyOrderedBroadcast_Send"/>
    </intent-filter>
</receiver>

5. 接收廣播:

  當Intent發送之後,所有已經註冊BroadcastReceiver會檢查註冊時的IntentFilter是否與發送的Intent相匹配,若匹配則就會調用BroadcastReceiver的onReceiver()方法。所以當我們定義一個BroadcastReceiver的時候,都需要實現onReceiver()方法。
  【注意】:BroadReceiver生命週期只有十秒左右,不能直接執行耗時操作,不然會出現ANR(應用程序無響應),也不能用子線程來做,因爲每次廣播來的時候都會創建一個Reveiver對象,並且調用onReceiver,執行完之後 ,對象會立刻被銷燬,子線程也沒了。要做耗時操作的話,應該通過發送Intent給Service,由Service來完成。
  動態註冊廣播接受者,要在onStop回調方法中註銷廣播接收器unregisterReceiver(receiver);

6. 註銷BroadcastReceiver:

  1. 一般在onStart中註冊BroadcastReceiver,在onStop中取消BroadcastReceiver。
  2. 一個BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)時纔有效,當從該方法返回後,該對象就無效了,結束生命週期。

三、案例演示

1. 接收系統廣播

MainActivity 類

package com.danny_jiang.day21_systembroadcast;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

/**
 * 創建廣播接收器的步驟:
 * 1 自定義類繼承BroadcastReceiver類
 * 2 複寫onReceive方法,接收廣播並做相應的操作
 * 3 註冊廣播:靜態註冊、動態註冊
 *  靜態註冊:
 *      AndroidManifest.xml文件中使用receiver標籤註冊
 *          需要指定name屬性,指定使用的是哪一個廣播接收器
 *          需要指定action,指定需要接收的哪一類廣播
 * 
 * 注意:有些廣播需要添加權限
 *
 */
public class MainActivity extends Activity {

    private ScreenReceiver screenReceiver;
    private IntentFilter filter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 屏幕喚醒和休眠廣播只能在代碼中註冊,如果在清單配置文件中註冊將不起作用
        screenReceiver = new ScreenReceiver();
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
    }

    @Override
    protected void onStart() {
        super.onStart();
        // 註冊廣播,一般放在onStart方法中
        registerReceiver(screenReceiver, filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 註銷廣播,一般放在onStop方法中
        unregisterReceiver(screenReceiver);
    }
}

A. 短信接收與攔截

package com.danny_jiang.day21_systembroadcast;

import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.telephony.SmsMessage;

/**
 * 接收短信的廣播接收器 
 * 當接收到短信廣播之後,解析廣播中的內容,發送通知提示用戶收到短信內容
 * Protocol Data Unit  (PDU:協議數據單元)
 */
public class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String phoneNum = "";// 短信號碼
        StringBuilder sb = new StringBuilder();// 短信內容

        Bundle bundle = intent.getExtras();
        Object[] objs = (Object[]) bundle.get("pdus");// pdus協議數據單元

        for (Object obj : objs) {
            SmsMessage sm = SmsMessage.createFromPdu((byte[]) obj);

            // 通過SmsMessage獲取發送短信的號碼
            phoneNum = sm.getOriginatingAddress();

            // 通過SmsMessage獲取發送短信的正文
            String body = sm.getMessageBody();
            sb.append(body);
        }
        android.util.Log.e("TAG",
                "接收到短信 號碼: " + phoneNum + " 內容: " + sb.toString());

        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                context);
        builder.setSmallIcon(R.drawable.ic_launcher);
        builder.setTicker("來短信了,別玩啦");
        builder.setContentTitle("號碼 " + phoneNum);
        builder.setContentText(sb.toString());

        NotificationManager manager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        manager.notify(1, builder.build());

        // 中斷廣播,短信發送是有序廣播,中斷廣播之後系統將收不到廣播(即收不到短信)
        // (前提是該廣播接收者的優先級要大於系統廣播接收者的優先級)
        abortBroadcast();
    }
}

B. 監聽網絡連接狀態

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

/**
 * 接收網絡連接狀態發送改變的廣播接收器
 */
public class ConnetivityChangeReceiver extends BroadcastReceiver{

    /**
     * 當手機網絡連接狀態發生改變之後,此方法會被調用
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        /*
         * 監聽手機網絡是否已經連上 
         */
        // 第一步:獲取系統服務ConnectivityManager連接管理器
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                Context.CONNECTIVITY_SERVICE);

        // 第二步:獲取手機的網絡連接描述對象
        NetworkInfo netWorkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        // 第三步:通過網絡連接描述對象獲取當前的狀態
        NetworkInfo.State state = netWorkInfo.getState();

        if(state == NetworkInfo.State.CONNECTED) {
            Toast.makeText(context, "手機網絡已連接,請注意流量費用", 
                    Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "手機網絡已斷開,請檢查網絡設置", 
                    Toast.LENGTH_SHORT).show();
        }
    }
}

C. 監聽系統開機

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * 接收系統開機的廣播
 */
public class BootCompletedReceiver extends BroadcastReceiver{

    /**
     * 當接收到系統已經完成開機的廣播之後,此方法會被調用
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "開機完成", Toast.LENGTH_SHORT).show();
        android.util.Log.e("TAG", "開機完成");
    }
}

D. 監聽電話狀態

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;

public class PhoneReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 獲得一個電話管理器
        TelephonyManager manager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        Bundle bundle = intent.getExtras();

        // 獲得來電號碼
        String phoneNumber = bundle
                .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);

        // 獲得當前通話狀態
        int callState = manager.getCallState();

        switch (callState) {
        case TelephonyManager.CALL_STATE_RINGING:
            // 電話響鈴
            android.util.Log.e("TAG", "響鈴");
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            // 接通電話
            android.util.Log.e("TAG", "接通電話");
            break;
        case TelephonyManager.CALL_STATE_IDLE:
            // 掛斷電話
            android.util.Log.e("TAG", "掛斷電話");
            break;
        default:
            break;
        }
    }
}

E. 監聽解屏與鎖屏狀態

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_SCREEN_OFF.equals(action)) {
            android.util.Log.e("TAG", "鎖屏");
        } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
            android.util.Log.e("TAG", "開屏");
        }
    }
}

AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.danny_jiang.day21_systembroadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- 申請接收系統開機完成的廣播權限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <!-- 申請接收網絡連接狀態發生改變的廣播權限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!-- 申請接收短信廣播的權限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <!-- 申請接收電話接聽狀態發生改變的廣播權限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- 申請接收屏幕解屏與鎖屏發生改變的廣播權限 -->
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 
               靜態註冊:
               在AndroidManifest.xml文件中通過receiver標籤註冊
               即使程序沒有打開,也會接收到所註冊的廣播信息(3.2版本之後,APP必須運行過一次)
         -->

        <!--接收系統開機的廣播-->
        <receiver android:name=".BootCompletedReceiver">
            <intent-filter >
                <!-- 以下action表示的是系統發送開機完成的廣播action -->
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <!-- 註冊網絡連接狀態發送改變的廣播接收器 -->
        <receiver android:name=".ConnetivityChangeReceiver">
            <intent-filter >
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

        <!-- 註冊接收短信的廣播接收器 -->
        <receiver android:name=".SmsReceiver">
            <intent-filter >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

        <!-- 註冊電話接聽狀態發送改變的廣播接收器 -->
        <receiver android:name=".PhoneReceiver">
            <intent-filter >
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
        </receiver>

        <!-- 註冊屏幕解屏與鎖屏狀態發送改變的廣播接收器 -->
        <receiver android:name=".ScreenReceiver">
        </receiver>
    </application>

</manifest>

2. 自定義廣播的發送與接收

MainActivity 類

package com.danny_jiang.day21_sendbroadcast;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 發送普通廣播
     * @param view
     */
    public void sendNormal(View view) {
        // 初始化意圖Intent
        Intent intent = new Intent();

        // 添加活動(頻道)
        intent.setAction("MyBroad_Jiang");

        // 向廣播中添加數據
        intent.putExtra("pdus", "各部門注意了: 明天加班");

        // 發送廣播
        sendBroadcast(intent);
    }

    /**
     * 發送有序廣播
     * @param view
     */
    public void sendOrder(View view) {
        Intent intent = new Intent();

        intent.setAction("MyOrderedBroadcast_Jiang");

        intent.putExtra("data", "客戶已打款100W,需要在3個月之內完成");

        /**
         * 第一個參數:發送廣播的意圖對象
         * 第二個參數:發送廣播的權限
         * 第三個參數:最終廣播接收器,不管廣播是否終止,都會接收到此廣播消息
         */
        sendOrderedBroadcast(intent, "permission.danny_jiang", new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                android.util.Log.e("danny", "最後的小兵接收到消息");
            }
        }, null, 0, "信息務必準確", null);
    }
}

廣播接收器:接收普通廣播

package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * 接收普通廣播
 *
 */
public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String info = intent.getStringExtra("pdus");
        Toast.makeText(context, "收到郵件:" + info, Toast.LENGTH_SHORT).show();
    }
}

廣播接收器:接收有序廣播

package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收有序廣播
 *
 */
public class ExecutiveReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String content = intent.getStringExtra("data");
        android.util.Log.e("danny", "總監接收到總部發送內容:" + content);

        //通過getResultData可以獲取此有序廣播中的DATA數據
        String initialData = getResultData();
        android.util.Log.e("danny", "附加信息是 " + initialData);

        // 處理廣播發送的信息
        setResultData("收到客戶打款50W,需求在2個月之內完成");
    }
}
package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收有序廣播
 *
 */
public class ManagerReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String content = intent.getStringExtra("data");
        android.util.Log.e("danny", "總經理接收到總部發送內容:" + content);

        //通過getResultData可以獲取此有序廣播中的DATA數據
        String data = getResultData();
        android.util.Log.e("danny", "總經理收到總監發送的通知內容 " + data);

        //setResultData("客戶打款20W,需求在1個月內完成");

        //停止向下發送有序廣播
        abortBroadcast();
    }

}
package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收有序廣播
 *
 */
public class EngineerReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        String content = intent.getStringExtra("data");
        android.util.Log.e("danny", "工程師接收到總部發送內容:" + content);

        //通過getResultData可以獲取此有序廣播中的DATA數據
        String data = getResultData();
        android.util.Log.e("danny", "工程師收到經理髮送的通知內容 " + data);
    }
}

AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.danny_jiang.day21_sendbroadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- 創建權限 -->
    <permission android:name="permission.danny_jiang"
        android:protectionLevel="normal"></permission>
    <!-- 申請權限 -->
    <uses-permission android:name="permission.danny_jiang"/>

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 註冊接收普通廣播的接收器 -->
        <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="MyBroad_Jiang"/>
            </intent-filter>
        </receiver>

        <!-- 註冊有序廣播接收器 -->
        <receiver android:name=".EngineerReceiver">
            <intent-filter android:priority="1">
                <action android:name="MyOrderedBroadcast_Jiang"/>
            </intent-filter>
        </receiver>

        <!-- 註冊有序廣播接收器 -->
        <receiver android:name=".ExecutiveReceiver">
            <!-- 在intent-filter中通過priority可以設置有序廣播接收器的優先級 -->
            <intent-filter android:priority="3">
                <action android:name="MyOrderedBroadcast_Jiang"/>
            </intent-filter>
        </receiver>

        <!-- 註冊有序廣播接收器 -->
        <receiver android:name=".ManagerReceiver">
            <intent-filter android:priority="2">
                <action android:name="MyOrderedBroadcast_Jiang"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

四、Android系統廣播大全

  1. String ADD_SHORTCUT_ACTION 動作:在系統中添加一個快捷方式。
  2. String ALL_APPS_ACTION 動作:列舉所有可用的應用。輸入:無。
  3. String ALTERNATIVE_CATEGORY 類別:說明 activity 是用戶正在瀏覽的數據的一個可選操作。
  4. String ANSWER_ACTION 動作:處理撥入的電話。
  5. String XMPP_DISCONNECTED_ACTION 廣播:XMPP 連接已經被斷開。
  6. String BATTERY_CHANGED_ACTION 廣播:充電狀態,或者電池的電量發生變化。
  7. String BOOT_COMPLETED_ACTION 廣播:在系統啓動後,這個動作被廣播一次(只有一次)。
  8. String BROWSABLE_CATEGORY 類別:能夠被瀏覽器安全使用的 activities 必須支持這個類別。
  9. String BUG_REPORT_ACTION 動作:顯示 activity 報告錯誤。
  10. String CALL_ACTION 動作:撥打電話,被呼叫的聯繫人在數據中指定。
  11. String CALL_FORWARDING_STATE_CHANGED_ACTION 廣播:語音電話的呼叫轉移狀態已經改變。
  12. String CLEAR_CREDENTIALS_ACTION 動作:清除登陸憑證 (credential)。
  13. String CONFIGURATION_CHANGED_ACTION 廣播:設備配置信息已經改變,參見Resources.Configuration.
  14. Creator CREATOR 無 無
  15. String DATA_ACTIVITY_STATE_CHANGED_ACTION 廣播:電話的數據活動(data activity)狀態(即收發數據的狀態)已經改變。
  16. String DATA_CONNECTION_STATE_CHANGED_ACTION 廣播:電話的數據連接狀態已經改變。
  17. String DATE_CHANGED_ACTION 廣播:日期被改變。
  18. String DEFAULT_ACTION 動作:和 VIEW_ACTION 相同,是在數據上執行的標準動作。
  19. String DEFAULT_CATEGORY 類別:如果 activity 是對數據執行確省動作(點擊, center press)的一個選項,需要設置這個類別。
  20. String DELETE_ACTION 動作:從容器中刪除給定的數據。
  21. String DEVELOPMENT_PREFERENCE_CATEGORY 類別:說明 activity 是一個設置面板 (development preference panel).
  22. String DIAL_ACTION 動作:撥打數據中指定的電話號碼。
  23. String EDIT_ACTION 動作:爲制定的數據顯示可編輯界面。
  24. String EMBED_CATEGORY 類別:能夠在上級(父)activity 中運行。
  25. String EMERGENCY_DIAL_ACTION 動作:撥打緊急電話號碼。
  26. int FORWARD_RESULT_LAUNCH 啓動標記:如果這個標記被設置,而且被一個已經存在的 activity 用來啓動新的 activity,已有 activity 的回覆目標 (reply target) 會被轉移給新的 activity。
  27. String FOTA_CANCEL_ACTION 廣播:取消所有被掛起的 (pending) 更新下載。
  28. String FOTA_INSTALL_ACTION 廣播:更新已經被確認,馬上就要開始安裝。
  29. String FOTA_READY_ACTION 廣播:更新已經被下載,可以開始安裝。
  30. String FOTA_RESTART_ACTION 廣播:恢復已經停止的更新下載。
  31. String FOTA_UPDATE_ACTION 廣播:通過 OTA 下載並安裝操作系統更新。
  32. String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 類別:To be used as code under test for framework instrumentation tests.
  33. String GADGET_CATEGORY 類別:這個 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。
  34. String GET_CONTENT_ACTION 動作:讓用戶選擇數據並返回。
  35. String HOME_CATEGORY 類別:主屏幕 (activity),設備啓動後顯示的第一個 activity。
  36. String INSERT_ACTION 動作:在容器中插入一個空項 (item)。
  37. String INTENT_EXTRA 附加數據:和 PICK_ACTIVITY_ACTION 一起使用時,說明用戶選擇的用來顯示的 activity;和 ADD_SHORTCUT_ACTION 一起使用的時候,描述要添加的快捷方式。
  38. String LABEL_EXTRA 附加數據:大寫字母開頭的字符標籤,和 ADD_SHORTCUT_ACTION 一起使用。
  39. String LAUNCHER_CATEGORY 類別:Activity 應該被顯示在頂級的 launcher 中。
  40. String LOGIN_ACTION 動作:獲取登錄憑證。
  41. String MAIN_ACTION 動作:作爲主入口點啓動,不需要數據。
  42. String MEDIABUTTON_ACTION 廣播:用戶按下了“Media Button”。
  43. String MEDIA_BAD_REMOVAL_ACTION 廣播:擴展介質(擴展卡)已經從 SD 卡插槽拔出,但是掛載點 (mount point) 還沒解除 (unmount)。
  44. String MEDIA_EJECT_ACTION 廣播:用戶想要移除擴展介質(拔掉擴展卡)。
  45. String MEDIA_MOUNTED_ACTION 廣播:擴展介質被插入,而且已經被掛載。
  46. String MEDIA_REMOVED_ACTION 廣播:擴展介質被移除。
  47. String MEDIA_SCANNER_FINISHED_ACTION 廣播:已經掃描完介質的一個目錄。
  48. String MEDIA_SCANNER_STARTED_ACTION 廣播:開始掃描介質的一個目錄。
  49. String MEDIA_SHARED_ACTION 廣播:擴展介質的掛載被解除 (unmount),因爲它已經作爲 USB 大容量存儲被共享。
  50. String MEDIA_UNMOUNTED_ACTION 廣播:擴展介質存在,但是還沒有被掛載 (mount)。
  51. String MESSAGE_WAITING_STATE_CHANGED_ACTION 廣播:電話的消息等待(語音郵件)狀態已經改變。
  52. int MULTIPLE_TASK_LAUNCH 啓動標記:和 NEW_TASK_LAUNCH 聯合使用,禁止將已有的任務改變爲前景任務 (foreground)。
  53. String NETWORK_TICKLE_RECEIVED_ACTION 廣播:設備收到了新的網絡 “tickle” 通知。
  54. int NEW_TASK_LAUNCH 啓動標記:設置以後,activity 將成爲歷史堆棧中的第一個新任務(棧頂)。
  55. int NO_HISTORY_LAUNCH 啓動標記:設置以後,新的 activity 不會被保存在歷史堆棧中。
  56. String PACKAGE_ADDED_ACTION 廣播:設備上新安裝了一個應用程序包。
  57. String PACKAGE_REMOVED_ACTION 廣播:設備上刪除了一個應用程序包。
  58. String PHONE_STATE_CHANGED_ACTION 廣播:電話狀態已經改變。
  59. String PICK_ACTION 動作:從數據中選擇一個項目 (item),將被選中的項目返回。
  60. String PICK_ACTIVITY_ACTION 動作:選擇一個 activity,返回被選擇的 activity 的類(名)。
  61. String PREFERENCE_CATEGORY 類別:activity是一個設置面板 (preference panel)。
  62. String PROVIDER_CHANGED_ACTION 廣播:更新將要(真正)被安裝。
  63. String PROVISIONING_CHECK_ACTION 廣播:要求 polling of provisioning service 下載最新的設置。
  64. String RUN_ACTION 動作:運行數據(指定的應用),無論它(應用)是什麼。
  65. String SAMPLE_CODE_CATEGORY 類別:To be used as an sample code example (not part of the normal user experience).
  66. String SCREEN_OFF_ACTION 廣播:屏幕被關閉。
  67. String SCREEN_ON_ACTION 廣播:屏幕已經被打開。
  68. String SELECTED_ALTERNATIVE_CATEGORY 類別:對於被用戶選中的數據,activity 是它的一個可選操作。
  69. String SENDTO_ACTION 動作:向 data 指定的接收者發送一個消息。
  70. String SERVICE_STATE_CHANGED_ACTION 廣播:電話服務的狀態已經改變。
  71. String SETTINGS_ACTION 動作:顯示系統設置。輸入:無。
  72. String SIGNAL_STRENGTH_CHANGED_ACTION 廣播:電話的信號強度已經改變。
  73. int SINGLE_TOP_LAUNCH 啓動標記:設置以後,如果 activity 已經啓動,而且位於歷史堆棧的頂端,將不再啓動(不重新啓動) activity。
  74. String STATISTICS_REPORT_ACTION 廣播:要求 receivers 報告自己的統計信息。
  75. String STATISTICS_STATE_CHANGED_ACTION 廣播:統計信息服務的狀態已經改變。
  76. String SYNC_ACTION 動作:執行數據同步。
  77. String TAB_CATEGORY 類別:這個 activity 應該在 TabActivity 中作爲一個 tab 使用。
  78. String TEMPLATE_EXTRA 附加數據:新記錄的初始化模板。
  79. String TEST_CATEGORY 類別:作爲測試目的使用,不是正常的用戶體驗的一部分。
  80. String TIMEZONE_CHANGED_ACTION 廣播:時區已經改變。
  81. String TIME_CHANGED_ACTION 廣播:時間已經改變(重新設置)。
  82. String TIME_TICK_ACTION 廣播:當前時間已經變化(正常的時間流逝)。
  83. String UMS_CONNECTED_ACTION 廣播:設備進入 USB 大容量存儲模式。
  84. String UMS_DISCONNECTED_ACTION 廣播:設備從 USB 大容量存儲模式退出。
  85. String UNIT_TEST_CATEGORY 類別:應該被用作單元測試(通過 test harness 運行)。
  86. String VIEW_ACTION 動作:向用戶顯示數據。
  87. String WALLPAPER_CATEGORY 類別:這個 activity 能過爲設備設置牆紙。
  88. String WALLPAPER_CHANGED_ACTION 廣播:系統的牆紙已經改變。
  89. String WALLPAPER_SETTINGS_ACTION 動作:顯示選擇牆紙的設置界面。輸入:無。
  90. String WEB_SEARCH_ACTION 動作:執行 web 搜索。
  91. String XMPP_CONNECTED_ACTION 廣播:XMPP 連接已經被建立。

更多有關Broadcast回調更新UI控件,參考博客http://blog.csdn.net/niubitianping/article/details/51925048
轉載此博客請註明出處http://blog.csdn.net/sq19920518/article/details/52625100

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章