关于我遇到的问题的一些背景:在我的应用程序中,我有一个单例对象,我经常使用它来访问网络调用的 id 和令牌等内容。有时,当应用程序在后台被终止时,这个单例就会失去其状态。但是,当应用程序再次打开并在某些情况下启动时Activity
经过发射器Activity
,单例为空。
我正在重构它,但一直在苦恼如何确保单例即使在应用程序重新启动时也始终存在,但我不确定什么Android当应用程序从后台重新启动时执行。
我浏览了我们在应用程序中使用的一些库的源代码(Facebook, Intercom)看看他们如何管理他们的单例以及为什么他们的静态变量似乎总是存在,并得出了一个理论。
因此,在正常的应用程序冷启动时,应用程序的行为如下:
Application.onCreate() -> Launcher.onCreate() -> Activity A -> Activity B
假设用户在Activity
B 和应用程序的背景。使用其他一些应用程序后,他们回到我的应用程序,但它在中间的某个时刻被杀死了。那么生命周期就变成了这样:
Application.onCreate() -> Activity B
我认为问题是我在启动器中初始化了单例Activity
,因此,当 B 尝试从单例中获取值时,结果为 null。如果我初始化单例Application.onCreate()
,当再次拉起应用程序时,它总是会被初始化。它是否正确?
TL;DR 被终止并再次带到前台的应用程序将始终调用其Application.onCreate()
然后直接转发到Activity
它已经打开了。因此,对应用程序功能至关重要的应用程序初始化应该位于Application
onCreate()
.
被杀死并再次带到前台的应用程序将始终调用其 Application.onCreate(),然后直接转发到其所在的 Activity。因此,对应用程序功能至关重要的应用程序初始化应位于应用程序 onCreate() 中。
Correct.
我认为问题在于我在 LauncherActivity 中初始化了单例,因此,当 B 尝试从单例中获取值时,它会出现 null。如果我在Application.onCreate()中初始化Singleton,那么当应用程序再次启动时,它总是会被初始化。它是否正确?
就你而言,问题确实出在于此。然而,如果通过“结果为空”你的意思是单例实例是null
那么这不是单例应该如何工作的。无论你从哪里调用单例的方法,它的实例都不应该是null
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)