Android 13(API 33)下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
相关产品推荐
相关产品推荐

