今天緊急的跟進一個百度視頻App無法調起百度貼吧App的問題,當然,這個是隻發現是在4.x的android系統下發生,在2.x版本下,一切正常,(其實是3.1及以上的版本都有問題)具體場景爲:
1、貼吧App安裝成功但未啓動,試圖從視頻App通過sendBroadcast方式調起:失敗
2、貼吧App的進程被用戶強制殺掉,試圖從視頻App通過sendBroadcast方式調起:失敗
3、貼吧App處於啓動狀態,試圖從視頻App通過sendBroadcast方式調起:成功
看了一下視頻調起貼吧的代碼邏輯,是這樣的:
1
2
3
4
5
|
Intent
intent = new Intent( "com.baidu.tieba.action.INVOKE" ); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra( "type" ,
"frs" ); intent.putExtra( "fname" ,
"李毅" ); 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標誌來喚醒,示例代碼:
1
2
3
4
5
6
|
Intent
intent = new Intent( "com.baidu.tieba.action.INVOKE" );
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.
FLAG_INCLUDE_STOPPED_PACKAGES); intent.putExtra( "type" ,
"frs" ); intent.putExtra( "fname" ,
"李毅" ); activity.sendBroadcast(intent); |
如果你的項目依賴的Android SDK是3.1以下版本,那麼直接像上面這樣寫是會出問題的,你會發現Intent.FLAG_INCLUDE_STOPPED_PACKAGES無法被正確識別,所以相對安全的辦法是,直接把value寫進來:
1
2
3
4
5
6
7
8
9
|
Intent
intent = new Intent( "com.baidu.tieba.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" ,
"李毅" ); activity.sendBroadcast(intent); |