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

Android Studio 中新Activity无法保存SharedPreference数据问题

SharedPreference跨Activity修改后数据被还原问题解决方案

问题根源

你的代码存在两个不符合Android SharedPreferences使用规范的问题,直接导致跨Activity修改不生效:

  • getStringSet() 方法返回的是SharedPreferences内部持有的缓存实例,官方明确禁止直接修改该实例。你直接调用temp.add()修改该实例会触发内部缓存逻辑异常,跨Activity场景下缓存同步会出现错乱。
  • 主Activity如果提前加载过该attempt字段对应的StringSet旧值,后续主Activity执行提交操作时会直接用旧值覆盖其他Activity写入的新值,就会出现修改后临时生效、后续被还原的现象。

修复方案

拿到StringSet后先拷贝到新的Set实例中再修改,正确代码如下:

// 读取原有数据,空值时默认返回空HashSet避免空指针
Set<String> originSet = getSharedPreferences("pref", MODE_PRIVATE).getStringSet("attempt", new HashSet<>());
// 拷贝到新的Set实例后再做修改
Set<String> temp = new HashSet<>(originSet);
temp.add("one item");
// 提交修改,UI线程建议用异步的apply,需要同步获取提交结果再用commit
getSharedPreferences("pref", MODE_PRIVATE).edit()
        .putStringSet("attempt", temp)
        .apply();

额外注意事项

  • 不要在多个Activity中缓存同一份StringSet实例,每次修改前都重新读取、拷贝、提交,避免多实例修改互相覆盖
  • 如果多个页面频繁操作同一份偏好数据,建议封装为单例的SharedPreferences工具类统一处理写入操作,必要时加锁避免并发写入冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 05:15:04