Android "remembers"应用程序完全卸载后的共享首选项

标签 android sharedpreferences

在我的 Android 应用程序中,我使用一组随机生成的文件名来存储一些数据。为了确保在应用程序重新启动时生成相同的文件名集 - 并且每个应用程序安装都不同 - 我通过从一长串随机字母数字字符中选择名称作为子字符串来开始这个过程,当应用程序已安装。后一个字符串存储在共享首选项中。

在测试应用程序时,我遇到了一个相当奇怪的问题。有时我会进行重大更改,因此我会完全卸载该应用程序 - 甚至强制关闭它 + 清除其所有数据。那时我希望如果重新安装该设备,该设备将没有该应用程序的“先验知识”。然而我发现 Shared Preferences 字符串以某种方式被“记住”了。如果在此期间我更改了从存储的共享首选项字符串中提取文件名子字符串的方式,这会造成严重破坏。

我如何确保该应用程序对先前安装但随后被卸载的版本具有“零内存”?


我过去使用的一种解决方案是指示 Android 不通过 list 文件进行任何备份,android:allowBackup = "false"。但是,我已经放弃了这个想法,因为 - 除非我弄错了 - 这实际上意味着我阻止用户在决定更换手机时将他们的应用程序移植到新设备上。

最佳答案

在(重新)安装时,您的应用可能会从 Google 自动备份(通过 Google 云端硬盘)恢复文件。要禁用此功能,您可以在 list 中将其显式设置为 false:

<manifest ... >
    ...
    <application android:allowBackup="false" ... >
        ...
    </application>
</manifest>

如果您想更精细地控制备份/恢复的内容和不备份/恢复的内容,您可以在备份中包含或排除特定文件。

查看自动备份文档: https://developer.android.com/guide/topics/data/autobackup#EnablingAutoBackup

如果您不想禁用自动备份,但想“从头开始”重新安装(出于测试目的),您可以执行以下操作之一:

  • 在重新安装后清除应用数据。这将清除安装时自动恢复的文件
  • 在卸载之前清除应用程序数据,然后使用以下命令强制进行新备份(以便旧备份被重置):adb shell bmgr backupnow <PACKAGE>

查看如何测试备份文档: https://developer.android.com/guide/topics/data/testingbackup#TestingBackup

关于Android "remembers"应用程序完全卸载后的共享首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348539/

相关文章:

android - 在 Activity 中使用单个 SearchView,用于不同的 fragment

android - 未找到 adb 命令

android - 如何使用 Android Native 在 session (SharedPreferences)中保存 JSONResponse?

android - 每次都创建一个新的 SharedPreferences 对象来读取配置变量?

android - 如何在共享首选项中存储切换按钮状态并稍后在 android 中加载状态?

android - Spring Boot 上的 Controller 415 不支持的媒体类型

android - 获取 Android 中每个启动器的列表

c# - 标签在 iOS 中显示,但在 Android 中不显示

android - 共享首选项不会在关闭应用程序或 Activity 之前保存

java - 在 Android 中备份 SharedPreferences?