onCreate和onRestoreInstanceState是互斥的吗?

use*_*504 44 android

关于onRestoreInstanceState和,我有几个问题onSaveInstanceState.

1)这些方法在哪里适合活动生命周期?我已经阅读了很多文档但是没有明确的想法,除了一个广泛的声明,即要保存活动的状态

2)是否onCreateonRestoreInstanceState相互排斥?

3)onRestoreInstanceState当活动被破坏时被调用?这是什么意思?除了当另一个活动浮动在当前之上的情况之外,活动总是被销毁.

4)onRestoreInstanceState似乎只能从果冻豆中的仪器中调用.这与活动生命周期不再相关吗?

num*_*ati 67

这些方法在哪里适合活动生命周期?

在您的活动即将被杀死或重新启动之前调用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似乎只能从果冻豆中的检测中调用.这与活动生命周期不再相关吗?

我不明白这个问题.你能改一下吗?

  • 文档说"请注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久数据很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下调用. (5认同)
  • @Joseph82文档中唯一令人烦恼的是,没有传递bundle对象savedInstanceState,强制app使用其他方法存储数据(sharedPrefs,sqliteDB) (2认同)

Pur*_*war 6

1)这些方法在哪里适合活动生命周期?

来自开发人员文档.

onSaveInstanceState(Bundle outState)

在活动可能被杀死之前调用此方法,以便在将来某个时间返回时可以恢复其状态.例如,如果活动B在活动A前面启动,并且在某些时候活动A被杀死以回收资源,活动A将有机会通过此方法保存其用户界面的当前状态,以便在用户返回时对于活动A,可以通过onCreate(Bundle)或onRestoreInstanceState(Bundle)恢复用户界面的状态.

onSaveInstanceState()的默认实现负责保存与每个具有id的视图相关的数据.

如果调用,此方法将在onStop()之前发生.无法保证它是在onPause()之前还是之后发生.

onRestoreInstanceState(Bundle savedInstanceState)

当从先前保存的状态重新初始化活动时,在onStart()之后调用此方法

3)在活动被销毁时调用onRestoreInstanceState?这是什么意思?除了当另一个活动浮动在当前之上的情况之外,活动总是被销毁.

当从以前保存的状态重新初始化活动时,在onStart()之后调用此方法,此处在savedInstanceState (包含保存在onSaveInstanceState(Bundle)中的数据的包对象)中给出).

大多数实现只是使用onCreate(Bundle)来恢复它们的状态,但是在完成所有初始化之后有时可以方便地执行此操作,或者允许子类决定是否使用默认实现.此方法的默认实现执行先前已被onSaveInstanceState(Bundle)冻结的任何视图状态的恢复.

4)onRestoreInstanceState似乎只能从果冻豆中的检测中调用.这与活动生命周期不再相关吗?

自从API级别1以来,onRestoreInstanceState一直存在.它仍然是新的Jelly Bean API的一部分.


alb*_*ran 3

  1. 如果您的 Activity 被终止,例如您启动了另一个 Activity,并且系统终止您的 Activity 所需的资源不足,您可以使用 onSaveInstanceState 保存状态然后恢复它。

  2. 不必要。onCreate 在 onStart 之前调用,但 onRestoreInstanceState 在 onStart 之后调用,所以这取决于您想要实现的目标

  3. 你的意思是onSaveInstanceState。嗯,当 Activity 被杀死时,它会被调用,如上面第 1 点所述

  4. 抱歉...我不知道,我还没在 Jellybean 上尝试过