我试图更好地了解配置更改和实例状态。
现在我知道旋转屏幕等动作被视为配置更改,它会破坏并重新创建活动。有时这意味着如果你不小心,你可能会丢失数值(例如,如果你有一个数字列表,当你旋转屏幕时,它会被重置为所有0)。
您可以使用onSaveInstanceState
或onRestoreInstanceState
等常用方法,或在savedInstanceState
方法中检查onCreate
是否为空,等等 - 保存和恢复价值,这样当事情发生变化时你就不会失去任何东西。
我的问题:
是否需要考虑多种类型的配置更改?例如,如果我的应用程序即使屏幕旋转也能按预期工作,这是否也意味着它会随着其他形式的配置更改而延续并按预期运行?
我如何知道应该将哪些变量保存到我的实例状态变量中?哪些变量会在配置更改时自动保留?将所有成员变量存储在onSaveInstanceState
中的实例状态中,然后在onRestoreInstanceState
中重新应用它们是不错的做法?
答案 0 :(得分:3)
例如,如果我的应用程序即使屏幕旋转也能按预期工作,这是否也意味着它会随着其他形式的配置更改而延续并按预期运行?
一般来说,是的。我想说的更多:配置更改的良好实现方法将处理所有可能的配置更改。
因此,例如,如果用户运行您的应用程序,按HOME,进入设置,更改其区域设置,然后通过概览屏幕(也称为最近任务列表)返回到您的应用程序,您的最顶层活动将进行配置更改。这里的目标是为您加载新的字符串资源和内容,以反映新选择的语言。但是,如果您在保存的实例状态Bundle
中保存一些面向用户的字符串,只需在新活动中使用该字符串 - 而不是再次调用getString()
- 那么您将获得旧语言的值
许多开发人员只考虑方向变化。 通常,如果您处理方向更改,则“免费”处理所有其他配置更改。但是,情况并非总是如此,这就是为什么你需要考虑它。
我如何知道应该将哪些变量保存到我的实例状态变量中?哪些变量会在配置更改时自动保留?
“自动保留”的主要内容是:
用于启动活动的Intent
UI中小部件中的用户可变状态(例如,EditText
中的文本)...假设您没有覆盖onSaveInstanceState()
或链接到超类实现
如果您正在使用片段,则会在配置更改时保留您的片段(即,使用相同的实例)或重新创建(即,使用相同类的新实例)。
不自动处理的是您活动的任何字段/数据成员。你需要决定的那些:
这是我需要在配置更改中保留的东西,还是只是在新活动中重建某些内容的缓存?
这是我可以合理地放入已保存的实例状态Bundle
,还是大小(例如Bitmap
)或数据类型(例如{{1}那不能保持这种方式?对于这些,除了保存的实例状态Socket
(保留片段,保留数据等)之外,您还需要采用其他技术。
答案 1 :(得分:2)
当Android操作系统内存不足并且需要终止某些进程时,可以调用onSaveInstanceState和onRestoreInstanceState。例如,如果您的应用程序进入后台并稍后恢复,则可以调用这些方法。
活动会自动保存所有视图。例如,EditText的文本和复选框的选中状态将在配置更改后自动保存和恢复。您应使用onSaveInstanceState和onRestoreInstanceState方法手动保存Activity的所有其他数据(包括实例变量)。