CPPAlien的專欄 .
[原]從Installer直接打開應用程序會出現Android系統bug
問題現象:
用Android系統自帶的Installer安裝完應用後,會有以下兩個不同表現:
1,用戶直接在installer界面打開應用。然後按home鍵後臺運行,此時如果再點擊該應用的launcher圖標或者快捷方式進入,會發現該應用又會從該應用第一個頁面重新開始啓動。
2,用戶在installer界面安裝完後,直接點擊完成,然後找到launcher圖標點擊啓動應用。此時按home鍵後臺,再次點擊圖標進入,發現應用會呈現上次按home鍵前呈現的Activity。
測試實驗:
經測試發現,只要是從一個應用去啓動另一個應用,都會有此問題,以下我會用一個例子說明。
現有App1和App2.
App1中有一個Activity,有如下代碼去打開App2.
PackageManager packageManager = getPackageManager();
Intent intent;
intent = packageManager.getLaunchIntentForPackage("cc.ninty.app2");
if(intent==null){
System.out.println("APP not found!");
}
startActivity(intent);
App2中有兩個Activity,Activity1和Activity2,用Activity1去自動startActivity2.
以上三個Activity的launch mode都爲默認的standard。此時執行App1,並監控這三個Activity的taskid。
可以發現通過App1啓動的App2中的兩個Activity的taskid與App1不同,並且以後每次點擊APP2的launcher圖標都會發現Activity1和Activity2又會被重新創建一次,並且taskid與前一次相同。
問題原因:
Android從最初開始一直有次bug並且一直未修復,以下是找的一些資料。
https://code.google.com/p/android/issues/detail?id=2373
https://code.google.com/p/android/issues/detail?id=26658
http://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508#16447508
規避方案:
因第二次通過launcher或者快捷方式啓動應用,會重新創建Activity1,但此時的Activity1不是該task的root(也即該task第一個擁有的activity),所以可以通過在Activity1的onCreate方法中寫以下判斷:
if ( !isTaskRoot() ) {
finish();
return;
}
表示如果task中還有其他Activity則不進行重複創建。