Android 4.0新的廣播機制FLAG_EXCLUDE_STOPPED_PACKAGES

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

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標誌來喚醒,示例代碼:android

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);
相關文章
相關標籤/搜索