Android之点击Home键或者点击Google Play 对应的APP后再次打开:导致APP重启问题

1.问题描述:当APP正常启动进入主界面后切后台或者打开别的APP,比如用户启动APP后将APP切后台同时打开Google Play,这个时候在Google Play 搜索到当前APP,点击打开当前APP,APP会打开,但是回不到之前的界面了。

  1. 问题分析:一般APP启动流程是:

未登录:闪屏页SplashActivity---> 登录页LoginActivity---->Home主界面MainActivity

用户已登录:闪屏页SplashActivity--->Home主界面MainActivity

当用户通过点击三方按钮intent拉起来当前APP时会走带Launcher 的 Activity,一般launcher的Activity是 SplashActivity,所以会重新走一遍上面的启动流程。

一般APP的MainActivity会设置成: android:lauchMode="singleTask", 出现问题的原因就在MainActivity的启动模式上:singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记"这点是毋庸置疑的。

3.解决办法:

通过点击三方再次拉起来APP时,产品侧希望回到之前的界面,而不是回到主界面,如果按照目前的流程重新走了一遍启动流程,要想通过启动流程再回到之前的界面,那就要记录很多东西,重新跳转,这个想法是常规的想法,实现起来有些难度。换个方向想下,既然APP重新走启动流程的时候,之前的界面还在栈中,只是被SplashActivity压下去了,这个时候可以走到SplashActivity时,判断下这个时候的栈中是否还有其他Activity,如果还有其他的Activity,就把当前的SplashActivity 关闭掉,这样下面的Activity就到达了栈顶,这样就恢复了之前的界面,问题完美解决。

4.代码: SplashActivity 的 oncreate() 方法添加即可:

Kotlin 复制代码
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_NAVIGATION_BAR).init()
        mViewBinding = ActivitySplashBinding.inflate(layoutInflater)
        setContentView(mViewBinding.root)
        action = ActionController.getDeeplinkParameter(intent)
        if (!isTaskRoot && (intent.extras == null) && TextUtils.isEmpty(action)) {
            finish()
            return
        }
        /**
         * 后续逻辑
         */
    }
相关推荐
酷酷的崽7989 分钟前
CANN 生态可维护性与可观测性:构建生产级边缘 AI 系统的运维体系
运维·人工智能
做人不要太理性14 分钟前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
XiaoFan01218 分钟前
免密批量抓取日志并集中输出
java·linux·服务器
souyuanzhanvip24 分钟前
ServerBox v1.0.1316 跨平台 Linux 服务器管理工具
linux·运维·服务器
我命由我1234531 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
文静小土豆33 分钟前
Docker 与 containerd 代理配置详解:镜像拉取速度慢的终极解决方案
运维·docker·容器
朗迹 - 张伟1 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu2 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
HalvmånEver2 小时前
Linux:线程互斥
java·linux·运维
番茄灭世神2 小时前
Linux应用编程介绍
linux·嵌入式