在我的主要活动中,我阅读了一些偏好
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
fontSize = settings.getFloat("textsize", (float) 20);
userName = settings.getString("userName","");
}
在其他各种子活动中,我像这样引用这些变量
body.setTextSize(Main.fontSize);
大部分时间都可以正常使用。应用程序运行一段时间后我偶尔会重新启动它,所有配置变量似乎都是空的。它在调试时不稳定且难以重现。当它发生时,我可以反复回过所有旧屏幕直到它退出,然后重新启动并且偏好恢复并正常工作
我可以随机尝试将事物移动到不同的地方,比如onStart()或onRestart(),到目前为止还没有帮助。或者重做每个活动以在启动时重新读取共享首选项。但是我更愿意理解导致这个问题的生命周期是什么。
答案 0 :(得分:0)
Android会定期销毁您的Activity并在需要时重新创建它。
因此,您的onCreate()
函数正在读取已保存的SharedPreferences
值,但类变量fontSize
和userName
并未停留在范围内。
我认为问题似乎是随机,并且因为这些变量似乎是static
而感到恼怒。我之所以这样说,是因为您的示例以静态方式访问fontSize
:
body.setTextSize(Main.fontSize);
您应该在更改时保存值,或者在onPause()
中保存,就像您可能已经这样做的那样。但是,仅在onCreate()
中阅读它们是不够的,因为Android并不总是会完全破坏您的活动。因此,每次您的活动恢复时都不会调用onCreate()
。您必须在需要时或onResume();
中重新读取值。
我在上面写了'exasperated',因为除非类完全被破坏,否则Java不会自动清除静态变量。因此,有时值会比其他时间更长时间保持不变,使行为看起来不可预测。
最后,允许这些值是静态的不是最佳实践。还有很多其他方法可以在Activites之间共享它们,包括SharedPreferences。