完全卸载应用后,Android会“记住”共享的首选项

时间:2018-11-17 05:31:55

标签: android sharedpreferences

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

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

如何确保应用程序具有先前安装的版本的“零内存”,随后又将其卸载?


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

3 个答案:

答案 0 :(得分:2)

在(重新)安装时,您的应用程序可能正在从Google自动备份(通过Google云端硬盘)还原文件。要禁用此功能,可以在清单中将其显式设置为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

答案 1 :(得分:1)

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

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

    ...

</application>

与此类似,它可以为调试版本禁用自动备份-但对于发布版本启用自动备份。

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

答案 2 :(得分:0)

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

问题:重新安装应用程序后,Android会记住共享的首选项,清单中的android:allowBackup = "false"一词中的指示性说明不是解决方案。

那么为什么不将问题单独变成解决方案呢?这是我的工作

  • 检查共享首选项以获取特定于构建的密钥。
  • 如果找不到该密钥,我会做两件事

    1. 清除所有共享的偏好设置,context.deleteSharedPrefernces(filename)
    2. 现在创建该构建专用密钥
    3. 当我更改需要忘记旧偏好的应用程序时,只需更改构建特定的键即可。