我遇到的问题的一些背景知识:在我的应用程序中,我有一个单例对象,我经常使用它来访问网络调用的id和令牌等内容。有时当应用程序在后台被杀死时,这个单身人士会失去状态。但是,当应用再次打开并在启动器Activity
之后的某个Activity
启动时,单例为空。
我正在重构这个,但是一直在为如何确保即使在重新启动时单身人士总是存在而苦恼,但我不确定 Android 是做什么的当应用程序从后台重新启动时。
我在应用程序中使用的一些库( Facebook , Intercom )中查看了源代码,了解他们如何管理他们的单例以及为什么他们的静态变量似乎只是永远存在,并发现了一个理论。
因此,在正常的应用程序冷启动时,应用程序的行为如下:
Application.onCreate() -> Launcher.onCreate() -> Activity A -> Activity B
假设用户位于Activity
B并为应用提供背景信息。使用其他一些应用程序后,他们会回到我的应用程序,但它已经在两者之间的某个时刻被杀死。生命周期就变成了这个:
Application.onCreate() -> Activity B
我认为问题是我在启动器Activity
中初始化单例,结果,当B试图从单例中获取值时,它会出现空值。如果我在Application.onCreate()
中初始化单例,则会在应用再次上拉时始终初始化。它是否正确?
TL; DR被杀死并再次被带到前台的应用程序将始终调用其Application.onCreate()
,然后直接转发到它所在的Activity
。因此,对应用功能至关重要的应用初始化应该存在于Application
onCreate()
中。
答案 0 :(得分:2)
是的,当应用程序到达前台时,始终会调用Application.onCreate()
,因此您需要初始化的每个Singleton都必须在那里。
答案 1 :(得分:2)
一个被杀死并再次被带到前台的应用程序将始终调用其Application.onCreate(),然后直接转发到它所在的活动。因此,对应用程序运行至关重要的应用程序初始化应该存在于Application onCreate()中。
正确。
我认为问题是我在LauncherActivity中初始化单例,结果,当B试图从单例中获取一个值时,它会出现空值。如果我在Application.onCreate()中初始化Singleton,它将在应用程序再次上拉时始终初始化。这是对的吗?
在你的情况下,问题就在于此。但是,如果通过"它出现null" 你的意思是单例实例是null
那么单身是如何工作的。无论你从哪里调用单例的方法,它的实例都不应该是null
。