java - onSaveInstanceState 在 Orientation Change 上被调用两次

标签 java android database

我正在开发一个 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 的临时状态,以便能够完全按照 onCreateonRestoreInstanceState 重新创建它.默认实现已经保存/恢复了大部分 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/

相关文章:

安卓磨损 :CardScrollView cannot scroll?

无论分辨率如何,Android 都在特定位置打印

java - java中如何使用字符串作为引用?

mysql - 用户文件数据库设计

database - 是否可以存储图形 hbase?如果是这样,您如何对数据库建模以支持图形结构?

mysql - 如何在删除另一个数据库时更新另一个数据库中列字符串的值

java - 如何使我的应用程序模块化?

java - 我正在尝试创建一个小型 GUI 应用程序,但 JFrame 的内容未显示在屏幕上。我该如何修复我的代码?

java - JDK "upward"或 "backward"是否兼容?

java - (未知发件人)在从 java 应用程序发送带有在 iText 中创建的 pdf 附件的电子邮件时