【问题标题】:onSaveInstanceState is not saving my values ( onCreate input Bundle is always null )onSaveInstanceState 没有保存我的值( onCreate 输入 Bundle 始终为空)
【发布时间】:2011-09-06 13:34:17
【问题描述】:

保存包(活动 A):

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("test", "value");
    super.onSaveInstanceState(outState);
}

导航到活动 B;

startActivity(new Intent(getBaseContext(), B.class));

回到活动 A:

startActivity(new Intent(getBaseContext(), A.class));

尝试加载我在活动 A 中绑定的值:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

Log.d("MY", "saved instance is null"+ Boolean.toString(savedInstanceState == null));
}

总是返回 savedInstanceState = null。我在这里缺少什么?

onRestoreInstanceState 在我返回主活动时永远不会触发

【问题讨论】:

  • -1 ?为了什么?已经尝试了一切,并且通过 android API 一切都应该工作,但它不是。
  • 你解决了吗?我有完全相同的问题。
  • 我遇到了同样的问题,我在这里没有看到答案。

标签: android android-activity


【解决方案1】:

我通过以下方式解决了这个问题:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

从后台重新启动具有已保存状态的旧意图时。如果没有这个标志,我认为当 startActivity 被调用时,它会创建一个新的 Activity 实例,而不是从堆栈中获取旧的实例。

【讨论】:

  • 但是对我来说 savedInstance 总是为空。
【解决方案2】:

您的代码没有问题。尝试在活动 A 上旋转设备。您将在日志中看到以下内容,这意味着您的 onSaveInstanceState() 工作正常:

saved instance is nullfalse

以下是Android Developer Site 的摘录,您可能会觉得有趣:

用于保存有关活动当前状态信息的回调方法是 onSaveInstanceState()。系统在使活动容易被破坏之前调用此方法,并将其传递给 Bundle 对象。在 Bundle 中,您可以使用 putString() 等方法将有关活动的状态信息存储为名称-值对。然后,如果系统终止了您的 Activity 进程并且用户导航回您的 Activity,系统会将 Bundle 传递给 onCreate(),以便您可以恢复在 onSaveInstanceState() 期间保存的 Activity 状态。如果没有要恢复的状态信息,那么传递给 onCreate() 的 Bundle 为空。

注意:不能保证 onSaveInstanceState() 会在您的活动被销毁之前被调用,因为在某些情况下不需要保存状态(例如当用户使用 BACK 键离开您的活动时,因为用户明确关闭活动)。如果调用该方法,它总是在 onStop() 之前调用,并且可能在 onPause() 之前调用。

【讨论】:

  • ... Then, if the system kills your activity's process and the user navigates back to your activity, the system passes the Bundle to onCreate() ... - 当用户导航到另一个活动时,我的活动不是被杀死了吗?
  • 尝试登录 onDestroy() :-)。不,在这种情况下,它不是。每次运行 startActivity(...A.class) 行时,都会创建一个新的 Activity 实例。
  • 是的,你是对的。参考:developer.android.com/images/activity_lifecycle.png 总结:当用户导航到另一个活动时活动停止。 Activity 不会被销毁,直到系统这么说(例如内存不足)。
  • 您可以更改操作系统行为,以便活动在不再出现在屏幕上时立即被销毁。这对于调试目的很有用。看到这个答案:stackoverflow.com/a/8621269/483708
【解决方案3】:

在向其添加内容之前,您必须执行 super.onSaveInstanceState(outState)。

【讨论】:

【解决方案4】:

如果导航到另一个 Activity 并返回,最好的方法是在 onPause() 方法中将其保存到 SharedPreference,该方法在加载新 Activity 时会执行。在另一个Activity 上,可以通过访问共享首选项来访问onCreate() 中的值。

【讨论】:

    【解决方案5】:

    如果您想在设备旋转时保留片段的状态,并且想知道永远不会调用 onSaveInstanceState

    1. 检查您是否在所有onSaveInstanceState 函数中调用super.onSaveInstanceState(outState);
    2. 检查您的 AndroidManifest.xml 中是否没有 android:configChanges

    【讨论】:

      【解决方案6】:

      除非您的应用在 Lollipop (API21) 或更高版本的 Android 上运行,否则您的

      public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState);
      

      不会被调用,因为它在 21 之前的平台版本中根本不存在。要支持 API 21 之前的设备,您必须覆盖以下方法,而不是上述方法:

      public void onSaveInstanceState (Bundle outState);
      

      这也适用于 API 21+,因此您当然不需要重写这两种方法(除非您知道需要处理新提供的 PersistableBundle)。

      (复制,因为它对我有用) 来源:onSaveInstanceState is not getting called after screen rotation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        相关资源
        最近更新 更多