我遇到的一个问题的一些背景:在我的应用程序中,我有一个单例对象,我经常使用它来访问网络调用的 id 和令牌等内容。有时,当应用程序在后台被终止时,这个单例就会失去其状态。然而,当应用程序再次打开并在启动器之后的某个
Activity
中启动时,单例为空。 我正在重构它,但一直在苦恼如何确保单例即使在应用程序重新启动时也始终存在,但我不确定当应用程序从后台重新启动时Android
会做什么。 我浏览了我们在应用程序中使用的一些库(
Facebook、Intercom)的源代码,看看它们如何管理它们的单例以及为什么它们的静态变量似乎总是存在,并得出了一个理论。 因此,在正常的应用程序冷启动时,应用程序的行为如下:
Activity
假设用户位于
Application.onCreate() -> Launcher.onCreate() -> Activity A -> Activity B
B 并将应用程序置于后台。使用其他一些应用程序后,他们回到我的应用程序,但它在中间的某个时刻被杀死了。那么生命周期就变成这样了:
Activity
我认为问题在于我在启动器中初始化了单例
Application.onCreate() -> Activity B
,因此,当B尝试从单例中获取值时,它会出现空值。如果我在
Activity
中初始化单例,那么当应用程序再次启动时,它总是会被初始化。它是否正确? TL;DR 被杀死并再次带到前台的应用程序将始终调用其
Application.onCreate()
,然后直接转发到其所在的
Application.onCreate()
。因此,对应用程序功能至关重要的应用程序初始化应位于 Activity
Application
中。 正确。
我认为问题在于我在 LauncherActivity 中初始化了单例,因此,当 B 尝试从单例中获取值时,它会出现 null。如果我在 Application.onCreate() 中初始化 Singleton,那么当应用程序再次启动时,它总是会被初始化。这是正确的吗?
你的意思是单例实例是就你而言,问题确实出在于此。然而,如果“it comes null”
onCreate()
那么这不是单例应该如何工作的。无论你从哪里调用单例的方法,它的实例都不应该是null
。是的,当应用程序进入前台时,总是会调用