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_PACKAGESFLAG_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);

以上,Mark一下!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM