Android 中的配置更改以及实例状态中要保存的变量
Configuration changes in Android and which variables to save in the instance state
我正在尝试更好地理解配置更改和实例状态。
现在我知道像旋转屏幕这样的动作被认为是配置更改,它会破坏并重新创建 activity。有时这意味着如果您不小心,您可能会丢失值(例如,如果您有一个数字列表,当您旋转屏幕时,这些数字会重置为全 0)。
通常有一些方法可以使用,例如 onSaveInstanceState
,或 onRestoreInstanceState
,或者在 onCreate
方法中检查 savedInstanceState
是否为 null 等 - - 用于保存和恢复值,这样您就不会在发生变化时丢失任何东西。
我的问题:
是否需要考虑多种类型的配置更改?例如,如果我的应用程序即使在屏幕旋转的情况下也能按预期工作,这是否也意味着它会继续并按预期方式进行其他形式的配置更改?
我如何知道应该将哪些变量保存到我的实例状态变量中,以及在发生配置更改时自动保留哪些变量?将所有成员变量存储在 onSaveInstanceState
中的实例状态然后在 onRestoreInstanceState
中重新应用它们是一种好习惯吗?
onSaveInstanceState 和 onRestoreInstanceState 可以在 Android OS 内存 运行 不足并且需要终止某些进程时调用。比如你的app进入后台后又恢复了,就可以调用这些方法。
所有视图都由 Activity 自动保存。例如,EditText 的文本和复选框的选中状态将在配置更改后自动保存和恢复。 Activity 的所有其他数据(包括实例变量)应由您使用 onSaveInstanceState 和 onRestoreInstanceState 方法手动保存。
For example if I get my app to work as expected even with screen rotations, does this also imply that it will carry over and act as expected with other forms of configuration changes?
一般来说,是的。我更愿意将其表述为:实施良好的配置更改方法将处理所有可能的配置更改。
因此,例如,如果用户运行您的应用程序,按主页,进入设置,更改他们的语言环境,然后通过概览屏幕 returns 进入您的应用程序(a.k.a,最近-tasks 列表),您最上面的 activity 将进行配置更改。这里的目标是让您加载新的字符串资源和内容,以反映新选择的语言。但是,如果您在保存的实例状态 Bundle
中保存一些面向用户的字符串,并在新的 activity 中简单地使用该字符串——而不是再次调用 getString()
——那么您将拥有一个值来自旧语言。
很多开发者只想到方向改变。 通常,如果您处理方向更改,则处理所有其他配置更改"for free"。但是,情况并非总是如此,这就是为什么您需要仔细考虑。
How do I know which variables I should be saving into my instance state variable and which will be auto-preserved when a configuration change takes place?
"auto-preserved" 的主要内容是:
用于启动activity
的Intent
您 UI 中的小部件中的用户可变状态(例如,EditText
中的文本)...假设您不覆盖 onSaveInstanceState()
或链接到 superclass 实现
如果您正在使用片段,您的片段将在配置更改时保留(即,使用相同的实例)或重新创建(即,使用相同 class 的新实例)。
不会 自动处理的是 activity 的任何 fields/data 成员。那些你需要决定的:
这是我需要在配置更改时保留的东西,还是它只是一个缓存,用于在新 activity 中重建某些东西?
这是我可以合理地放入保存的实例状态的东西吗Bundle
,或者它的大小(例如,Bitmap
)或数据类型(例如, Socket
) 那样不能坚持下去?对于这些,除了保存实例状态 Bundle
(保留片段、持久化数据等)之外,您还需要追求其他技术。
我正在尝试更好地理解配置更改和实例状态。
现在我知道像旋转屏幕这样的动作被认为是配置更改,它会破坏并重新创建 activity。有时这意味着如果您不小心,您可能会丢失值(例如,如果您有一个数字列表,当您旋转屏幕时,这些数字会重置为全 0)。
通常有一些方法可以使用,例如 onSaveInstanceState
,或 onRestoreInstanceState
,或者在 onCreate
方法中检查 savedInstanceState
是否为 null 等 - - 用于保存和恢复值,这样您就不会在发生变化时丢失任何东西。
我的问题:
是否需要考虑多种类型的配置更改?例如,如果我的应用程序即使在屏幕旋转的情况下也能按预期工作,这是否也意味着它会继续并按预期方式进行其他形式的配置更改?
我如何知道应该将哪些变量保存到我的实例状态变量中,以及在发生配置更改时自动保留哪些变量?将所有成员变量存储在
onSaveInstanceState
中的实例状态然后在onRestoreInstanceState
中重新应用它们是一种好习惯吗?
onSaveInstanceState 和 onRestoreInstanceState 可以在 Android OS 内存 运行 不足并且需要终止某些进程时调用。比如你的app进入后台后又恢复了,就可以调用这些方法。
所有视图都由 Activity 自动保存。例如,EditText 的文本和复选框的选中状态将在配置更改后自动保存和恢复。 Activity 的所有其他数据(包括实例变量)应由您使用 onSaveInstanceState 和 onRestoreInstanceState 方法手动保存。
For example if I get my app to work as expected even with screen rotations, does this also imply that it will carry over and act as expected with other forms of configuration changes?
一般来说,是的。我更愿意将其表述为:实施良好的配置更改方法将处理所有可能的配置更改。
因此,例如,如果用户运行您的应用程序,按主页,进入设置,更改他们的语言环境,然后通过概览屏幕 returns 进入您的应用程序(a.k.a,最近-tasks 列表),您最上面的 activity 将进行配置更改。这里的目标是让您加载新的字符串资源和内容,以反映新选择的语言。但是,如果您在保存的实例状态 Bundle
中保存一些面向用户的字符串,并在新的 activity 中简单地使用该字符串——而不是再次调用 getString()
——那么您将拥有一个值来自旧语言。
很多开发者只想到方向改变。 通常,如果您处理方向更改,则处理所有其他配置更改"for free"。但是,情况并非总是如此,这就是为什么您需要仔细考虑。
How do I know which variables I should be saving into my instance state variable and which will be auto-preserved when a configuration change takes place?
"auto-preserved" 的主要内容是:
用于启动activity
的您 UI 中的小部件中的用户可变状态(例如,
EditText
中的文本)...假设您不覆盖onSaveInstanceState()
或链接到 superclass 实现
Intent
如果您正在使用片段,您的片段将在配置更改时保留(即,使用相同的实例)或重新创建(即,使用相同 class 的新实例)。
不会 自动处理的是 activity 的任何 fields/data 成员。那些你需要决定的:
这是我需要在配置更改时保留的东西,还是它只是一个缓存,用于在新 activity 中重建某些东西?
这是我可以合理地放入保存的实例状态的东西吗
Bundle
,或者它的大小(例如,Bitmap
)或数据类型(例如,Socket
) 那样不能坚持下去?对于这些,除了保存实例状态Bundle
(保留片段、持久化数据等)之外,您还需要追求其他技术。