Android 第三方打开App后现Launcher打开导致重启的问题
Posted 安静的Sunny
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 第三方打开App后现Launcher打开导致重启的问题相关的知识,希望对你有一定的参考价值。
这暂且做一个备忘录
问题
第一次遇到这个问题,测试同学说:
每次第一次安装App后,打开至第二级界面,退至后台,然后再从Launcher界面点击Icon图标启动,会发现App会重新启动,跳至首页,而不是跳至上次打开的第二级界面。但是如果把进程kill掉后,再从Launcher界面启动,跳于二级界面—-》Home退至后台—-》Launcher界面重新启动,这样就没问题了。
开始,我也很纳闷,看他操作也的确这样,经过分析发现有个地方露出了马脚,就是第一次启动App的操作。最开始安装时通过第三方安装器安装,完了直接在第三方应用里面点击“打开”按钮。
而杀掉进程后的操作,是直接从Launcher界面启动的。这里肯定会涉及进程问题,及第三方应用启动与Launcher启动App的PID是不一样的。
分析
比如:从第三方应用启动App时,它的taskId 为 300,回到后台,再从Launcher点击Icon启动,它的taskId还是为300.这时如果你的MainActivity是设置成singleTask,那么它会把你上面的所有界面都clear掉。
这也是为什么第一次启动停留在第二级界面,但从Launcher第二次启动时,会重新启动,停留在首页的原因。因为第一次的二级界面都被第二次启动的MainActivity给Clear掉了。
解决办法
网上有篇文章介绍了几种解决方法,这里我只说下一种:
在Launch界面,判断它是不是在根栈。如果不是,证明已经有在别的任务栈启动了,则直接finish退出。
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//如果是从第三方应用安装后直接打开,退至后台后,再从Launcher打开App,则第二次打开会
//被压入至第一次的任务栈中,此时如果MainActivity设置成SingleTask,则它会清掉它上面的所有Activity.
//这里的做法,就是当第二次从Launcher启动App时,在启动页创建的时候判断下它所在的任务栈,是不是根栈。
//若不是,则直接finish,不让其进入MainActivity.
if (!isTaskRoot())
finish();
return;
参考资料
http://blog.csdn.net/zhangcanyan/article/details/52777265
以上是关于Android 第三方打开App后现Launcher打开导致重启的问题的主要内容,如果未能解决你的问题,请参考以下文章