BroadcastReceiver本質(zhì)是一種全局監(jiān)聽器,它可以監(jiān)聽全局的廣播消息。
與Activity和Service不同的是,BroadcastReceiver在接收到匹配的Intent前并不會(huì)被激活。激活一個(gè)BroadcastReceiver需要以下步驟:
- 創(chuàng)建一個(gè)匹配的Intent
- 調(diào)用Context的sendBroadcast() 或 sendOrderedBroadcast()
當(dāng)Context發(fā)出通知后,所有匹配該Intent的BroadcastReceiver都可能被啟動(dòng)。
要實(shí)現(xiàn)一個(gè)BroadcastReceiver,只需重寫它的onReceive方法,同時(shí)注冊(cè)到程序中。
有兩種方式注冊(cè)BroadcastReceiver:
- 在AndroidManifest.xml中注冊(cè):
<receiver android:name="...">
<intent-filter>
<action android:name="...." />
</intent-filter>
</receiver>
- 在程序中注冊(cè)
IntentFilter filter = new IntentFilter("...");
Receiver receiver = new Receiver();
registerReceiver(receiver, filter);
當(dāng)對(duì)應(yīng)的廣播發(fā)出后,系統(tǒng)就會(huì)創(chuàng)建對(duì)應(yīng)的BroadcastReceiver實(shí)例,并調(diào)用它的onReceive方法,該方法執(zhí)行完后,實(shí)例就會(huì)被銷毀。如果onReceive不能在10秒內(nèi)執(zhí)行完成,會(huì)觸發(fā)ANR。若要執(zhí)行耗時(shí)操作,可以啟動(dòng)一個(gè)Service,不應(yīng)啟動(dòng)新線程,很可能線程沒執(zhí)行完,BroadcastReceiver就已經(jīng)退出了。
廣播
廣播有兩種:
Normal Broadcast 普通廣播:可以被所有對(duì)應(yīng)的接收者接收到,缺點(diǎn)是不能鏈?zhǔn)絺鬟f且無法終止傳播。
Ordered Broadcast 有序廣播:按預(yù)設(shè)的優(yōu)先級(jí)(-1000 ~ 1000)依次被接收。上一接收者可以調(diào)用setResultExtras(Bundle)將數(shù)據(jù)存入Broadcast,下一接受者可以調(diào)用getResultExtras()將數(shù)據(jù)取出。有序廣播可以被接收者終止,優(yōu)先級(jí)低的接收者將不會(huì)接收到該廣播。
同樣優(yōu)先級(jí)有兩種設(shè)置方式:
- AndroidManifest.xml:
<receiver android:name="...">
<intent-filter android:priority="0">
- 代碼中:
intentFilter.setPriority(1000);