«

Android中两个APP间跳转导致的异常问题及解决办法

时间:2024-3-2 18:49     作者:韩俊     分类: Android


假设现有两个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这个应用了。

标签: android

热门推荐