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