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

Ind*_*õue 14 android android-activity

保存包(活动A):

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("test", "value");
    super.onSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)

导航到活动B;

startActivity(new Intent(getBaseContext(), B.class));
Run Code Online (Sandbox Code Playgroud)

回到活动A:

startActivity(new Intent(getBaseContext(), A.class));
Run Code Online (Sandbox Code Playgroud)

试图在活动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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Run Code Online (Sandbox Code Playgroud)

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


Oce*_*lue 5

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

saved instance is nullfalse
Run Code Online (Sandbox Code Playgroud)

以下是Android开发者网站的摘录,您可能会感兴趣:

您可以在其中保存有关活动当前状态的信息的回调方法是onSaveInstanceState().系统在使活动易于被破坏并将其传递给Bundle对象之前调用此方法.Bundle是您可以使用putString()等方法将有关活动的状态信息存储为名称 - 值对的地方.然后,如果系统杀死你的活动的过程和用户​​返回到您的活动,该系统通过捆绑到的onCreate(),这样你就可以恢复你在的onSaveInstanceState保存的活动状态().如果没有要恢复的状态信息,则传递给onCreate()的Bundle为null.

注意:有没有保证的onSaveInstanceState()的活性被破坏之前将被调用,因为在它没有必要保存状态(当用户离开使用BACK键的活动,如情况下,由于用户明确关闭活动).如果调用该方法,则始终在onStop()之前调用它,并且可能在onPause()之前调用它.