如何在自定义Application类中检测Android应用是否被系统重建?
如何在自定义Application中检测应用是否被系统杀死后重建?
这确实是个很实用的需求!先直接给结论:可以在自定义Application中实现这个检测,不过不像Activity里判断onCreate()的Bundle那么直接,得借助一些状态记录的手段。下面给你两种靠谱的实现思路:
方法1:用SharedPreferences记录应用退出状态
核心思路是:区分「用户主动正常退出应用」和「系统后台杀死应用」,通过SharedPreferences标记状态,在Application启动时校验这个标记。
具体步骤:
- 在自定义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() } }- 监听应用的正常退出时机,标记状态:
你可以通过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做更精准的判断:
- 先添加依赖(如果没有的话):
implementation "androidx.lifecycle:lifecycle-process:2.6.2"- 在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
相关产品推荐
相关产品推荐

