【问题标题】:Where should I restore my android state我应该在哪里恢复我的android状态
【发布时间】:2011-07-31 05:04:57
【问题描述】:

来自 Android 活动 API: http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)

它说“可以在 onCreate(Bundle) 或 onRestoreInstanceState(Bundle) 中恢复状态”。我的问题是我应该在哪里恢复我的状态?为什么我可以在任何一个地方都这样做?

谢谢。

【问题讨论】:

  • 两者都可以,以更适合您的程序流程为准。

标签: android


【解决方案1】:

我将在这里假设,因为我从未使用过 onSaveInstanceState,但从文档中,您应该使用后者。 onCreate 在 Activity 启动时调用,而 onRestoreInstanceState 在 onStart() 之后调用,这发生在 onCreate() 或 onRestart() 之后。

http://developer.android.com/reference/android/app/Activity.html

protected void onCreate (Bundle savedInstanceState) 自:API 级别 1

在活动开始时调用。 这是大多数初始化的地方 应该去:调用 setContentView(int) 膨胀活动的用户界面,使用 findViewById(int) 以编程方式 与 UI 中的小部件交互, 调用 managedQuery(android.net.Uri, 字符串[]、字符串、字符串[]、字符串)到 检索游标以获取数据 显示等。

受保护的无效 onRestoreInstanceState (Bundle savedInstanceState) 自:API 1级

这个方法在onStart()之后调用 活动进行时 从以前保存的重新初始化 状态,在这里给出 保存的实例状态。最多 实现将简单地使用 onCreate(Bundle) 恢复他们的 状态,但有时很方便 毕竟在这里做 初始化已经完成或 允许子类决定是否 使用您的默认实现。这 此方法的默认实现 执行任何视图状态的恢复 之前被冻结的 onSaveInstanceState(Bundle)。

protected void onStart() 自:API 1级

在 onCreate(Bundle) 之后调用 — 或 onRestart() 之后当活动 已经停止,但现在又来了 正在向用户展示。它会 后跟 onResume()。

【讨论】:

    【解决方案2】:

    考虑在 onCreate 中恢复状态,因为空包的存在是 onCreate 中其他有用操作的有用标志。

    编辑:查看我的代码,在 onCreate 中读取包的另一个原因是我更新了 onCreate 中的小部件。所以需要在 onCreate 中知道状态。状态是来自包还是来自首选项或来自调用意图并不重要。所以模式看起来像

    getMyState(); // 可能来自 bundle 或 lastNonConfigurationInstance 或 prefs 或调用意图

    someWidget.setYourStateFromInfoInGetState

    【讨论】:

    • 但是这种方法不会在活动重新启动时阻止恢复吗? (即,将手机旋转 90 度时)?
    • @Aleadam 一个有趣的练习是在每个状态方法中写入 Log.d。如果您这样做,则会调用以下方法(不包括) onOrientationChange:onSaveInstanceState、onPause、onStop、onDestroy 和 onCreate。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多