onSaveInstanceState没有保存我的值(onCreate输入Bundle总是为null)

时间:2011-09-06 13:34:17

标签: android android-activity

保存捆绑(活动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中加载我写入bundle的值:

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

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

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

返回主要活动时,永远不会触发

onRestoreInstanceState

6 个答案:

答案 0 :(得分:5)

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

saved instance is nullfalse

以下是Android Developer Site的摘录,您可能会感兴趣:

  

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

     

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

答案 1 :(得分:4)

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

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

  1. 检查您是否在所有super.onSaveInstanceState(outState);功能中致电onSaveInstanceState
  2. 检查您的AndroidManifest.xml中是否有android:configChanges

答案 5 :(得分:0)

除非您的应用程序在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