1. 程式人生 > >Android初試--Android中的BroadcastReceiver(1)

Android初試--Android中的BroadcastReceiver(1)

    BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。

    在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實現開機啟動服務的功能;當網路狀態改變時系統會產生一條廣播,接收到這條廣播就能及時地做出提示和儲存資料等操作;當電池電量改變時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者及時儲存進度,等等。

    Android中的廣播機制設計的非常出色,很多事情原本需要開發者親自操作的,現在只需等待廣播告知自己就可以了,大大減少了開發的工作量和開發週期。而作為應用開發者,就需要數練掌握

Android系統提供的一個開發利器,那就是BroadcastReceiver。下面我們就對BroadcastReceiver逐一地分析和演練,瞭解和掌握它的各種功能和用法。

    首先,我們來演示一下建立一個BroadcastReceiver,並讓這個BroadcastReceiver能夠根據我們的需要來執行。要建立自己的BroadcastReceiver物件,我們需要繼承android.content.BroadcastReceiver,並實現其onReceive方法。下面我們就建立一個名為MyReceiver廣播接收者:

package com.scott.receiver;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

private static final String TAG = "MyReceiver";

@Override

public void onReceive(Context context, Intent intent) {

String msg = intent.getStringExtra("msg");

Log.i(TAG, msg);

}

}

    在onReceive方法內,我們可以獲取隨廣播而來的Intent中的資料,這非常重要,就像無線電一樣,包含很多有用的資訊。

    在建立完我們的BroadcastReceiver之後,還不能夠使它進入工作狀態,我們需要為它註冊一個指定的廣播地址。沒有註冊廣播地址的BroadcastReceiver就像一個缺少選臺按鈕的收音機,雖然功能俱備,但也無法收到電臺的訊號。下面我們就來介紹一下如何為BroadcastReceiver註冊廣播地址。

    靜態註冊

    靜態註冊是在AndroidManifest.xml檔案中配置的,我們就來為MyReceiver註冊一個廣播地址:

<receiver android:name=".MyReceiver">

         <intent-filter>

         <action android:name="android.intent.action.MY_BROADCAST"/>

         <category android:name="android.intent.category.DEFAULT" />

         </intent-filter>

        </receiver>

    配置了以上資訊之後,只要是android.intent.action.MY_BROADCAST這個地址的廣播,MyReceiver都能夠接收的到。

 注意,這種方式的註冊是常駐型的,也就是說當應用關閉後,如果有廣播資訊傳來,MyReceiver也會被系統呼叫而自動執行。

    動態註冊

    動態註冊需要在程式碼中動態的指定廣播地址並註冊,通常我們是在ActivityService註冊一個廣播,下面我們就來看一下注冊的程式碼:

MyReceiver receiver = new MyReceiver();

IntentFilter filter = new IntentFilter();

filter.addAction("android.intent.action.MY_BROADCAST");

registerReceiver(receiver, filter);

    注意,registerReceiver是android.content.ContextWrapper類中的方法,Activity和Service都繼承了ContextWrapper,所以可以直接呼叫。在實際應用中,我們在Activity或Service中註冊了一個BroadcastReceiver,當這個Activity或Service被銷燬時如果沒有解除註冊,系統會報一個異常,提示我們是否忘記解除註冊了。所以,記得在特定的地方執行解除註冊操作。

@Override

protected void onDestroy() {

    super.onDestroy();

    unregisterReceiver(receiver);

}

    注意,sendBroadcast也是android.content.ContextWrapper類中的方法,它可以將一個指定地址和引數資訊的Intent物件以廣播的形式傳送出去。

   上面的例子只是一個接收者來接收廣播,如果有多個接收者都註冊了相同的廣播地址,又會是什麼情況呢,能同時接收到同一條廣播嗎,相互之間會不會有干擾呢?這就涉及到普通廣播和有序廣播的概念了。