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突然消失的现象。
修复方案
按照以下步骤调整即可解决问题:
- 不要在BaseActivity的通用生命周期里直接创建绑定当前Activity实例的Dialog做全局登录态提示,避免Dialog跟随旧Activity销毁。
- 修正弹窗触发逻辑,增加防重复、防无效挂载判断:
- 仅在当前处于栈顶、生命周期状态正常(未销毁、未finish)的Activity上挂载Dialog
- 增加全局标记位,避免多个Activity重复创建同类型Dialog
- 禁止返回键、点击外部关闭Dialog的逻辑,避免用户未操作就关闭弹窗
- 参考实现代码如下:
// 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
相关产品推荐
相关产品推荐

