1. 问题描述
前段时间测试给我提了个bug, App首次安装,按Home键退后台, 然后点击桌面上的启动按钮(不是从后台程序中进入), 然后会再次显示SplashActvitiy, 欢迎页或引导页
2. 解决过程
最初发现这个问题的时候, 并没有定位到详细的复现步骤, 后面反复测试, 才发现只有在除此安装时出现,
当时第一反应是出现了crash现象, 但是从log里面, 没有报出任何crash的信息, 于是祭神器,
https://stackoverflow.com/questions/19545889/app-restarts-rather-than-resumes
他的回答的连接(google issue 自行***): https://issuetracker.google.com/issues/36907463
可以看到提出该问题的时间是2009年
然而这个故事一直延续到了2018年.......
3. 解决方案
借助于stackOverflow那位回答给出的代码, 我测试过, 的确可行的, 主要是根据 isTaskRoot()方法判断是否已经存在于ActivityTaskStack中, 如果已经存在, 那么就将自己结束掉
if (!isTaskRoot() && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN)) { finish(); return; }
4. 简要分析
下图红色部分, 大概意思是说, 应用并不是重新启动了, 只是将这个Activity重新加入到了 Activity Task stack的栈顶,
如果不将启动页finish, 直接跳转到另一个Activity, 在第二个Activity中点击返回按钮, 那么仍然能够看到这个启动页
我按照他所说做了一下简单测试, 并使用adb命令查看Activity task stack
adb shell dumpsys activity activities
下图分别是重复问题复现步骤时, 使用那个解决方式的代码前Activity Task stack的信息
如答者所说, 很明显看到, MainActivity在任务栈中出现了两次, 之前那次并没有被销毁, 只是重新将MainActivity加载到了栈顶
下面这幅图是根据isTaskRoot的判断并finish结束自己后的Activity Task stack信息,
能够看到任务栈中, 由于第二次启动时, 判断MainActivity已经位于task root, 然后结束掉自己, 就没有再次出现在栈顶, 所以就没有出现bug效果
5. 总结
关于这个问题, 我觉得已经算是Android系统的问题了, 而且在国内, 并不是所有厂商都会出现上述问题, 例如google issue上有人说华为P8(Android 7.0)修复了这个问题, 由于我没有找到该机型, 所以我并没有验证
并且, 这个问题的出现时机, 只会在首次安装app时, 要按Home键退后台, 再次点击桌面的启动图标(而不是从后台程序列表), 才会出现, 所以是否要利用上述答案的代码对此问题做修复, 有待商榷,
具体还是看对app的需求吧
我找了几个身边的朋友(非程序员) 问了一下他们对这个问题的看法(主要是否会因为这个问题而对这个app产生反感), 反正我身边的人都觉得这个问题是个无所谓的事情, 也不是主要功能
总体来讲, 只能说Android系统博大精深......, 还要继续学习,
如有错误, 欢迎指出, 感激不尽 ~~!!!