文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處:http://blog.csdn.net/flowingflying/android
和activity、content provider以及service同樣,BraodcastReceiver是Android的組件。廣播接收器接收廣播消息,並進行相應地處理。廣播消息就是Android的broadcast intent。一個broadcast intent能夠觸發多個接收器。app
小例子很簡單,經過菜單觸發發送Broadcast,而後經過Logcat觀察接收器狀況。ide
private void sendBroadcast(){
//爲了保證action的惟一性,一般採用包名的namespace。
String actionString = "cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc";
Intent bcIntent = new Intent(actionString);
bcIntent.putExtra("message", "No " + (count ++));
Log.v("Main","Before send");
//組件(acivity或者service)使用sendBrocast()進行發送廣播消息,參數則是intent。
sendBroadcast(bcIntent);
Log.v("Main","After send");
} 函數
Broadcast接收器學習
接收器實現很簡單,繼承BroadcastReceiver,同時要在manifest文件中經過<receiver>的tag來註冊要監聽的廣播intent,咱們也能夠在運行時在代碼中進行註冊。this
public class TestReceiver extends BroadcastReceiver{
private String tag = "TestReceiver";
@Override //收到廣播的回調函數
public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag); //顯示Thread的信息
Log.v(tag,"context = " + context);
Log.v(tag,"this = " + this);
Log.v(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.v(tag,"message : " + message);
}
}spa
須要經過AndroidManifest.xml告訴系統須要接受broadcast消息。<receiver>和其餘組件同樣是<application>的node。.net
<receiver android:name=".TestReceiver">
<intent-filter >
<action android:name="cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc" />
</intent-filter>
</receiver>線程
咱們看看運行的接口,接收器運行在主線程中。
廣播是能夠被多個接收器接收的,咱們copyTestReceiver的代碼建立另外一個接收器TestReceiver2,以下,並在AndroidManifest.xml中進行註冊:
public class TestReceiver2 extends BroadcastReceiver{
private String tag = "TestReceiver2";
@Override
public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag); //顯示Thread的信息
Log.v(tag,"context = " + context);
Log.v(tag,"this = " + this);
Log.v(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.v(tag,"message : " + message);
}
}
運行結果以下。當發出廣播時,全部註冊的接收器都會收到。因爲這兩個接收器的onReceive()都運行在主線程,即同一個線程中,他們是順序處理,而不是另行處理。能夠猜想廣播是放在消息隊列中,處理時依次觸發各接收器。咱們能夠將TestReceiver的處理時間增長,例如sleep()上幾秒,依次處理會更明顯。處理的順序和Manifest中的登記順序一致。
同一應用和不一樣應用均可以經過Manifest註冊對同一廣播的監聽,在代碼上區別,分別觸發運行在各自的主線程的回調函數。
小例子代碼在:Pro Android學習:Broadcast小例子
相關連接: 個人Android開發相關文章