Android应用重装时无法删除SharedPrefs?已配置allowBackup=false仍无效
问题根因分析
你遇到的现象是三个独立问题叠加导致的:
- 代码逻辑错误导致重置步数不生效
你在resetSteps()中的长按重置逻辑写反了,当前代码把系统返回的总步数直接赋值为旧的历史校准值,存储的仍是原有的previousTotalSteps,等于没有执行重置操作。 Sensor.TYPE_STEP_COUNTER本身的系统级特性
这个传感器返回的数值是系统从开机到当前的全局累计步数,不属于应用私有数据,所有应用读取该传感器拿到的数值完全一致,和删除应用数据、卸载应用没有任何关系。你存到SharedPrefs里的只是应用自己的校准值,不是步数本身。- 高版本安卓系统备份机制未完全禁用
就算配置了allowBackup=false,Android 11及以上版本中如果用户开启了厂商云备份(华为云、小米云、谷歌云备份等),部分系统会强制备份应用私有数据,卸载重装时自动恢复。
修复方案
1. 修复重置步数逻辑
将resetSteps中的长按逻辑替换为以下代码:
mBinding.tvStepsTaken.setOnLongClickListener { // 把校准值更新为当前系统总步数,后续计算差值就会从0开始 previousTotalSteps = totalSteps mBinding.tvStepsTaken.text = 0.toString() mBinding.progressCircular.progress = 0f saveData() // 存储最新的校准值,下次启动读取即可生效 Toast.makeText(this, "步数已重置", Toast.LENGTH_SHORT).show() true }
2. 新增首次启动校准逻辑
在loadData方法中增加首次启动判断,避免重装应用后读取旧的备份值:
private fun loadData() { val sharedPrefs = getSharedPreferences("myPrefs", Context.MODE_PRIVATE) // 首次启动标记判断 val isFirstLaunch = sharedPrefs.getBoolean("is_first_launch", true) if (isFirstLaunch) { previousTotalSteps = 0f sharedPrefs.edit() .putBoolean("is_first_launch", false) .putFloat("key1", 0f) .apply() } else { previousTotalSteps = sharedPrefs.getFloat("key1", 0f) } Log.d("MainActivity", "$previousTotalSteps") }
3. 补充禁用备份的配置
在AndroidManifest.xml的application节点补充以下配置:
<application ... android:allowBackup="false" android:fullBackupContent="false" android:dataExtractionRules="@xml/data_extraction_rules" android:restoreAnyVersion="false">
在res/xml目录下新建data_extraction_rules.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <data-extraction-rules> <cloud-backup> <exclude domain="sharedpref" path="myPrefs.xml"/> </cloud-backup> <device-transfer> <exclude domain="sharedpref" path="myPrefs.xml"/> </device-transfer> </data-extraction-rules>
测试阶段可以直接关闭手机系统的云备份功能,排除系统自动恢复数据的干扰。
内容的提问来源于stack exchange,提问作者Nenad Vukojevic
相关产品推荐
相关产品推荐

