Android應(yīng)用在未啟動(dòng)的情況下無(wú)法收到指定廣播的問(wèn)題總結(jié)

?最近在做一個(gè)需求:程序沒(méi)有桌面圖標(biāo),安裝后能夠自動(dòng)將其插件添加到Launcher上,也就是程序在未啟動(dòng)的情況下,能夠完成一些操作。能夠想到的方案是在AndroidMainifest.xml中靜態(tài)注冊(cè)一個(gè)廣播,監(jiān)聽系統(tǒng)的某些廣播達(dá)到觸發(fā)應(yīng)用完成操作的目的,但現(xiàn)象是:程序安裝后,在未啟動(dòng)的情況下無(wú)法接收到系統(tǒng)的廣播;但在啟動(dòng)一次后,就能夠正常收到系統(tǒng)廣播。

??通過(guò)查閱資料發(fā)現(xiàn),這個(gè)問(wèn)題只有在Android 3.1及以上的版本才會(huì)出現(xiàn),我用的是4.2.2的版本測(cè)試,自然會(huì)有這個(gè)問(wèn)題,具體原因是:從Android3.1開始,新安裝的程序會(huì)被置于"stopped"狀態(tài),并且只有在至少手動(dòng)啟動(dòng)這個(gè)程序一次后該程序才會(huì)改變狀態(tài),能夠正常接收到指定的廣播消息。Android這樣做的目的是防止廣播無(wú)意或者不必要地開啟未啟動(dòng)的APP后臺(tái)服務(wù)。

??也就是說(shuō)在Android3.1及以上的版本,在未啟動(dòng)的情況下通過(guò)應(yīng)用自身完成一些操作是不可能的,但Android提供了一種借助其它應(yīng)用發(fā)送指定Flag廣播的方式,達(dá)到應(yīng)用在未啟動(dòng)的情況下仍然能夠收到消息的效果。
從Android 3.1開始,系統(tǒng)給Intent定義了兩個(gè)新的Flag,分別為FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未啟動(dòng)的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未啟動(dòng)的App),用來(lái)控制Intent是否要對(duì)處于停止?fàn)顟B(tài)的App起作用,具體的操作方式如下:

  • 在需要接收廣播的應(yīng)用中靜態(tài)注冊(cè)廣播,并定義好action,并且需要指定android:exported="true";

    <receiver android:name=".receiver.UpdateWidgetReceiver"
       android:exported="true">
       <intent-filter>
            <action android:name="com.uperone.widget.action"/>
       </intent-filter>
     </receiver>
    
  • 在發(fā)送廣播的應(yīng)用中添加如下代碼段:

    Intent intent = new Intent();
    intent.setAction("com.uperone.widget.action");
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    sendBroadcast(intent);
    

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容