Android 4.0新的廣播機制FLAG_EXCLUDE_STOPPED_PACKAGES

問題:
第三方app調起失敗,當然,這個是隻發現是在4.x的android系統下發生,在2.x版本下,一切正常,(其實是3.1及以上的版本都有問題)具體場景爲:
1、第三方App安裝成功但未啓動,試圖從App通過sendBroadcast方式調起:失敗
2、第三方App的進程被用戶強制殺掉,試圖從App通過sendBroadcast方式調起:失敗
3、第三方App處於啓動狀態,試圖從App通過sendBroadcast方式調起:成功
看了一下調起第三方app的代碼邏輯,是這樣的:

Intent intent = new Intent("com.hahaha.action.INVOKE");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("type", "frs");
intent.putExtra("fname", "hahaha");
activity.sendBroadcast(intent);

於是直接定位問題:必定是高版本的android系統,在發送廣播的適合,無法調起未啓動(處於停止狀態)的的App,打開官方文檔查了一下: http://developer.android.com/about/versions/android-3.1.html#launchcontrols 寫的很明白,大概意思是:
從Android 3.1開始,給Intent定義了兩個新的Flag,分別爲FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES,用來控制Intent是否要對處於停止狀態的App起作用,顧名思義:
FLAG_INCLUDE_STOPPED_PACKAGES:表示包含未啓動的App
FLAG_EXCLUDE_STOPPED_PACKAGES:表示不包含未啓動的App
值得注意的是,Android 3.1開始,系統向所有Intent的廣播添加了FLAG_EXCLUDE_STOPPED_PACKAGES標誌。這樣做是爲了防止廣播無意或不必要地開啓未啓動App的後臺服務。如果要強制調起未啓動的App,後臺服務或應用程序可以通過向廣播Intent添加FLAG_INCLUDE_STOPPED_PACKAGES標誌來喚醒,示例代碼:

Intent intent = new Intent("com.hahaha.action.INVOKE"); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent. FLAG_INCLUDE_STOPPED_PACKAGES);
intent.putExtra("type", "frs");
intent.putExtra("fname", "hahaha");
activity.sendBroadcast(intent);

如果你的項目依賴的Android SDK是3.1以下版本,那麼直接像上面這樣寫是會出問題的,你會發現Intent.FLAG_INCLUDE_STOPPED_PACKAGES無法被正確識別,所以相對安全的辦法是,直接把value寫進來:

Intent intent = new Intent("com.hahaha.action.INVOKE"); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 3.1以後的版本直接設置Intent.FLAG_INCLUDE_STOPPED_PACKAGES的value:32
if (android.os.Build.VERSION.SDK_INT >= 12) {
    intent.setFlags(32);
}
intent.putExtra("type", "frs");
intent.putExtra("fname", "hahaha");
activity.sendBroadcast(intent);
發佈了32 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章