【问题标题】:onSaveInstanceState() not called on custom view when app is moved to background将应用程序移至后台时,未在自定义视图上调用 onSaveInstanceState()
【发布时间】:2014-10-06 10:19:32
【问题描述】:

在我正在开发的应用程序中,我有一个自定义视图,当屏幕配置更改或应用程序移至后台时,我需要在其中保存实例状态。我实现了onSaveInstanceState()onRestoreInstanceState(Parcelable savedInstanceState),并且在屏幕配置更改的情况下,实例状态被完美地保存和恢复。但是,当应用程序移到后台时,onSaveInstanceState() 不会被调用。这意味着当活动再次被带到前台时,我没有保存的实例状态。那么我的问题是:

为什么应用移到后台时不调用onSaveInstanceState(),应用移到后台时是否可以让我的视图调用onSaveInstanceState()

【问题讨论】:

  • 这是一种奇怪的行为,你的自定义视图有 id 吗?我对此进行了测试,我的观点确实得到了 onSaveInstanceState 调用。 “移至背景”是指使用主页按钮吗?
  • 我的视图确实有一个 id。实际上,使用主页按钮时不会出现问题。当您按下后退按钮离开活动时会发生这种情况。
  • 当您按下返回按钮离开活动时会发生。 - 使用返回意味着您将永远离开应用程序(因此应用程序的状态不会存储),而不是您将应用程序发送到后台。您需要一个更持久的存储选项(如首选项、数据库等)来保存使用回来的数据。

标签: android view instance state parcelable


【解决方案1】:

当您按下后退按钮离开活动时会发生这种情况。 – 零

当使用返回按钮离开应用程序时,Android 系统不会调用 onSaveInstanceState 方法,这是预期的系统行为。后退按钮用于停止您的应用(阅读:活动)。

后退按钮完成您的 Activity,无需保存应用状态。但是如果有理由这样做,那么您应该覆盖 onStop 方法并将数据保存到那里的文件系统中。

来源:

http://developer.android.com/training/basics/activity-lifecycle/recreating.html (推荐阅读)

在某些情况下,您的活动因以下原因而被破坏 正常的应用行为,例如当用户按下返回按钮或 您的 Activity 通过调用 finish() 发出自己的毁灭信号。

【讨论】:

  • 我以为会是这样。我想我将不得不考虑在我的情况下什么是合乎逻辑的应用程序行为。感谢您的好答案和链接! :)
【解决方案2】:

据我所知,当应用程序进入后台时,在 Activity 上它会调用 onPause() 方法。因此,请尝试将您的代码移至 onPause() 方法。

【讨论】:

  • 是的,它确实在活动中调用了 onPause(),但我需要在我的自定义视图中恢复实例状态,并且视图没有 onPause() 方法。我可以尝试将自定义视图的所有实例变量存储在活动的 onPause() 方法中,但这看起来确实很庞大。我认为在适当的级别实现实例状态恢复始终是最佳实践,因此在这种情况下是视图级别:)
  • 这个答案是错误的,你应该在onSaveInstanceState方法而不是onPause中保存任何应用程序状态。其次视图状态是Android系统自动保存的,所以不能使用Activity中的onPause方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多