? ? ? ? 在處理鎖屏和開(kāi)屏的監(jiān)聽(tīng)時(shí)候使用到了系統(tǒng)廣播,但效果令人坑爹,后來(lái)查詢了官方一些文檔,得知谷歌對(duì)第三方APP監(jiān)聽(tīng)系統(tǒng)廣播操作做了一些限制;
? ? ? ? 初步發(fā)現(xiàn)有如下幾個(gè)系統(tǒng)廣播,不能進(jìn)行靜態(tài)注冊(cè)的廣播:
? ? ? android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK
原因(有以下幾種說(shuō)法,提供給大家參考):
1.提高系統(tǒng)效率:這兩個(gè)事件是android的基本事件,如果大多數(shù)程序監(jiān)聽(tīng),會(huì)大大的拖慢整個(gè)系統(tǒng),所以android不鼓勵(lì)我們?cè)诤笈_(tái)監(jiān)聽(tīng)這兩個(gè)事件。
2.因?yàn)橛行驈V播的優(yōu)先級(jí)問(wèn)題。以上這些廣播中,靜態(tài)注冊(cè)時(shí),系統(tǒng)的優(yōu)先級(jí)大于應(yīng)用,并且系統(tǒng)阻止了廣播的向下傳播。又因在Android 的廣播機(jī)制中,動(dòng)態(tài)注冊(cè)的優(yōu)先級(jí)是要高于靜態(tài)注冊(cè)優(yōu)先級(jí)的。故用動(dòng)態(tài)注冊(cè)代替靜態(tài)注冊(cè)。
3.系統(tǒng)安全問(wèn)題。
解決方案(以android.intent.action.BATTERY_CHANGED為例):
動(dòng)態(tài)注冊(cè)不能放到activity中,因?yàn)閯?dòng)態(tài)注冊(cè)必須要在activity消亡的時(shí)候調(diào)用unregisterReceiver,會(huì)隨著activity的解鎖消失而不能再接收廣播。一般的辦法是在activity起來(lái)后馬上start一個(gè)service,這個(gè)service里動(dòng)態(tài)注冊(cè)一個(gè)broadcastreceiver,service必須常駐在系統(tǒng)內(nèi),所以要接收開(kāi)機(jī)消息android.intent.action.BOOT_COMPLETED。