BroadCast的類型
- 普通廣播:廣播會(huì)傳播到每一個(gè)合適的Receiver薛匪,根據(jù)優(yōu)先級(jí)傳播槐秧,不能被中斷室谚,不能傳播處理結(jié)果。
- 有序廣播:廣播按照優(yōu)先級(jí)傳播石挂,首先由最高優(yōu)先級(jí)Receiver處理博助,然后傳遞給下一個(gè)。每個(gè)Receiver可以中斷廣播的傳輸痹愚,通過調(diào)用BroadcastReceiver的
void abortBroadcast ()
方法實(shí)現(xiàn)富岳。還可以設(shè)置處理結(jié)果傳遞給下一個(gè)Receiver蛔糯。
Receiver的優(yōu)先級(jí)可以在<intent-filter>中聲明priority;或者調(diào)用IntentFilter的setPriority方法窖式。優(yōu)先級(jí)范圍為-1000到1000. - 粘性廣播(Android 5.0/API 21中被聲明為Deprecated):粘性消息在發(fā)送后就一直存在于系統(tǒng)的消息容器里面蚁飒,等待對(duì)應(yīng)的處理器去處理,如果暫時(shí)沒有處理器處理這個(gè)消息則一直在消息容器里面處于等待狀態(tài)萝喘。
要發(fā)送該廣播需要BROADCAST_STICKY權(quán)限淮逻。 - 本地廣播:發(fā)送的廣播只能在同一個(gè)應(yīng)用中被接收。使用類LocalBroadcastManager類(通過類中的getInstance獲取實(shí)例)來發(fā)送和注冊(cè)(只能通過該類的方法注冊(cè))阁簸。
BroadCast方法
void sendBroadcast (Intent intent, String receiverPermission)
void sendBroadcast (Intent intent)
void sendOrderedBroadcast (Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
void sendOrderedBroadcast (Intent intent, String receiverPermission)
參數(shù):
initialCode, initialData, initialExtras用來傳遞給Receiver
resultReceiver為最后一個(gè)接收到該Broadcast的Receiver爬早。即使廣播被中斷了,該Receiver也會(huì)接收到該廣播强窖。
該Receiver不需要注冊(cè)凸椿。
void sendStickyBroadcast (Intent intent)
void sendStickyOrderedBroadcast (Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)
void removeStickyBroadcast (Intent intent)
從系統(tǒng)的消息容器中移除該廣播
BoradCastReceiver使用流程
- 繼承BroadcastReceiver類,并重寫
void onReceive (Context context, Intent intent)
方法翅溺。 - 注冊(cè)BroadcastReceiver
- 靜態(tài)注冊(cè):在Manifest文件中脑漫,聲明該類,并聲明intent-filter
在Manifest中注冊(cè)時(shí)咙崎,通過指定exported屬性來控制該Receiver是否可以接受其他應(yīng)用發(fā)送的Broadcast优幸。
如果添加了intent-filter,exported的默認(rèn)值為true褪猛。否則為false网杆。
Activity和Service也是一樣。 - 動(dòng)態(tài)注冊(cè):調(diào)用Context的
Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter)
或Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
方法伊滋,并在合適的時(shí)候調(diào)用void unregisterReceiver (BroadcastReceiver receiver)
方法解注冊(cè)碳却。
** 動(dòng)態(tài)注冊(cè)的比靜態(tài)注冊(cè)的廣播優(yōu)先級(jí)更高。**
注意事項(xiàng)
在注冊(cè)Receiver時(shí)笑旺,可以通過指定權(quán)限來防止接收無權(quán)限應(yīng)用的廣播昼浦。
- 對(duì)于靜態(tài)注冊(cè),通過聲明android:premission在指定筒主。
- 對(duì)于動(dòng)態(tài)注冊(cè)关噪,可調(diào)用四個(gè)參數(shù)的registerReceiver方法來聲明權(quán)限。
而有權(quán)限的應(yīng)用可以通過sendBroadcast的參數(shù)來聲明自己的權(quán)限乌妙。同時(shí)在Manifest文件中使兔,必須聲明自己使用的權(quán)限(用<use-permission>)。
同時(shí)如果在調(diào)用sendBroadcast時(shí)傳遞了權(quán)限藤韵,那么BroadcastReceiver也必須具有同樣的權(quán)限虐沥。
如果BroadcastReceiver在10秒內(nèi)沒有執(zhí)行完畢,那么會(huì)彈出ANR對(duì)話框泽艘。
可以在接收到Broadcast之后置蜀,啟動(dòng)Service來完成任務(wù)奈搜。
在Intent中設(shè)置了FLAG_RECEIVER_REGISTERED_ONLY flag時(shí),只有動(dòng)態(tài)注冊(cè)的Receiver才能夠接收到廣播盯荤。
在動(dòng)態(tài)注冊(cè)中馋吗,最早動(dòng)態(tài)注冊(cè)優(yōu)先級(jí)別最高;
在靜態(tài)注冊(cè)中秋秤,最早安裝的程序宏粤,靜態(tài)注冊(cè)優(yōu)先級(jí)別最高
從Android 3.1開始,系統(tǒng)增加了Intent的flag灼卢。如下:
- FLAG_INCLUDE_STOPPED_PACKAGES:包含已經(jīng)停止的包(停止:即包所在的進(jìn)程已經(jīng)退出)
- FLAG_EXCLUDE_STOPPED_PACKAGES:不包含已經(jīng)停止的包
在發(fā)送廣播時(shí)绍哎,不管是什么廣播類型,系統(tǒng)默認(rèn)直接增加了值為FLAG_EXCLUDE_STOPPED_PACKAGES的flag鞋真,導(dǎo)致即使是靜態(tài)注冊(cè)的廣播接收器崇堰,對(duì)于其所在進(jìn)程已經(jīng)退出的app,同樣無法接收到廣播涩咖。