我正在开发一个 Android 应用程序,我想在每当电话到达、应用程序的方向发生变化等时,将输入到 Activity 的 TextView 中的信息保存在数据库中。
我正在使用这段代码来保存用户输入到 TextView 中的信息。
@Override
protected void onSaveInstanceState(Bundle outState) {
save();
Toast.makeText(getApplicationContext(), "On save state", Toast.LENGTH_SHORT).show();
super.onSaveInstanceState(outState);
}
问题:
每当我的手机方向改变时,onSaveInstanceState
方法就会被调用两次。谁能解释一下这是为什么。
因为它被调用了两次,save()
也被调用了两次,我的数据库表中有重复的条目 - 这不好。
我不能在 list 文件中使用 android:configChanges="orientation|screenSize"
来处理方向变化。因为当用户将横向更改为纵向时,它会使广告消失。
onSaveInstanceState
仅在接到电话时调用一次 :)
注意:save() 也称为 onBackPressed() 方法
请协助!
最佳答案
首先,确保您真正想要做的是将持久数据保存在数据库中。如果是这样,onSaveInstanceState
不是您的方法。
onSaveInstanceState
用于保存 Activity 的临时状态,以便能够完全按照 onCreate
或 onRestoreInstanceState
重新创建它.默认实现已经保存/恢复了大部分 UI 标准 View ,如果您覆盖它,您可能会希望继续调用默认实现,然后保存/恢复其他值。顺便说一下,这些值存储在 Bundle 上它基本上提供了一种存储/检索键值对的方法。
如果您真的想保存持久状态,您应该在 Activity
生命周期的一部分的 onPause
方法上执行此操作。注意 activity documentation 是什么说:
Note that it is important to save persistent data in onPause() instead of onSaveInstanceState(Bundle) because the latter is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation.
为了避免重复行的问题,您只需要检查您尝试保存的记录是否已经存在(为此您需要某种唯一标识符),然后相应地创建或更新。
关于java - onSaveInstanceState 在 Orientation Change 上被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339238/