【问题标题】:Android: Saving a state during Android lifecycleAndroid:在 Android 生命周期中保存状态
【发布时间】:2011-06-17 07:43:32
【问题描述】:

我指的是http://developer.android.com/reference/android/app/Activity.html

我有一个可以被用户“中断”的活动,例如用户打开菜单以调用首选项屏幕。当调用首选项屏幕onSaveInstanceState(Bundle) 时,我可以保存我的数据。到目前为止很好。但是在按下后退按钮时,onRestoreInstanceState(Bundle savedInstanceState)NOT 调用。

那么我怎样才能保存我的状态呢?调用新活动时我必须这样做吗?但是怎么做呢?
我能想到的唯一方法是通过将状态传递给新活动来保存状态,对保存的数据不做任何事情,将其返回到第一个活动并恢复onActivitResult 中的状态。但这意味着我必须来回传递数据才能恢复状态。似乎不是一个好的解决方案。

【问题讨论】:

    标签: android android-activity state


    【解决方案1】:

    可能是一个错误的答案,但您确定需要调用 onRestoreInstanceState 吗?

    bundle 和 onSaveInstanceState / onCreate 与 bundle / onRestoreInstanceState 的重点是保存历史堆栈中的活动的瞬态数据,以防必须终止活动以回收一些内存。如果它被杀死,则可以通过onCreate / onRestonreInstanceState 恢复活动,就好像它从未被杀死一样。 但是,如果 Activity 没有被杀死,则可能不需要恢复其瞬态数据 - 大概是原样。

    Android 文档小心地指出 onSaveInstanceStae / onRestoreInstanceStatenot lifecycle methods,因此不能保证在生命周期状态转换期间被调用。如果您需要挂钩某些生命周期转换,请查看lifecycle hook methods。例如,onResume 在 Activity 成为前台 Activity 时调用,onPause 在不再是前台 Activity 时调用。

    【讨论】:

    • 见上面的评论。我想使用捆绑包,实现我想要避免的手动保存数据。第一个活动是列表视图,从首选项活动返回后,列表视图为空。 listview有什么特别的地方,为什么切换activity后是空的?
    • 我刚刚测试了一些其他应用程序,从首选项屏幕返回后,所有输入仍然存在,这可能是什么原因?
    • @AndyAndroid - 我使用了我的 1 个应用程序并添加了 onStart()onRestart() 等方法来记录生命周期(onCreate() 是我之前拥有的唯一生命周期方法)。我看到我的活动在称为onSaveInstanceState 的各种生命周期方法和时间中翻转。但是,我无法让应用程序调用 onRestoreInstanceState() 并且每次我返回我的列表时都很好,即活动没有被杀死并保持状态。我设置了开发工具来破坏每个活动,它也开始调用onRestoreInstanceState
    【解决方案2】:

    您的 ListView 在从 Pref 屏幕返回后不应被清除,除非 Activity 在 Pref 屏幕显示时被销毁(在这种情况下,应该使用保存的包调用 onCreate)。

    savedInstanceState 仅在 Activity 已被销毁并需要重新创建时使用。在这种情况下,您的 ListActivity 似乎没有被销毁。

    您是否在某处手动清除您的 ListView?

    【讨论】:

      【解决方案3】:

      看看Application Fundamentals,特别是这部分:

      onPause() 和前面讨论的其他方法不同,onSaveInstanceState()onRestoreInstanceState() 不是生命周期方法。他们并不总是被调用。例如,Android 在 Activity 容易被系统销毁之前调用onSaveInstanceState(),但在实例实际被用户操作(例如按 BACK 键)销毁时不会打扰调用它。在这种情况下,用户不会期望返回活动,因此没有理由保存其状态。

      因为onSaveInstanceState() 并不总是被调用,所以你应该只使用它来记录活动的瞬态状态,而不是存储持久数据。为此请改用onPause()

      基本上,任何持久性数据都应该在您的onPause() 方法中写出并在onResume() 中读回。查看Data Storage 文章了解保存数据的方法。

      【讨论】:

      • 使用我想避免的数据存储。 onSaveInstanceState 和 onRestore 使用这个包,非常方便。所以我必须手动完成所有工作......
      猜你喜欢
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2012-12-03
      • 2013-07-27
      • 2011-12-22
      相关资源
      最近更新 更多