1. 程式人生 > >Android中兩個APP間跳轉導致的異常問題及解決辦法

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這個應用了。