安卓应用切后台与恢复时切换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
相关产品推荐
相关产品推荐

