【问题标题】:Android "remembers" shared preferences after complete app uninstall完成应用卸载后,Android 会“记住”共享偏好
【发布时间】:2018-11-17 05:31:55
【问题描述】:

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

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

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


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

【问题讨论】:

  • 我们遇到了同样的问题,并由AndroidManifest.xml. 中的android:allowBackup="false" 解决,现在用新设备试试,应该已经解决了。我不知道它是如何工作的。
  • 感谢您的评论。我稍微改变了我的问题。我曾尝试过android:allowBackup 方法,但发现它会引发我现在解释的其他问题。
  • 我刚刚看到这些 cmets 和您更新的问题。我会修改我的答案。

标签: android sharedpreferences


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我接受并赞成你的回答,因为你让我在这里走上了正确的道路。我已根据您的建议提供了我对该问题的解决方案 - 作为单独的答案,以帮助可能遇到类似情况的其他人。
【解决方案2】:

对此进行扩展,例如mobile/src/debug/AndroidManifest.xml

<application
    tools:replace="android:allowBackup"
    android:allowBackup="false">

    ...

</application>

与此类似,可以为调试版本禁用自动备份 - 但为发布版本保持启用状态。

仅仅是因为禁用发布版本的自动备份可能不是预期的结果。

【讨论】:

    【解决方案3】:

    根据@hungryghost 的建议,我最终实现了一个解决方案

    问题:在重新安装应用后,Android 可能会记住共享的偏好设置,并且清单中按照android:allowBackup = "false" 行的一揽子说明不是解决方案。

    那么,为什么不自行将问题转化为解决方案呢?这就是我的工作

    • 检查构建特定密钥的共享首选项。
    • 如果找不到那个键,我会做两件事

      1. 清除所有共享首选项,context.deleteSharedPrefernces(filename)
      2. 现在创建构建特定密钥
      3. 当我进行需要忘记旧首选项的应用更改时,我只需更改构建特定的键即可。

    【讨论】:

    • context.deleteSharedPreferences(filename) 也可以通过单击按钮执行(这里我有一个片段只能在调试版本中访问,几乎不用于测试/调试相关首选项)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2019-06-20
    • 1970-01-01
    • 2012-10-24
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多