1. 程式人生 > >Android中Intent詳解(二)之使用Intent廣播事件及Broadcast Receiver簡介

Android中Intent詳解(二)之使用Intent廣播事件及Broadcast Receiver簡介

通過第一篇的講解,我們已經看到了如何使用Intent來啟動新的應用程式元件,但是實際上他們也可以使用sendBroadcast方法來在元件間匿名的廣播訊息。

作為一個系統級別的訊息傳遞機制,Intent可以在程序之間傳送結構化的訊息。因此,通過實現Broadcast Receiver來監聽和響應應用程式內的這些Broadcast Intent。

通過使用Intent來廣播一個事件,可以在不修改原始的應用程式的情況下,讓我們開發人員對事件做出反應。Android大量使用了Broadcast Receiver來廣播系統事件,如網路連線和簡訊通知等。

1.使用Intent來廣播事件

在應用程式元件中,可以構建希望廣播的Intent,然後使用sendBroadcast方法來發送它。

可以對Intent的動作、資料和分類進行設定,從而使Broadcast Receiver能夠精確的確定他們的需求。在這種方案中,Intent動作字串可以用來標識要廣播的事件,所以他應該是能夠標識事件的唯一的字串。習慣上,動作字串使用與Java包名相同的構建方式,如下:

<span style="font-size:14px;">public static final String MY_INTENT_ACTION = "com.happy.demo.test";</span>

如果希望在Intent中包含資料,那麼可以使用Intent的data屬性指定一個URI,也可可以包含extras來新增額外的基本值。

2.使用Broadcast Receiver來監聽廣播

Broadcast Receiver可以用來監聽Broadcast Intent,但是需要對其進行註冊,既可以使用程式碼方式來註冊,也可以在應用程式的manifest.xml檔案中進行註冊,不管採用哪種方式,都需要使用一個Intent Filter來指定他要監聽哪些Intent和資料。

對於包含在manifest.xml檔案中的廣播接收者 ,在Intent被廣播出去的時候,應用程式不一定非要處於執行狀態才能接收,他們會被自動的啟動。

建立一個新的Broadcast Receiver,需要擴充套件Broadcast Receiver類並重寫onReceive方法來進行自己的處理。比如:

<span style="font-size:14px;">package com.happy.demo;

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

public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub

	}

}
</span>
當接收到一個與在註冊接收器時使用的IntentFilter相匹配的Broadcast Intent的時候,就會執行onReceive方法。onReceive處理程式必須要在5秒鐘以內完成,否則會顯示Force Close對話方塊。

一般情況下,Broadcast Receiver將會更新內容、啟動Service、更新Activity UI或者使用Notification Manager來通知使用者。

3.在程式碼中註冊Broadcast Receiver

影響特定Activity的UI的Boradcast Receiver通常在程式碼中註冊,在程式碼中註冊的接收器只會在包含它的應用程式元件執行時相應Broadcast Intent。

在接收器用來更新一個Activity中的UI元素時,一般在onResume中註冊接收器,在onPause中登出接收器。程式碼:

<span style="font-size:14px;">@Override
	protected void onResume() {
		super.onResume();
		registerReceiver(receiver, filter);
	}

	@Override
	protected void onPause() {
		super.onPause();
		unregisterReceiver(receiver);
	}</span>
4.在應用程式的manifets.xml檔案中進行註冊

要在應用程式的mainfets中包含一個Broadreceiver,可以在application節點中新增一個receiver標籤,以及指定要註冊的Broadcast Receiver的類名。接收器節點中需要包含一個intent-filter標籤來指定要監聽的動作字串。如下:

<span style="font-size:14px;"><receiver android:name="com.happy.demo.MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="com.happy.demo.one" />
            </intent-filter>
        </receiver></span>
5.廣播有序的Intent

當Broadcast Receiver接收Intent的順序十分重要時,特別是當需要將來接收器能夠影響將來的接收器收到的Broadcast Intent時,可以使用sendOrderedBroadcast方法,如下:

<span style="font-size:14px;">String requiredPermission = "com.happy.demo.one";
		sendOrderedBroadcast(intent, requiredPermission);</span>

使用這個方法時,Intent將會按照優先順序被傳遞給所有具有合適許可權的已註冊的接收器。可以在manifest.xml中使用android:priority屬性指定其許可權,值越大,代表優先順序越高。
<span style="font-size:14px;"> <receiver
            android:name="com.happy.demo.MyBroadcastReceiver"
            android:permission="android.permission.ACCESS_CHECKIN_PROPERTIES" >
            <intent-filter android:priority="1000" >
                <action android:name="com.happy.demo.one" />
            </intent-filter>
        </receiver></span>
傳送有序廣播的一種常見例子是廣播想要收到其結果資料的Intent。使用sendOrderedBroadcast方法時,可以指定一個將放到接收器佇列末尾的接收器,而從保證當Broadacst Receiver已被已註冊的有序Broadcast Receiver處理和修改後,它也能接收到該Broadcast Intent。

在這種情況下,對於那些在返回給最後一個接收器之前可能被任何收到廣播的接收器修改的Intent結果、資料和extra,為他們指定預設值通常很有幫助。如下:

<span style="font-size:14px;">sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);</span>
6.廣播Stick Intent

Stity Intent是Broadcast Intent的有用變體,可以儲存他們最後一次廣播的值,並且當有一個新的接收器被註冊為接收該廣播時,他們會把這些值作為Intent返回。

當呼叫registerReceiver來指定一個匹配的Sticy Broadcast Intent的Intent Filter時,返回值將是最後一個Intent廣播,例如電池電量變化的廣播

7.Local Boradcast Manager

區域性廣播管理器包含在Android Support Library中,使用者簡化註冊Broadcast Inten以及在應程式內的元件之間傳送Broadcast Intent的工作。因為區域性廣播的作用域要小,所以使用它比傳送全域性廣播更加高效,而且也確保了應用程式外部的任何元件都收不到我們的廣播Intent,所以也是安全的。與之相同,其他應用程式也不能向我們的接收器傳送廣播,避免了這些接收器成為安全漏洞。

獲取Local Broadcast Manager的方法如下:

<span style="font-size:14px;">LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getApplicationContext());</span>
註冊一個區域性廣播接收者和註冊全域性的一樣,程式碼如下:
<span style="font-size:14px;">lbm.registerReceiver(receiver, intentFilter);</span>
要傳送一個區域性Broadcast Intent,可以使用Local Boradcast Manager的sendBroadcast方法,並傳入要廣播的Intent。如下:
<span style="font-size:14px;">lbm.sendBroadcast(intent);</span>

8.Pending Intent簡介

PendingIntent類提供了一種建立可由其他應用程式在稍晚的時間觸發的Intent的機制。

PendingIntent通常用於包裝在響應將來的事件時觸發的Intent,例如單機Widget或者Notification。

PendingIntent類提供了構建PendingIntent的靜態方法,以便啟動Activity Service或者廣播Intent。

<span style="font-size:14px;">PendingIntent.getActivity(context, requestCode, intent, flags);
		PendingIntent.getService(context, requestCode, intent, flags);
		PendingIntent.getBroadcast(context, requestCode, intent, flags);</span>
PendingIntent類包含了一些靜態常量,他們可以用於指定標誌,以更新或取消與指定動作匹配的現有PendingIntent,也可以用於指定該Intent是否只觸發一次。