【问题标题】:onSaveInstanceState() and onPause() call sequenceonSaveInstanceState() 和 onPause() 调用顺序
【发布时间】:2012-02-05 18:18:39
【问题描述】:

The documentation on onSaveInstanceState() 状态:

如果调用该方法,它总是在 onStop() 之前调用,并且可能在 onPause() 之前调用。

但是,我始终从日志消息中注意到,onPause() 总是在onSaveInstanceState() 之前调用。我已经在这两种方法中放入了日志消息。请帮助我了解在什么情况下onSaveInstanceState()onPause() 之前被调用。

环境:Android v4.0 (API 14) + Eclipse v3.7.1 - Indigo。

【问题讨论】:

  • 请注意,仅寻求对序列的澄清。关于保存在哪里,有很多好帖子。

标签: android onpause


【解决方案1】:

请帮助我了解在什么情况下 onSaveInstanceState() 在 onPause() 之前调用

HONEYCOMB 之前的平台和其他平台(从 HONEYCOMB 以后)的 Activity 生命周期存在差异:

API级别>= 11:当onPause()被调用时,进程处于安全状态,不能被杀死。

API 级别 :当onPause() 被调用时,承载 Activity 的进程变为可终止的。这意味着系统可以终止包含活动的进程,而无需执行任何其他代码行。因此,如果发生这种情况,onSaveInstanceState() 可能永远不会被调用。为了避免这种情况,系统应该在onPause()之前调用onSaveInstanceState(),否则您将无法保存用户状态。

【讨论】:

  • 推测系统应该调用这两个的顺序是无关紧要的:重要的一点是文档不保证这两个调用发生在哪个顺序。然而,这answer(尽管它没有回答问题)在指出 11 版本之前和之后版本之间的差异方面有些有用。
【解决方案2】:

onSaveInstanceState() 很好,但只有保证回调是 onPause(),当您的活动失去焦点时调用。所以,把你的状态保存在那里

【讨论】:

  • 请注意,onSaveInstanceState() 并不总是在活动失去焦点时调用。更多信息请参考以上帖子中的链接和“保存活动状态”子主题@developer.android.com/guide/topics/fundamentals/activities.html
  • 为了保存Bundle状态,你应该使用onSaveInstanceState。虽然确实总是会调用 onPause,但对于典型的捆绑状态,每次暂停时都保存它是浪费的。如果可以在终止 Activity 之前保存捆绑状态,则将调用 onSaveInstanceState 并且该调用将在 onStop 之前发生。当然,如果您确实需要在每次 Activity 暂停时执行某些操作,那么 onPause 就是合适的地方。
  • 永远不要在 onPause 中保存状态。
  • 恕我直言,这里讨论的“状态”可能有两种不同的含义。 onSaveInstanceState 作为一种在应用程序临时暂停期间保存某些 UI 状态的高性能方式非常方便。不保证它会被调用。 (请参阅 android dev“活动”页面。)它只是为了方便保留用户所看到的 UI 状态。不要依赖它做任何重要的事情。
【解决方案3】:

你可以阅读here

简而言之,您永远无法知道 onSaveInstanceState 的运行时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多