1

我正在开发一个 Android 应用程序,在该应用程序中,每当有电话来电、更改应用程序的方向等时,我想将输入到数据库中活动的文本视图中的信息保存起来。

我正在使用此代码来保存用户输入到 textview 中的信息。

@Override
protected void onSaveInstanceState(Bundle outState) {
        save();
        Toast.makeText(getApplicationContext(), "On save state", Toast.LENGTH_SHORT).show();
    super.onSaveInstanceState(outState);
}

问题 :

每当我的手机方向改变时,该onSaveInstanceState方法就会被调用两次。谁能解释我这样做的原因。

因为它被调用了两次,所以save()也被调用了两次,而且我的数据库表中有重复的条目——这不好。

我不能android:configChanges="orientation|screenSize"在清单文件中使用来处理方向变化。因为当用户将横向更改为纵向时,它会使广告消失。

onSaveInstanceState接到电话时只调用一次:)

注意:save() 也称为 onBackPressed() 方法

请协助 !

4

2 回答 2

1

首先,确保您真正想做的是将持久数据保存在数据库中。如果是这样,onSaveInstanceState不是你的方法。

onSaveInstanceState用于保存活动的临时状态,以便能够完全按照它在onCreateor上的状态重新创建它onRestoreInstanceState。默认实现已经保存/恢复了大多数 UI 标准视图,如果您覆盖它,您可能会希望继续调用默认实现,然后保存/恢复附加值。顺便说一句,值存储在Bundle中,它基本上提供了一种存储/检索键值对的方法。

如果你真的想保存持久状态,你应该在onPause属于Activity. 请注意活动文档中的内容:

请注意,将持久数据保存在 onPause() 而不是 onSaveInstanceState(Bundle) 中很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。

为了避免重复行的问题,您只需要检查您尝试保存的记录是否已经存在(您需要某种唯一标识符),然后相应地创建或更新。

于 2013-10-12T22:46:31.967 回答
0

就我而言,从camera intent +orientation change返回时,它被调用了两次。然后我最终编写了Singleton Manager 类来随时保存和恢复我的变量。这个类将你的变量保存在变量中static final,当你不再使用它时应该清除它。

于 2016-07-14T07:15:13.450 回答