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打开导致重启的问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 打开第三方地图App进行导航

网页打开android app怎么传参数

第三方app在android中成功加载文件时收到回调

怎么通过html js打开手机APP,IOS和ANDROID的

如何将苹果手机开机启动APP?

Android 接收微信QQ其他应用打开,第三方分享