Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中Intent詳解(二)之使用Intent廣播事件及Broadcast Receiver簡介

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

編輯:關於Android編程

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

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

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

1.使用Intent來廣播事件

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

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

public static final String MY_INTENT_ACTION = "com.happy.demo.test";

如果希望在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方法來進行自己的處理。比如:

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

	}

}
當接收到一個與在注冊接收器時使用的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中注銷接收器。代碼:

@Override
	protected void onResume() {
		super.onResume();
		registerReceiver(receiver, filter);
	}

	@Override
	protected void onPause() {
		super.onPause();
		unregisterReceiver(receiver);
	}
4.在應用程序的manifets.xml文件中進行注冊

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


            
                
            
        
5.廣播有序的Intent

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

String requiredPermission = "com.happy.demo.one";
		sendOrderedBroadcast(intent, requiredPermission);

使用這個方法時,Intent將會按照優先順序被傳遞給所有具有合適權限的已注冊的接收器。可以在manifest.xml中使用android:priority屬性指定其權限,值越大,代表優先級越高。

 
            
                
            
        
發送有序廣播的一種常見例子是廣播想要收到其結果數據的Intent。使用sendOrderedBroadcast方法時,可以指定一個將放到接收器隊列末尾的接收器,而從保證當Broadacst Receiver已被已注冊的有序Broadcast Receiver處理和修改後,它也能接收到該Broadcast Intent。

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

sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
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的方法如下:

LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getApplicationContext());
注冊一個局部廣播接收者和注冊全局的一樣,代碼如下:

lbm.registerReceiver(receiver, intentFilter);
要發送一個局部Broadcast Intent,可以使用Local Boradcast Manager的sendBroadcast方法,並傳入要廣播的Intent。如下:

lbm.sendBroadcast(intent);

8.Pending Intent簡介

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

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

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

PendingIntent.getActivity(context, requestCode, intent, flags);
		PendingIntent.getService(context, requestCode, intent, flags);
		PendingIntent.getBroadcast(context, requestCode, intent, flags);
PendingIntent類包含了一些靜態常量,他們可以用於指定標志,以更新或取消與指定動作匹配的現有PendingIntent,也可以用於指定該Intent是否只觸發一次。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved