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

安卓应用切后台与恢复时切换Activity 解决LifecycleObserver传Intent问题

实现方案

你不需要提前向AppLifecycleListener传递预制的Intent,利用观察者持有的Application上下文就可以在生命周期触发时直接构造并启动Intent,具体实现步骤如下:

  • 给AppLifecycleListener构造函数传入Application实例,这个实例是全局上下文,不会造成内存泄漏
  • 新增全局状态标记,避免重复触发页面跳转,同时记录登录状态
  • 在对应生命周期回调中直接构造目标Intent,添加必要的启动Flag后调用startActivity即可
  • 注意:非Activity上下文启动Activity必须添加FLAG_ACTIVITY_NEW_TASK标记,否则会抛出系统异常

改造后的核心代码

AppLifecycleListener.kt

import android.app.Application
import android.content.Intent
import android.util.Log
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner

class App : Application() {
    // 全局登录状态标记,登录验证通过后置为true
    var isLoggedIn: Boolean = false
    // 后台返回标记,防止重复触发登录跳转
    var isReturningFromBackground: Boolean = false

    override fun onCreate() {
        super.onCreate()
        // 传入Application实例初始化生命周期观察者
        ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleListener(this))
    }
}

class AppLifecycleListener(private val application: Application) : DefaultLifecycleObserver {

    override fun onResume(owner: LifecycleOwner) {
        val app = application as App
        if (app.isReturningFromBackground) {
            app.isReturningFromBackground = false
            // 构造登录页Intent,添加启动Flag
            val loginIntent = Intent(application, LoginScreenActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
            }
            application.startActivity(loginIntent)
        }
    }

    override fun onStop(owner: LifecycleOwner) {
        val app = application as App
        app.isReturningFromBackground = true
        app.isLoggedIn = false
        // 构造空白页Intent,覆盖后台时的原有页面内容
        val emptyScreenIntent = Intent(application, EmptyScreenActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        }
        application.startActivity(emptyScreenIntent)
    }
}

补充适配点

  • 在LoginScreenActivity中,当用户身份验证通过后,将App实例的isLoggedIn标记设为true,再启动MainMenuActivity即可
  • 如果需要保留用户进入后台前访问的页面,可以在每个业务Activity的onPause生命周期中,将当前Activity的类名存入App的全局变量,登录成功后读取该值构造对应Intent跳转即可,无需提前向观察者传递Intent
  • 可以按需给Intent添加FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS标记,避免空白页、登录页出现在最近任务列表中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:39:12