savedInstanceState始终为null

时间:2013-01-30 13:18:43

标签: java android

所以我在我的OnsavedInstanceState

中有这个代码
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    String [] a={"haha"};
    savedInstanceState.putStringArray("MyStringarray", a);
    Toast.makeText(context, "Saved array", Toast.LENGTH_SHORT).show();
}

我在onCreate中有这段代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState==null){
        Toast.makeText(this, "not there", Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(this, "is there", Toast.LENGTH_SHORT).show();
    }
}

为什么吐司总是说不在那里?我打开应用程序然后切换到另一个应用程序,它显示了吐司保存的数组,但当我重新打开应用程序时,它说不存在,即使捆绑包应该有包含“哈哈”的字符串数组。

非常感谢!

3 个答案:

答案 0 :(得分:4)

onSaveInstanceState()中,您正在修改savedInstanceState而不保存此修改后的对象。如果super复制了Bundle,则不会保存此修改。

请尝试在方法结束时调用super.onSaveInstanceState(savedInstanceState);

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    String [] a={"haha"};
    savedInstanceState.putStringArray("MyStringarray", a);
    super.onSaveInstanceState(savedInstanceState);
    Toast.makeText(context, "Saved array", Toast.LENGTH_SHORT).show();
}

答案 1 :(得分:1)

问题可能在于如何在清单中定义您的活动。例如,如果你的活动有设置android:clearTaskOnLaunch =“true”我认为你不会收到保存的包。有关各种活动设置的详细信息,请参阅http://developer.android.com/guide/topics/manifest/activity-element.html

您还可以检查其他被覆盖的方法。例如,在你覆盖一个并做一些奇怪的事情时,你可能会搞乱活动堆栈。你是否在代码中的任何地方调用了finish(),如果是,请将其删除,看看会发生什么。

答案 2 :(得分:0)

请勿将此方法与活动生命周期回调混淆,例如 onPause(),当活动被放置在背景中或在前往在销毁之前调用的销毁 onStop()。调用 onPause()和onStop()时的一个示例而不是此方法是当用户从活动B导航回活动A时:无需调用onSaveInstanceState(Bundle) 在B上,因为该特定实例永远不会被恢复,因此系统会避免调用它。调用 onPause()而不是onSaveInstanceState(Bundle)时的示例是在活动A前面启动活动B时:系统可能避免调用onSaveInstanceState(如果在B的生命周期内未被杀死,则活动A上的 >,因为A的用户界面的状态将保持不变。

相关问题