?最近在做一個(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);
參考資料: