关于onRestoreInstanceState
和onSaveInstanceState
,我有几个问题。
1)这些方法在哪里适合活动生命周期?我已经阅读了很多文档但是没有明确的想法,除了一个广泛的声明,即要保存活动的状态
2)onCreate
和onRestoreInstanceState
是否相互排斥?
3)被调用onRestoreInstanceState
?这是什么意思?除了当另一个活动浮动在当前活动之上的情况时,活动总是被销毁。
4)onRestoreInstanceState
似乎只能从果冻豆中的仪器中调用。这与活动生命周期不再相关吗?
答案 0 :(得分:65)
这些方法适合活动生命周期?
在您的活动即将被杀死或重新启动之前调用OnSaveInstanceState(例如内存压力或配置更改的b / c)。请注意,这与onPause不同,onPause在您的活动失去焦点时被调用(例如,您转换到另一个活动)。
通常onSaveInstanceState将在onPause之后但在onStop之前调用但不总是。例如,如果按回,则活动将被销毁(如调用finish()),并且不需要保存状态,因此不会调用onSaveInstanceState。那么为什么不在onPause中保存状态呢?仅仅因为活动失去焦点并不意味着它已被杀死。它仍在记忆中。基本上你不想在每次暂停时保存状态,而是当你暂停并且即将变得不可见时(即从前景到背景)。
那么你应该在onPause上做些什么?理想情况下,您应该释放耗尽电池的资源,例如网络连接,关闭地理位置或加速度计,暂停视频(所有这些取决于您的应用)。并在onResume中恢复这些资源,正如您可能已经猜到的那样,当您的活动获得焦点时,会调用这些资源。
onCreate和onRestoreInstanceState是否互斥?
onRestoreInstanceState是多余的,因为您可以在onCreate中轻松恢复状态。
这里说的是官方文档对onRestoreInstanceState的说法:
大多数实现只是使用onCreate(Bundle)来恢复它们的状态,但是在完成所有初始化之后或者允许子类决定是否使用默认实现时,有时很方便。 /强>
因此,为了获得最佳实践,请在onCreate中布置视图层次结构,并在onRestoreInstanceState中恢复先前的状态。如果这样做,那么将您的Activity子类化的任何人都可以选择覆盖onRestoreInstanceState来扩充或替换恢复状态逻辑。这是一个很长的路要说 onRestoreInstanceState作为模板方法。
是在活动被销毁时调用的onRestoreInstanceState吗?这是什么意思?
在1中部分回答了这个问题。是的,当系统即将破坏您的活动时,onRestore会被调用。当系统处于内存压力或用户明确关闭应用程序时(例如,从导航栏中的最近点滑动删除)或者配置更改(例如,从边缘到纵向),系统将销毁您的活动。
为什么android设计如此(与桌面应用程序不同)?因为在移动系统上,资源管理是电池寿命的严重问题。因此,您希望为应用程序生命周期提供挂钩,以便应用程序可以在关闭或失去焦点之间干净地保存和恢复其状态,同时使其完全透明用户。
onRestoreInstanceState似乎只能从果冻豆中的检测中调用。这与活动生命周期不再相关吗?
我不明白这个问题。你能改一下吗?
答案 1 :(得分:6)
1)这些方法在哪里适合活动生命周期?
来自开发人员文档。
onSaveInstanceState(Bundle outState)
在活动可能被杀死之前调用此方法,以便在将来某个时间返回时可以恢复其状态。例如,如果活动B在活动A前面启动,并且在某些时候活动A被杀死以回收资源,活动A将有机会通过此方法保存其用户界面的当前状态,以便在用户返回时对于活动A,可以通过onCreate(Bundle)或onRestoreInstanceState(Bundle)恢复用户界面的状态。
onSaveInstanceState()的默认实现负责保存与每个具有id的视图相关的数据。
如果被调用,此方法将在 onStop()之前发生。无法保证它是在 onPause()之前还是之后发生。
onRestoreInstanceState(Bundle savedInstanceState)
当从先前保存的状态重新初始化活动时,在 onStart()之后调用此方法
3)在活动被销毁时调用onRestoreInstanceState? 这是什么意思?除场景外,活动总是被销毁 当另一个活动浮动在当前。
当从 savedInstanceState 中给出的先前保存的状态重新初始化活动时,在 onStart()之后调用此方法 (包含保存在onSaveInstanceState(Bundle)中的数据的包对象)。
大多数实现只是使用onCreate(Bundle)来恢复它们的状态,但是在完成所有初始化之后有时可以方便地执行此操作,或者允许子类决定是否使用默认实现。此方法的默认实现执行先前已被onSaveInstanceState(Bundle)冻结的任何视图状态的恢复。
4)onRestoreInstanceState似乎只能从中调用 果冻豆的仪器。这与活动不再相关 生命周期?
没有。 onRestoreInstanceState自API级别1以来一直存在。它仍然是新的Jelly Bean API的一部分。
答案 2 :(得分:3)
如果您的活动被杀,例如您启动了另一项活动且系统资源不足,则需要杀死您的活动,您可以使用onSaveInstanceState保存状态,然后将其恢复。
< / LI>不一定。在onStart之前调用onCreate,但之后调用onRestoreInstanceState,因此它取决于你想要实现的目标
您的意思是onSaveInstanceState。好吧,当活动被杀死时,如上面第1点
抱歉......我不知道,我没有在Jellybean上尝试过