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这个应用了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Android Studio代码,实现了两个页面之跳转: 1. 在app的build.gradle文件添加以下依赖: ``` dependencies { implementation 'androidx.appcompat:appcompat:1.3.0' } ``` 2. 创建两个Activity,分别命名为MainActivity和SecondActivity。 3. 在MainActivity的布局文件(activity_main.xml)添加一个Button,代码如下: ``` <Button android:id="@+id/btn_go_to_second_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Go to Second Activity"/> ``` 4. 在MainActivity的Java文件添加以下代码,实现点击按钮跳转到SecondActivity: ``` public class MainActivity extends AppCompatActivity { private Button btnGoToSecondActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnGoToSecondActivity = findViewById(R.id.btn_go_to_second_activity); btnGoToSecondActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } } ``` 5. 在SecondActivity的布局文件(activity_second.xml)添加一个TextView,代码如下: ``` <TextView android:id="@+id/tv_second_activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is the Second Activity"/> ``` 6. 在SecondActivity的Java文件添加以下代码,实现点击返回按钮返回到MainActivity: ``` public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } @Override public void onBackPressed() { super.onBackPressed(); finish(); } } ``` 7. 运行应用程序,在MainActivity点击按钮可以跳转到SecondActivity,在SecondActivity点击返回按钮可以返回到MainActivity。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值