android savedInstanceState始终为空

android savedInstanceState始终为空,android,Android,我有以下情况: 活动A启动活动B 活动A调用onPause、onSaveInstanceState和onStop方法 在活动B中,我按下操作栏上的“向上按钮” 活动A首先被销毁(调用onDestroy),然后重新创建。(这种情况似乎就是这样发生的。我没有用这种方式实现,只是用Android的方式做事而已。) 在onCreate方法期间,变量savedInstanceState始终为空 我知道这里也有类似的话题,但似乎没有一个能回答我的问题。所有回调方法中都有日志行,因此我确信save方法已执

我有以下情况:

  • 活动A启动活动B
  • 活动A调用
    onPause
    onSaveInstanceState
    onStop
    方法
  • 在活动B中,我按下操作栏上的“向上按钮”
  • 活动A首先被销毁(调用onDestroy),然后重新创建。(这种情况似乎就是这样发生的。我没有用这种方式实现,只是用Android的方式做事而已。)
  • onCreate
    方法期间,变量
    savedInstanceState
    始终为空
我知道这里也有类似的话题,但似乎没有一个能回答我的问题。所有回调方法中都有日志行,因此我确信save方法已执行,destory方法已执行。但是为什么从来没有一个
savedInstanceState
对象呢

我的保存方法:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putSerializable(OpenSessionsActivity.SESSION, session);
    System.out.println("saving ..");
    super.onSaveInstanceState(savedInstanceState);
}

还有其他代码需要我包含吗?

按操作栏上的
向上
实际上与按
后退
按钮不同

如果希望它们的行为相同,可以在活动B中使用以下代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent up = NavUtils.getParentActivityIntent(this);
            up.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            NavUtils.navigateUpTo(this, up);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
你应该把

super.onSaveInstanceState(savedInstanceState);
在保存您自己的数据的代码之前。

如前所述:

SaveInstanceState上受保护的空(包超出状态):

不要将此方法与活动生命周期回调混淆,例如onPause(),它总是在活动置于后台或在其销毁过程中调用,或者onStop()在销毁之前调用。调用onPause()和onStop()而不是此方法的一个示例是当用户从活动B导航回活动a时:不需要在B上调用onSaveInstanceState(Bundle),因为该特定实例永远不会被还原,因此系统避免调用它。调用onPause()而不是onSaveInstanceState(Bundle)时的一个示例是在活动A之前启动活动B:如果在活动A的生命周期内未停止调用onSaveInstanceState(Bundle),系统可能会避免对活动A调用onSaveInstanceState(Bundle),因为A的用户界面状态将保持不变。


如果使用设备更改方向,将调用onStop()和onSavedInstanceState(…)。

向上导航时,将重新创建top活动。要保留活动A的状态,可以

A) 将活动A的启动模式设置为“singleTop”(将android:launchMode=“singleTop”添加到AndroidManifed.xml)

B) 从活动B导航时,将
FLAG\u ACTIVITY\u CLEAR\u TOP
标志添加到
up
意图:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent up = NavUtils.getParentActivityIntent(this);
            up.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            NavUtils.navigateUpTo(this, up);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
这是一个

类似地,如果向上导航到当前堆栈上的某个活动,则该行为由父活动的启动模式决定。如果父活动具有启动模式singleTop(或up intent包含FLAG_activity_CLEAR_TOP),则将父活动带到堆栈顶部,并保留其状态。父活动的onNewIntent()方法接收导航意图。如果父活动具有启动模式标准(且up intent不包含FLAG_activity_CLEAR_TOP),则当前活动及其父活动都将弹出堆栈,并创建父活动的新实例以接收导航意图

我必须补充一点
android:launchMode=“singleTop”
进入我清单文件的“活动”部分以使其工作。然后我只需要


NavUtils.navigateUpFromSameTask(getActivity())

我对按钮的工作方式很满意。我只是不想失去活动A的状态。我的意思是,按下UP键不会导致android恢复您的活动。它创建了一个新的。试试我发布的代码,看看它是否有效。那么使用内置函数总是会重新创建?也许这不完全是我想要的。。你的代码可以工作。我现在就用它,因为它确实省去了我保存活动状态的麻烦。谢谢,这很烦人。我现在几乎一直在使用这段代码。这会得到同样的结果。我知道文档。这就是为什么我把日志线放在那里。我确信onSavedInstanceState被称为。如果使用onPause()仍然是一个更好的解决方案,那么您能否举例说明如何保存状态?由于没有Bundle对象..可能会调用onRestoreInstanceState(Bundle savedInstanceState)?如果你有全局状态,你可以使用SharedReferences。这就是我搜索了几个小时的答案!