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

如何在自定义Application类中检测Android应用是否被系统重建?

如何在自定义Application中检测应用是否被系统杀死后重建?

这确实是个很实用的需求!先直接给结论:可以在自定义Application中实现这个检测,不过不像Activity里判断onCreate()的Bundle那么直接,得借助一些状态记录的手段。下面给你两种靠谱的实现思路:

方法1:用SharedPreferences记录应用退出状态

核心思路是:区分「用户主动正常退出应用」和「系统后台杀死应用」,通过SharedPreferences标记状态,在Application启动时校验这个标记。

具体步骤:

    1. 在自定义Application类里初始化SharedPreferences实例:
    class MyApp : Application() {
        private lateinit var sp: SharedPreferences
    
        override fun onCreate() {
            super.onCreate()
            sp = getSharedPreferences("app_state", MODE_PRIVATE)
            checkIfRecreatedBySystem()
        }
    
        private fun checkIfRecreatedBySystem() {
            val isNormalExit = sp.getBoolean("is_normal_exit", false)
            if (!isNormalExit) {
                // 应用是被系统杀死后重建的
                Log.d("MyApp", "App was recreated after being killed by system")
            }
            // 重置标记,不管这次是重建还是正常启动,下次启动都重新判断
            sp.edit().putBoolean("is_normal_exit", false).apply()
        }
    }
    
    1. 监听应用的正常退出时机,标记状态:
      你可以通过Application.ActivityLifecycleCallbacks监听所有Activity的生命周期,当最后一个Activity销毁时,标记为正常退出:
      class MyApp : Application(), Application.ActivityLifecycleCallbacks {
          private var activityCount = 0
      
          override fun onCreate() {
              super.onCreate()
              registerActivityLifecycleCallbacks(this)
              // ...其他初始化
          }
      
          override fun onActivityDestroyed(activity: Activity) {
              activityCount--
              if (activityCount == 0) {
                  // 所有Activity都销毁了,标记为正常退出
                  sp.edit().putBoolean("is_normal_exit", true).apply()
              }
          }
      
          override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
              activityCount++
          }
      
          // 实现其他ActivityLifecycleCallbacks的空方法
          override fun onActivityStarted(activity: Activity) {}
          override fun onActivityResumed(activity: Activity) {}
          override fun onActivityPaused(activity: Activity) {}
          override fun onActivityStopped(activity: Activity) {}
          override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
      }
      

方法2:结合ProcessLifecycleOwner(AndroidX专属)

如果你的项目用了AndroidX,可以借助ProcessLifecycleOwner监听应用的前后台状态,再结合SharedPreferences做更精准的判断:

    1. 先添加依赖(如果没有的话):
    implementation "androidx.lifecycle:lifecycle-process:2.6.2"
    
    1. 在Application里注册生命周期观察者:
    class MyApp : Application() {
        private lateinit var sp: SharedPreferences
    
        override fun onCreate() {
            super.onCreate()
            sp = getSharedPreferences("app_state", MODE_PRIVATE)
            ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
            checkIfRecreatedBySystem()
        }
    
        private fun checkIfRecreatedBySystem() {
            val wasInBackground = sp.getBoolean("was_in_background", false)
            val isNormalExit = sp.getBoolean("is_normal_exit", false)
            if (wasInBackground && !isNormalExit) {
                // 应用在后台被系统杀死后重建
                Log.d("MyApp", "App was recreated after being killed in background")
            }
            sp.edit().putBoolean("was_in_background", false).putBoolean("is_normal_exit", false).apply()
        }
    
        inner class AppLifecycleObserver : DefaultLifecycleObserver {
            override fun onStop(owner: LifecycleOwner) {
                super.onStop(owner)
                // 应用进入后台,标记状态
                sp.edit().putBoolean("was_in_background", true).apply()
            }
    
            override fun onStart(owner: LifecycleOwner) {
                super.onStart(owner)
                // 应用回到前台,重置后台标记
                sp.edit().putBoolean("was_in_background", false).apply()
            }
        }
    }
    
    这种方法可以更精准地判断应用是在后台被杀死的情况,适合需要区分前后台被杀场景的需求。

为什么不能像Activity那样用Bundle?

因为Application的onCreate()方法本身没有传入savedInstanceState参数——Application的生命周期和Activity完全独立,系统杀死进程后重建Application时,不会保存和传递任何状态数据,所以必须靠我们自己主动记录状态来做判断。

注意事项

  • 这些方法都不是100%绝对精准,但在绝大多数场景下足够好用:比如系统在极端低内存下可能直接强杀进程,但这种情况不会触发Activity的onDestroy(),所以正常退出的标记不会被设置,就能正确判断是系统杀死重建。
  • 如果你的应用有多进程,要注意SharedPreferences的进程同步问题,建议改用MMKV、ContentProvider等进程安全的存储方案。

内容的提问来源于stack exchange,提问作者Piotr Aleksander Chmielowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:25