Android中的配置更改以及要在实例状态中保存的变量

时间:2016-04-04 16:00:06

标签: android configuration instance

我试图更好地了解配置更改和实例状态。

现在我知道旋转屏幕等动作被视为配置更改,它会破坏并重新创建活动。有时这意味着如果你不小心,你可能会丢失数值(例如,如果你有一个数字列表,当你旋转屏幕时,它会被重置为所有0)。

您可以使用onSaveInstanceStateonRestoreInstanceState等常用方法,或在savedInstanceState方法中检查onCreate是否为空,等等 - 保存和恢复价值,这样当事情发生变化时你就不会失去任何东西。

我的问题:

  1. 是否需要考虑多种类型的配置更改?例如,如果我的应用程序即使屏幕旋转也能按预期工作,这是否也意味着它会随着其他形式的配置更改而延续并按预期运行?

  2. 我如何知道应该将哪些变量保存到我的实例状态变量中?哪些变量会在配置更改时自动保留?将所有成员变量存储在onSaveInstanceState中的实例状态中,然后在onRestoreInstanceState中重新应用它们是不错的做法?

2 个答案:

答案 0 :(得分:3)

  

例如,如果我的应用程序即使屏幕旋转也能按预期工作,这是否也意味着它会随着其他形式的配置更改而延续并按预期运行?

一般来说,是的。我想说的更多:配置更改的良好实现方法将处理所有可能的配置更改。

因此,例如,如果用户运行您的应用程序,按HOME,进入设置,更改其区域设置,然后通过概览屏幕(也称为最近任务列表)返回到您的应用程序,您的最顶层活动将进行配置更改。这里的目标是为您加载新的字符串资源和内容,以反映新选择的语言。但是,如果您在保存的实例状态Bundle中保存一些面向用户的字符串,只需在新活动中使用该字符串 - 而不是再次调用getString() - 那么您将获得旧语言的值

许多开发人员只考虑方向变化。 通常,如果您处理方向更改,则“免费”处理所有其他配置更改。但是,情况并非总是如此,这就是为什么你需要考虑它。

  

我如何知道应该将哪些变量保存到我的实例状态变量中?哪些变量会在配置更改时自动保留?

“自动保留”的主要内容是:

  • 用于启动活动的Intent

  • UI中小部件中的用户可变状态(例如,EditText中的文本)...假设您没有覆盖onSaveInstanceState()或链接到超类实现

如果您正在使用片段,则会在配置更改时保留您的片段(即,使用相同的实例)或重新创建(即,使用相同类的新实例)。

自动处理的是您活动的任何字段/数据成员。你需要决定的那些:

  • 这是我需要在配置更改中保留的东西,还是只是在新活动中重建某些内容的缓存?

  • 这是我可以合理地放入已保存的实例状态Bundle,还是大小(例如Bitmap)或数据类型(例如{{1}那不能保持这种方式?对于这些,除了保存的实例状态Socket(保留片段,保留数据等)之外,您还需要采用其他技术。

答案 1 :(得分:2)

  1. 当Android操作系统内存不足并且需要终止某些进程时,可以调用onSaveInstanceState和onRestoreInstanceState。例如,如果您的应用程序进入后台并稍后恢复,则可以调用这些方法。

  2. 活动会自动保存所有视图。例如,EditText的文本和复选框的选中状态将在配置更改后自动保存和恢复。您应使用onSaveInstanceState和onRestoreInstanceState方法手动保存Activity的所有其他数据(包括实例变量)。