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掉了。
解决办法 【Android 第三方打开App后现Launcher打开导致重启的问题】网上有篇文章介绍了几种解决方法,这里我只说下一种:
在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第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- thinkphp|thinkphp 3.2 如何调用第三方类库
- android|android studio中ndk的使用
- Android事件传递源码分析
- 【70号】Day26朋友日
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库