Android:后退按钮中的onSaveInstanceState

4

我正在开发一个应用程序,在这个应用程序中,我要覆盖返回按钮。我创建了一个复选框,当点击它时,我会调用意图:

startActivityforResult();

并且将活动状态维护为:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  savedInstanceState.putBoolean("checkbox", checkbox.isChecked());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  checkbox_state = savedInstanceState.getBoolean("checkbox");
}

这段代码运行良好且状态被维护。意味着我在编辑文本中输入值,当点击复选框以获取结果时,调用新的活动。在返回第一个活动时,状态得以保持。

但是,如果从第二个活动点击设备的后退按钮,则无法维护状态。

那么,我应该怎么做才能在后退按钮上维护状态呢?我已经搜索过,但没有找到满意的解决方案。请给我建议。

2个回答

1

现在,如果我从第二个活动返回并点击设备的返回按钮,则状态不会被保留。

onSaveInstanceState() 主要用于配置更改(例如旋转屏幕)。

那么,我应该怎么做才能在按下返回按钮时保持状态?

很可能,除了您的数据模型之外,没有需要“维护”的“状态”。您的活动需要更新其数据模型:文件、数据库、首选项、ContentProvider、内存中的数据模型管理器等。


1
假设我有一个ListView,我从数据库中填充它。你认为当我从另一个活动返回到它时,我应该每次都从数据库中填充它吗?还是应该将适配器内容保存在状态中并重复使用它?只是想知道你的看法 :) - Ε Г И І И О
1
@ΕГИІИО:从数据库中填充数据是最安全的,因为自上次活动以来数据可能已经发生了变化。将其保存在状态中是最糟糕的选择。折衷方案是维护某种数据模型管理单例,缓存信息并成为所有活动访问数据模型的访问点。 - CommonsWare
它之所以是最糟糕的,是因为它浪费资源吗?如果您知道在您在这两个活动之间导航时数据不会得到更新,那么从状态中恢复它是否更具响应性呢?因为我不喜欢在导航或旋转屏幕时看到“加载中,请稍候...”的东西 :) - Ε Г И І И О
@ΕГИІИО:“它是最糟糕的,因为它浪费资源吗?”--如果你要占用大量RAM,请以更好的方式利用它。此外,它最有可能过时。“从状态还原不会更响应吗?”--是的,如果你忽略所有其他问题。“因为我讨厌在我的导航或旋转屏幕时看到'加载请等待...'的东西”--除非Traceview显示你的延迟100%在数据库I/O中,否则你有其他问题。 - CommonsWare
对于配置更改,更好的解决方案是保留 ListFragment。导航不应该导致数据库重新查询,除非之前的活动实例已经被 finish() - CommonsWare
非常感谢您宝贵的建议。我将研究ListFragment的实现。还有,我得了解一下Traceview是什么 :) 哎呀,我真是Android方面的新手!再次感谢。 - Ε Г И І И О

1
当您启动新活动时,当前活动将被隐藏,新活动将置于堆栈顶部。现在,如果您在新活动上按返回按钮,则第一个活动应以其当前状态(如果未被销毁,则调用finish())返回到它所停留的位置,即如果复选框已选中,则应保持选中状态。除非更改方向或销毁活动,否则无需保存活动状态。
您确定在onActivityResult或onResume()方法中没有做任何影响复选框状态的事情吗?我建议先注释掉这两个方法中的所有代码,看看您的复选框是否保留了状态。另外,请确保代码本身在启动新活动之前不会取消选中复选框。

我正在Activity2中输入一些数据,并通过Intent在Activity1中捕获该数据。 - Manoj Fegde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接