Android中通過廣播方式調起第三方App

今天緊急的跟進一個百度視頻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);

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