android savedInstanceState始终为null

时间:2014-03-17 11:44:06

标签: android

我有以下情况:

  • 活动A开始活动B
  • 活动A调用onPauseonSaveInstanceStateonStop方法。
  • 在活动B上按下" UP按钮"在行动栏上
  • 活动第一个被破坏(调用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);
}

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

5 个答案:

答案 0 :(得分:8)

在向上导航时重新创建顶级活动。要保留活动A的状态,您可以

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

B)从活动B导航时,向FLAG_ACTIVITY_CLEAR_TOP意图添加up标志:

@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);
}

这是documented behavior:

  

同样,如果您向上导航到当前堆栈上的活动,则行为由父活动的启动模式决定。如果父活动具有启动模式singleTop(或up intent包含FLAG_ACTIVITY_CLEAR_TOP),则父项将被置于堆栈顶部,并保留其状态。导航意图由父活动的onNewIntent()方法接收。如果父活动具有启动模式标准(并且向上意图不包含FLAG_ACTIVITY_CLEAR_TOP),则当前活动及其父活动都从堆栈弹出,并且创建父活动的新实例以接收导航意图。

答案 1 :(得分:7)

按操作栏上的Up实际上与按下back按钮不同。

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

答案 2 :(得分:0)

你应该把

super.onSaveInstanceState(savedInstanceState);

在保存自己的数据代码之前。

答案 3 :(得分:0)

如上所述in the Documentation

  

protected void onSaveInstanceState(Bundle outState):

     

不要将此方法与活动生命周期回调混淆,例如onPause(),当活动被放置在后台或去往销毁的路径时,或者在销毁之前调用的onStop()时,它会被调用。调用onPause()和onStop()时的一个示例,而不是此方法是当用户从活动B导航回活动A时:不需要在B上调用onSaveInstanceState(Bundle),因为该特定实例永远不会被恢复,所以系统避免调用它。调用onPause()而不是onSaveInstanceState(Bundle)时的一个例子是在活动A前面启动活动B的时候:如果活动A没有被杀,系统可能会避免在活动A上调用onSaveInstanceState(Bundle) B的生命周期,因为A的用户界面状态将保持不变。

如果您使用onStop()设备进行方向更改,则会调用onSavedInstanceState(...)。

答案 4 :(得分:0)

我必须添加 input_shape=(224,224,3) x_in = Input(input_shape) x = ZeroPadding2D(padding=(1,0), data_format='channels_last')(x_in) x = Flatten()(x) x = Dense(4, activation='softmax')(x) test_model = Model(inputs=x_in, outputs=x) test_model.summary() 进入清单文件的活动部分以使其正常工作。然后我只需要

android:launchMode="singleTop"