为什么单例类在Activity退出后仍然存在?

9
我有一个单例类,我将其与应用程序中的某个活动一起使用。当我退出该活动(返回菜单活动),然后重新打开该活动时,我发现尝试访问单例时它仍然是相同的。它不应该随着活动的销毁而被摧毁吗?我看到了这里的问题:living singleton, when activity end,但我无法完全理解他们的意思。当我按下设备上的返回按钮(或在活动本身内部使用finish)时,活动是否会保持活动状态以供将来使用?如果是这样,那么这就可以解释这个问题。
1个回答

14

这个活动(Activity)不应该已经被销毁了吗?

不是这样的。

当我在设备上按返回按钮(或在 Activity 中使用 finish() 函数),这个 Activity 是否会保留下来以便未来使用?

这个 Activity 不会保留下来,但是进程会保留。单例模式属于虚拟机的一部分,只要进程存在,它们就会一直存活。退出最后一个 Activity 并不会立即终止进程,所以单例会存活一段时间。

Android 最终会终止该进程,以释放内存给其他应用程序使用。它的执行速度取决于用户正在做什么、安装了哪些应用程序、月相等因素。


最好的方法是在退出Activity时“手动”销毁单例。 - theblitz
@theblitz 如果您正在实施单例模式,则两个不同的活动访问单例的同一实例应该是期望的效果。如果它们应该访问不同的实例,则应该只是使用普通对象实例化。 - AndrewKS
1
@theblitz:"它必须是单例,因为它定义了一副牌,我不能有多幅。"——这并不意味着你需要遵循单例模式。请只将其作为您活动的普通数据成员。除非绝对必要,否则永远不要创建静态数据成员,而这种情况并不是“绝对必要”的。 - CommonsWare
@Commonsware,Google建议使用静态而非虚拟方法,并建议避免使用内部的getter/setter。可以在这里阅读到:http://developer.android.com/guide/practices/design/performance.html - Will Kru
@theblitz:“如果我需要从许多不同的地方引用相同的实例化,应该怎么做?”--你可以将它作为参数传递给一个方法。如果你是Java的新手,你应该退后一步学习Java。 - CommonsWare
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接