onSaveInstanceState在Orientation Change上被调用两次

时间:2013-10-12 21:10:31

标签: java android database

我正在开发一个Android应用程序,我希望每当电话到达,应用程序的方向发生变化等时,都会将输入的信息保存到数据库中。

我正在使用此代码保存用户输入文本视图的信息。

@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()方法

请协助!

2 个答案:

答案 0 :(得分:1)

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

onSaveInstanceState用于保存活动的临时状态,以便能够像onCreateonRestoreInstanceState上一样重新创建活动。默认实现已经保存/恢复了大多数UI标准视图,如果您覆盖它,可能需要继续调用默认实现,然后保存/恢复其他值。顺便说一句,这些值存储在Bundle上,它基本上提供了一种存储/检索键值对的方法。

如果你真的想保存持久状态,你应该在onPause生命周期的Activity方法上进行保存。请注意activity documentation所说的内容:

  

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

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

答案 1 :(得分:0)

在我的情况下,从相机意图+方向更改返回时,它被调用了两次。然后我最终写了 Singleton Manager类来保存和恢复我的变量。此类将变量保存在static final变量中,您应该在不再使用变量时将其清除。