You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin跳转其他Activity时Material Dialog突然关闭问题

问题根因

你的实现存在两个核心逻辑错误,直接导致跳转页面时Dialog自动关闭:

  • 生命周期绑定错误:你描述的实现位置是onForegroundStart()方法,但实际代码绑定的是Lifecycle.Event.ON_CREATE回调,所有继承BaseActivity的Activity在创建时都会执行这段逻辑,只要处于登录状态,每个Activity实例都会生成自己的Dialog对象,不存在全局唯一的Dialog实例。
  • Dialog生命周期与宿主Activity强绑定:Dialog是附着在创建它的Activity Window上的,当你从SplashActivity跳转到HomeActivity时,SplashActivity会进入销毁流程,附着在它Window上的Dialog会被系统直接回收,自然不会保留到跳转后的页面,就会出现跳转瞬间Dialog突然消失的现象。
修复方案

按照以下步骤调整即可解决问题:

  1. 不要在BaseActivity的通用生命周期里直接创建绑定当前Activity实例的Dialog做全局登录态提示,避免Dialog跟随旧Activity销毁。
  2. 修正弹窗触发逻辑,增加防重复、防无效挂载判断:
    • 仅在当前处于栈顶、生命周期状态正常(未销毁、未finish)的Activity上挂载Dialog
    • 增加全局标记位,避免多个Activity重复创建同类型Dialog
    • 禁止返回键、点击外部关闭Dialog的逻辑,避免用户未操作就关闭弹窗
  3. 参考实现代码如下:
// BaseActivity内增加全局标记,防止重复弹窗
companion object {
    private var isSessionExpiredDialogShowing = false
}

override fun onResume() {
    super.onResume()
    // 仅在当前是栈顶页面、无同类型弹窗展示、页面状态正常时才创建弹窗
    if (isLoggedIn() 
        && !isSessionExpiredDialogShowing 
        && !isFinishing 
        && !isDestroyed) {
        isSessionExpiredDialogShowing = true
        dialog = MaterialDialog(this)
            .show {
                cancelOnTouchOutside(false)
                cancelable(false)
                message(text = "Session has expired")
                positiveButton(R.string.ok) {
                    dismiss()
                    userLogout()
                }
                setOnDismissListener {
                    isSessionExpiredDialogShowing = false
                }
            }
    }
}

override fun onDestroy() {
    super.onDestroy()
    // 页面销毁时主动回收Dialog,避免内存泄漏
    if (::dialog.isInitialized && dialog.isShowing) {
        dialog.dismiss()
    }
}

更优实现:如果是全局登录态过期这类全App生效的弹窗,建议通过Application.registerActivityLifecycleCallbacks注册全局生命周期监听,只在当前栈顶的Activity上挂载Dialog,从根源上避免页面切换时Dialog跟随旧Activity销毁的问题。

内容的提问来源于stack exchange,提问作者no_profile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:39:30