最近把自己的手機系統(tǒng)升級到了android 8.0寻狂,然后以前能正常運行的項目访娶,莫名其妙的出了問題又固,有個地方廣播接收不到了冰寻,然后分別在6.0和7.0的設(shè)備上運行了項目须教,發(fā)現(xiàn)一切正常,擦斩芭,估計是高版本系統(tǒng)的問題轻腺,又要適配,不過划乖,在調(diào)試程序時贬养,在打印出的日志里面發(fā)現(xiàn)了這句話:
Background execution not allowed: receiving Intent { act=izis_MinaPushServiceOpen_kyteach flg=0x10 (has extras) } to cn.izis.kyteach/.receiver.DataReceiverPublic
后來在網(wǎng)上查了 android8.0及以上系統(tǒng)關(guān)于廣播的規(guī)定:發(fā)現(xiàn)果然是對隱式廣播做了限定,如果targetSdkVersion >=26琴庵,在Manifest里面注冊的Receiver可能無法接收到廣播消息(我的廣播接收者就是像這樣靜態(tài)注冊的):
<receiver android:name=".receiver.DataReceiverPublic">
<intent-filter>
<action android:name="izis_MinaPushServiceOpen_kyteach" />
</intent-filter>
</receiver>
但是因為這個靜態(tài)廣播涉及的代碼和邏輯比較多误算,所以完全改成動態(tài)注冊的方式,還是有點繁瑣的细卧,后來查閱相關(guān)資料尉桩,還是有解決辦法的筒占,加上后面這段代碼:
if(Build.VERSION.SDK_INT >= 26){
ComponentName componentName=new ComponentName(getApplicationContext(),"cn.izis.kyteach.receiver.DataReceiverPublic");//參數(shù)1-包名 參數(shù)2-廣播接收者所在的路徑名
myIntent.setComponent(componentName);
}
但是如果是在2個不同的包之間發(fā)送廣播贪庙,這句話是沒用的,而是需要加上后面這段代碼:
if(Build.VERSION.SDK_INT >= 26){
myIntent.addFlags(0x01000000);//加上這句話翰苫,可以解決在android8.0系統(tǒng)以上2個module之間發(fā)送廣播接收不到的問題}
哈哈止邮,又可以正常的接收廣播了!奏窑!