1 问题描述
首次安装APP后从SplashActivity页面进入MainActivity(进入时SplashActivity已经finish),然后按home键,再点击图标打开APP的时候发现APP重新从SplashActivity进入MainActivity,并不是跳转到点击home键之前的MainActivity页面。这个问题只会在安装成功后出现,安装后杀掉进程,再次重复操作没有问题。(部分手机通过adb安装没有问题,但是直接安装apk后首次进入都会出现上述问题)
2 问题原因
参考资料:
- 1 https://www.atlassc.net/?p=479
- 2 https://stackoverflow.com/questions/6337217/how-to-return-to-the-latest-launched-activity-when-re-launching-application-afte
- 3 https://stackoverflow.com/questions/6356467/activity-stack-ordering-problem-when-launching-application-from-android-app-inst
- 4 https://flowercat.iteye.com/blog/380859
- 5 https://blog.csdn.net/nupt123456789/article/details/34415849
- 6 http://www.echojb.com/android/2016/08/08/37513.html
补充说明:
- 在1中提到的核心思想—>
- 我们需要判断:该意图是打开一个新的任务,还是将后台的应用给提到前台来.
- 若是要将应用提到前台来直接将这个Activity结束掉,然后显示出来的Activity就是之前被最小化的Activity.
- 因为点击图标的意图会将新启动的Activity置于顶端,而顶端的下面的Activity就是之前被最小化的Activity.
- 此时结束掉新启动的Activity,就可以让之前被最小化的Activity 显示出来了.
3 解决方案
最初猜测SplashActivity和MainActivity不在一个栈中,可以通过adb命令查看当前栈的情况:
| adb shell “dumpsys activity | grep 包名” |
查找资料后解决方案如下:
- 方案一:
SplashActivity的onCreate方法中添加如下代码:
if (!isTaskRoot()) {
finish();
return;
}
- 方案二:
SplashActivity的onCreate方法中添加如下代码:
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
finish();
return;
}
- 方案三
SplashActivity的manifest中配置如下属性:
android:alwaysRetainTaskState="true"
android:clearTaskOnLaunch="false"