1

所以我的 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();
    }
}

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

非常感谢!

4

3 回答 3

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();
}
于 2013-01-30T13:27:16.020 回答
1

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

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

于 2013-01-30T13:31:29.440 回答
0

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

于 2013-01-30T13:40:14.573 回答