Android中兩個APP間跳轉導致的異常問題及解決辦法
假設現有兩個APP:app1 和 app2
兩個app中均有兩個Activity:A 和 B
且兩個app的入口Activity均是:A
操作流程:app1.A ---> app.B ---> app2.A ---> app2.B
1.從app1.B向app2.A跳轉的實現方法:
在app1.B中用ComponentName結合Intent來實現APP間的跳轉
ComponentName componetName = new ComponentName(
//跳轉目標應用的包名,即目標應用manifest檔案中的包名
"com.example.testapp2"
//需要調起的目標應用中的Activity的路徑,包名+Activity名
"com.example.test2.activity.FirstActivity");
Intent intent= new Intent();
intent.setComponent(componetName);
startActivity(intent);
2.出現的問題:
問題描述:
app1.B ---> app2.A 跳轉成功後,從app2.A ---> app2.B ,接著按Home鍵返回桌面,再次點選app2的圖示進入app2,發現並沒有返回app2.B這個頁面,而是重啟了app2這個應用。
問題原因:
app1.A ---> app1.B ---> app2.A --->app2.B 這樣的流程執行完,存在一個以app.A為根的任務棧,該任務棧內從棧底到棧頂分別為app1.A、app1.B、app2.A和app2.B。
當我在app2.B處直接按Home鍵返回桌面並再次點選app2的圖示進入app2,
此時系統會查詢是否存在以app2入口Activity為根的任務棧,如果不存在就會建立一個以app2入口Activity為根的任務棧。由於當前系統中並沒有以app2入口Activity為根的任務棧,所以我在點選圖示的時候會重啟app2。
解決辦法:
將app1.B中的跳轉方法改為:
ComponentName componetName = new ComponentName(
//跳轉目標應用的包名,即目標應用manifest檔案中的包名
"com.example.testapp2",
//需要調起的目標應用中的Activity的路徑,包名+Activity名
"com.example.test2.activity.FirstActivity");
Intent intent= new Intent();
intent.setComponent(componetName);
//新建一個任務棧task存放app2.A,且以app2.A為根
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
在app2.A中設定:
if ( !isTaskRoot() ) {
finish();
return;
}
isTaskRoot()值為false,表示系統中有以app2.A為根的task。
這個修改完之後,就可以完美實現從app1.B跳轉到app2.A再進入app2.B後,在app2.B這個頁面按Home鍵返回桌面,然後點選app2的圖示,就可以恢復退出時的app2.B這個頁面,而不是重啟app2這個應用了。