BroadcastReceiver初識:
廣播接收者(BroadcastReceiver)用於接收廣播Intent,廣播Intent的傳送是通過呼叫Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,這個特性跟JMS中的Topic訊息接收者類似。要實現一個廣播接收者方法如下:
第一步:繼承BroadcastReceiver,並重寫onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
}
第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:
第一種:使用程式碼進行訂閱
IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二種:在AndroidManifest.xml檔案中的<application>節點裏進行訂閱:
<receiver android:name=”.IncomingSMSReceiver”>
</receiver>
廣播型別:
廣播被分為兩種不同的型別:「普通廣播(Normal broadcasts)」和「有序廣播(Ordered broadcasts)」。普通廣播是完全非同步的,可以在同一時刻(邏輯上)被所有接收者接收到,訊息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播;然而有序廣播是按照接收者宣告的優先順序別,被接收者依次接收廣播。如:A的級別高於B,B的級別高於C,那麼,廣播先傳給A,再傳給B,最後傳給C 。優先順序別宣告在intent-filter元素的android:priority屬性中,數越大優先順序別越高,取值範圍:-1000到1000,優先順序別也可以呼叫IntentFilter物件的setPriority()進行設定 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,後面的接收者就無法接收到廣播。另外,有序廣播的接收者可以將資料傳遞給下一個接收者,如:A得到廣播後,可以往它的結果物件中存入資料,當廣播傳給B時,B可以從A的結果物件中得到A存入的資料。
Context.sendBroadcast()
Context.sendOrderedBroadcast()
系統收到簡訊,發出的廣播屬於有序廣播。如果想阻止使用者收到簡訊,可以通過設定優先順序,讓你們自定義的接收者先獲取到廣播,然後終止廣播,這樣使用者就接收不到簡訊了。
廣播接收者的響應:
在Android中,每次廣播訊息到來時都會建立BroadcastReceiver例項並執行onReceive() 方法, onReceive() 方法執行完後,BroadcastReceiver 的例項就會被銷燬。當onReceive() 方法在10秒內沒有執行完畢,Android會認為該程式無響應。所以在BroadcastReceiver裡不能做一些比較耗時的操作,否側會彈出ANR(Application No Response)的對話方塊。如果需要完成一項比較耗時的工作,應該通過傳送Intent給Service,由Service來完成。這裏不能使用子執行緒來解決,因為BroadcastReceiver的生命週期很短,子執行緒可能還沒有結束BroadcastReceiver就先結束了。BroadcastReceiver一旦結束,此時BroadcastReceiver的所在程序很容易在系統需要記憶體時被優先殺死,因為它屬於空程序(沒有任何活動元件的程序)。如果它的宿主程序被殺死,那麼正在工作的子執行緒也會被殺死。所以採用子執行緒來解決是不可靠的。
public class IncomingSMSReceiver extends BroadcastReceiver {
}
常用廣播Intent:
除了簡訊到來廣播Intent,Android還有很多廣播Intent,如:開機啟動、電池電量變化、時間已經改變等廣播Intent。
<receiver android:name=”.IncomingSMSReceiver”>
</receiver>
<receiver android:name=”.IncomingSMSReceiver”>
</receiver>
並且要進行許可權宣告:
<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>
本文來自新浪部落格