Android應用在未啓動的情況下無法收到指定廣播的問題總結


    最近在做一個需求:程序沒有桌面圖標,安裝後能夠自動將其插件添加到Launcher上,也就是程序在未啓動的情況下,能夠完成一些操作。

    能夠想到的方案是在AndroidMainifest.xml中靜態註冊一個廣播,監聽系統的某些廣播達到觸發應用完成操作的目的,但現象是:程序安裝後,在未啓動的情況下無法接收到系統的廣播;但在啓動一次後,就能夠正常收到系統廣播。

    通過查閱資料發現,這個問題只有在Android 3.1及以上的版本纔會出現,我用的是4.2.2的版本測試,自然會有這個問題,具體原因是:從Android3.1開始,新安裝的程序會被置於"stopped"狀態,並且只有在至少手動啓動這個程序一次後該程序纔會改變狀態,能夠正常接收到指定的廣播消息。Android這樣做的目的是防止廣播無意或者不必要地開啓未啓動的APP後臺服務。

    也就是說在Android3.1及以上的版本,在未啓動的情況下通過應用自身完成一些操作是不可能的,但Android提供了一種藉助其它應用發送指定Flag廣播的方式,達到應用在未啓動的情況下仍然能夠收到消息的效果。

    從Android 3.1開始,系統給Intent定義了兩個新的Flag,分別爲FLAG_INCLUDE_STOPPED_PACKAGES(表示包含未啓動的App)和FLAG_EXCLUDE_STOPPED_PACKAGES(表示不包含未啓動的App),用來控制Intent是否要對處於停止狀態的App起作用,具體的操作方式如下:

1.在需要接收廣播的應用中靜態註冊廣播,並定義好action,並且需要指定android:exported="true";

<receiver android:name=".receiver.UpdateWidgetReceiver"
     android:exported="true">
     <intent-filter>
          <action android:name="com.uperone.widget.action"/>
     </intent-filter>
</receiver>

2.在發送廣播的應用中添加如下代碼段:

Intent intent = new Intent();
intent.setAction("com.uperone.widget.action");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);
    這招可以針對監測開機廣播啓動的app或者service,如果是stopped狀態,是收不到開機廣播的。


    按這樣改,親測有效!!!















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章