java.lang.Object java
android.content.BroadcastReceiver android
直接已知子類: 異步
public abstract class BroadcastReceiver spa
extends Object orm
BroadCast基類能夠接收sendBroadcast()方法發送的intent信息。BroadcastReceiver類能夠在Java代碼中經過Context.registerReceiver()方法動態註冊,也能夠在Manifest文件中聲明。 對象
注意: 生命週期
若是在Activity.onResume()方法中註冊receiver類,那麼須要在Activity.onPause()方法中釋放它(在進入paused狀態以後,就不須要再接收廣播了,這樣就能夠減小系統開銷),不要在Activity.onSaveInstanceState()方法中註銷receiver類,由於當Activity轉向後臺,這個方法就再也不被使用。 進程
Receiver類能夠接收的廣播主要分兩種: 資源
1)普通廣播:用方法Context.sendBroadcast發送,接收到這中廣播的receiver類對象,不分前後順序,幾乎同時對廣播作出反應。這種方式更高效,但同時意味着receiver類不能使用其餘receiver類處理的結果,也沒法終止廣播的傳送。
2)有序廣播:用方法Context.sendOrderedBroadcast發送,這種廣播每次只發送給一個receiver類,當輪到一個receiver類執行的時候,它能夠向下一個接收的receiver類傳送處理結果數據,也能夠終止廣播的傳送,廣播再也不被其餘的receiver類接收。Receiver類的執行順序用能夠用intent-filter中配置android:priority屬性來控制,屬性值越高,優先級越高,接收廣播順序越靠前。同一優先級的receiver類的接收順序是任意的。
即便普通的廣播,在某些狀況下系統也是一次只傳送給一個receiver類。例如,有一些receiver類須要建立新的進程,這是每次只能執行一個receiver類,從而避免系統過載,可是,這些狀況下,receiver類之間依然不能傳遞結果數據,也不能終止廣播的傳送。
注意,雖然Intent類用來發送和接收廣播,當時Intent廣播機制下的Intent類與Context.startActivity()啓動Activity類時的Intent類是徹底區別開的,BroadcastReceiver是不能看到Context.startActivity()發送的Intent類對象的;一樣的,當使用Intent類發送廣播時,也不會有Activity被啓動。
BroadcastReceiver類 (在做爲一種組件在Manifest中加載時)是應用程序進程週期的重要部分。Topics covered here:
Receiver 生命週期
一個BroadcastReceiver 對象只在調用onReceive(android.content.Context, android.content.Intent)方法時有效。一旦這個方法返回,系統就會終止這個對象。 這一點對於如何實現onReceive(android.content.Context, android.content.Intent)方法很是重要:任何異步操做都是不容許的,由於異步操做須要在onReceive(android.content.Context, android.content.Intent)返回後本身去作一些處理,但此時,BroadcastReceiver對象已經不存在了,因此這時系統隨時能夠在異步操做本身完成以前釋放它。
另外,也不能夠在BroadcastReceiver 對象中打開對話窗口,或者啓動Service。對於前者,能夠調用NotificationManager API,對於後者,可使用Context.startService()向service發送命令。
受權
受權能夠在Intent對象發送方也能夠在接收方指定。
在發送方指定受權,必須爲Context.sendBroadcast(Intent, String)方法或者Context.sendBroadcast(Intent, String) or Context.sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)方法提供一個非空的String類型的受權說明。只有擁有一樣受權說明(在Manifest文件中用<uses-permission>標籤指定)的receiver類才能夠接收這個廣播。
在接收方指定受權,必須爲Context.registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)方法提供一個非空的String類型的受權說明或者在Manifest文件中經過<uses-permission> 元素聲明。只有擁有一樣受權的broadcasters發送者才能夠向這個receiver類發送廣播。
進程生命週期
正在執行BroadcastReceiver 的進程(即正在執行onReceive(android.content.Context, android.content.Intent)方法的進程)是系統正在前臺執行的進程,除非空間極度緊張的狀況,系統會保持運行這個進程。
一旦從onReceive()方法返回,BroadcastReceiver 就再也不可用,它的宿主進程也就和運行在它裏面的應用組件處在同等優先地位。特別的,當宿主進程只有一個子進程時,在onReceive()方法返回後,宿主進程就成爲空進程,系統極有可能會把宿主進程釋放,爲其餘的進程提供資源空間。
這就是說,對於耗時比較長的操做,最好放在宿主進程中並使用Service與BroadcastReceiver 關聯,來維持宿主進程在執行期間保持運行。即當接收到廣播時,BroadcastReceiver發送一個Service命令,來執行所需的操做。