gpt4 book ai didi

android - 为什么将 Activity 实例保存到静态单例中不起作用?

转载 作者:行者123 更新时间:2023-11-30 00:17:41 25 4
gpt4 key购买 nike

private static MainActivity main;
@Override
protected void onCreate(Bundle savedInstanceState) {
main=this;
}
public static MainActivity getInstance(){
return main;
}

此代码按预期完美运行,直到应用程序在后台运行的时间过长。然后奇怪的事情发生了:getInstance() 不一定返回 Activity 的 Activity。

例如,如果在 MainActivity 中实际显示的 fragment 在 onClickListener 中调用 MainActivity.getInstance().showSomeOtherFragment();抛出 IllegalThreadState 或 ActivityDestroyed 异常。我的理论是 getInstance() 指向一个旧实例。

但为什么“new”onCreate 不会将“main”更新到新实例?

(我知道在这种情况下我应该使用 FragmentInteraction,但我需要传输一个不可 bundle 的对象)

最佳答案

Activity 实例保存到静态字段中的想法存在很多问题,但我暂时选择忽略这些问题,而是讨论为什么静态字段在应用已在后台运行很长时间

对于此类问题,了解 Android 编程最重要的一点是,Android 操作系统可以随时终止您的进程。当然,操作系统试图对此友好。它将尽最大努力仅在用户不主动与之交互时终止您的进程,并且它将为您提供记录状态的机会,以便以后可以恢复您的进程(用户没有意识到该进程曾经被杀)。

当操作系统终止您的进程时,您通过静态变量保存的任何内容都将丢失

这就是(原因之一)为什么系统会为您提供像 onSaveInstanceState() 这样的回调:这样您就可以获取应用程序的状态并保存它即使进程终止 .

即使操作系统不会终止您的进程,它也可以执行诸如“销毁”给定的 Activity 实例之类的操作以回收一些系统资源。一旦 Activity 实例被销毁,它就不再有效。

tl;dr:当操作系统终止您的进程时,静态变量将无法生存;您希望“保存”的任何内容都应存储在 SharedPreferences 中或添加到传递给 onSaveInstanceState()Bundle 中,等等。

关于android - 为什么将 Activity 实例保存到静态单例中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com