我正在开发一个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()方法
请协助!
答案 0 :(得分:1)
首先,确保您真正想要做的是将持久数据保存在数据库中。如果是,onSaveInstanceState
不是您的方法。
onSaveInstanceState
用于保存活动的临时状态,以便能够像onCreate
或onRestoreInstanceState
上一样重新创建活动。默认实现已经保存/恢复了大多数UI标准视图,如果您覆盖它,可能需要继续调用默认实现,然后保存/恢复其他值。顺便说一句,这些值存储在Bundle上,它基本上提供了一种存储/检索键值对的方法。
如果你真的想保存持久状态,你应该在onPause
生命周期的Activity
方法上进行保存。请注意activity documentation所说的内容:
请注意,在onPause()而不是onSaveInstanceState(Bundle)中保存持久数据非常重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的每种情况下调用。
为了避免重复行的问题,您只需要检查您尝试保存的记录是否已经存在(您需要某种唯一标识符),然后相应地创建或更新。
答案 1 :(得分:0)
在我的情况下,从相机意图+方向更改返回时,它被调用了两次。然后我最终写了 Singleton Manager类来保存和恢复我的变量。此类将变量保存在static final
变量中,您应该在不再使用变量时将其清除。