You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13(API 33)下SharedPreferences异常问题求助

Android 13下SharedPreferences读取异常问题排查与解决

问题场景

使用SharedPreferences保存Spinner选中状态,在Android 9及以下版本运行正常,但Android 13真机发布版存在异常:APP刚安装后几天内功能正常,强制关闭APP后,Spinner无法加载保存的默认值,默认选中第一项(读取到默认值0);APP在后台运行时则能正常读取设置。模拟器测试无此问题。

原代码实现

读取偏好设置

// Retrieve preferences
SharedPreferences settings = getSharedPreferences("MyPreferences", MODE_PRIVATE);
mnSpinnerPos = settings.getInt("CAT_POS", 0);
munSpinnerVal = settings.getLong("CAT_VAL", 1);

保存偏好设置

// Set preferences
SharedPreferences settings = getSharedPreferences("MyPreferences", MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("CAT_POS",mnSpinnerPos);
editor.putLong("CAT_VAL", munSpinnerVal);
editor.apply();

解决方案

1. 替换异步提交为同步提交

apply()是异步写入磁盘的操作,当APP被强制关闭时,可能还未完成写入,导致新值未持久化。改用commit()同步写入,确保数据立即落盘:

SharedPreferences settings = getSharedPreferences("MyPreferences", MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("CAT_POS", mnSpinnerPos);
editor.putLong("CAT_VAL", munSpinnerVal);
// 同步提交并校验结果
boolean isSaved = editor.commit();
// 可根据isSaved状态添加容错逻辑

2. 确认读取时机的正确性

确保读取SharedPreferences的代码在onCreate()或onStart()等生命周期方法中执行,且Spinner已完成初始化。避免在UI未就绪或后台线程过早执行读取操作,导致数据未正确加载。

3. 适配Android 13的存储优化策略

Android 13对应用存储的后台写入有更严格的限制,可通过以下方式优化:

  • 若不需要应用备份,在Manifest中添加:
    <application
        ...
        android:allowBackup="false">
    
  • API 24及以上版本,可在提交后主动触发磁盘同步:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        settings.flush();
    }
    
  • 排查应用是否被系统电池优化策略限制,可引导用户关闭对应优化,但优先通过代码逻辑解决。

4. 验证SharedPreferences文件完整性

通过adb查看SharedPreferences文件的路径(/data/data/[你的应用包名]/shared_prefs/MyPreferences.xml),确认文件是否存在、内容是否与预期一致,排查文件损坏或丢失的可能。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:07:48