浅谈BroadcastReceiver
在安卓開發(fā)中,broadcast是一種APP直接傳輸信息的機制。它是對廣播進行過濾并接受響應的一類組件。它可以運用于接收廣播intent,廣播intent發(fā)送通過調用sendbroadcast/sendorderedBroadcast來實現(xiàn)。通常一個廣播intent可以被訂閱此intent的多個廣播接收者所接收。
?比如我靜態(tài)注冊一個SDcardunmountedreceiver的廣播代碼如下:
在清單文件中聲明<receiver>,需要在其中配置<intent--filter>指定接收廣播的動作action
或者動態(tài)注冊,在JAVA代碼中注冊:
兩種注冊的區(qū)別:代碼注冊也就是動態(tài)注冊,它不是一個常駐的廣播,也就是說他的廣播是跟隨著程序的生命周期,一旦代碼所在進程被殺死,廣播接收者就失效。而在清單文件中注冊的靜態(tài)廣播是常駐型,在當應用程序關閉后,如果有信息廣播來,程序也會被系統(tǒng)調用自動運行。在平時我們手機中,需要啟動一次才能接受到廣播,它才會生效。
安卓中常見的廣播
監(jiān)聽撥打電話廣播
監(jiān)聽系統(tǒng)開機的廣播,監(jiān)聽安裝和卸載程序的廣播,攔截短信等。
發(fā)送自定義廣播
無序廣播不可以被攔截,所有接收無序廣播的廣播接收者在此廣播被發(fā)送時均能接收此廣播,并且是同時接收。無序廣播使用sendbroadcast方法來發(fā)送,核心代碼如下:
這個intent的action可以是自定義的動作。那么接收者也要定義發(fā)送廣播的意圖動作。
注意:符合某廣播條件的所有廣播接收者的特點:無序、無優(yōu)先級、不可中斷、不可傳遞數(shù)據(jù)。
? ?廣播時可設置接收者權限,僅當接收者含有權限才能接收。
? ?接收者的<receiver>也可以設置發(fā)送方權限,只接收含有權限應用的廣播Receiver節(jié)點屬性
? ?發(fā)送廣播是,通過intent.setFlag(intent.flag_include_stopped_packeages),包含從未啟動過的程序,這樣的設置,可以讓從未啟動的接收者也收到廣播。
有序廣播
有序廣播可以被攔截或者添加數(shù)據(jù),優(yōu)先級高的接收者可以攔截低優(yōu)先級,使用abortBroadcast,添加數(shù)據(jù):通過bundle傳遞。前面的接收者可以將數(shù)據(jù)通過setResultExtras(Bundle)方法存進結果對象,然后傳遞給下一個接收者,下一個接收者通過代碼:Bundle bundle = getResultExtras(true)可以獲取上一個接收者存入在結果對象中的數(shù)據(jù)。
谷歌規(guī)定的優(yōu)先級是1000~~負1000,系統(tǒng)默認優(yōu)先級是0。
粘性廣播(sendstickBroadcast),號稱是陰魂不散的廣播,它會一直等待intent指定的事件處理完畢才會消失。他需要API的權限BROADCAST_STICKY。它不會像普通廣播那樣10秒鐘以后就會被干掉。
注意一些細節(jié)問題:
1.廣播接收者的生命周期是非常短暫的,在接收到廣播的時候創(chuàng)建,onReceive()方法結束之后銷毀
2.廣播接收者中不要做一些耗時的工作,否則會彈出Application No Response錯誤對話框
3.最好也不要在廣播接收者中創(chuàng)建子線程做耗時的工作,因為廣播接收者被銷毀后進程就成為了空進程,很容易被系統(tǒng)殺掉
4.耗時的較長的工作最好放在服務中完成
總結
以上是生活随笔為你收集整理的浅谈BroadcastReceiver的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: intent和intentfilter
- 下一篇: 安卓实现定位功能的4种方式