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

Android中如何用Java在另一个Activity中清除SharedPreferences数据

核心问题排查

你当前代码首先存在SharedPreferences实例不匹配的问题:

  • 存储计数、第二个页面取值时用的是 PreferenceManager.getDefaultSharedPreferences() 实例
  • 倒计时结束删除数据时用的是 getSharedPreferences("score_first", MODE_PRIVATE) 自定义实例
    两个实例对应完全独立的存储文件,所以删除操作根本没有作用到实际存计数的SP文件,这是重启后数据仍然存在的核心原因,优先统一所有操作的SP实例,推荐全局使用默认SP即可。

方案1:每次进入计数器页自动重置计数(最稳妥)

直接在BeginAfter的onCreate方法初始化时清空旧数据,不管上次退出有没有成功清除,重新进入都会从0开始计数:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_begin_after);
    // 全局用同一个SP实例,不要重复初始化
    preferences = PreferenceManager.getDefaultSharedPreferences(this);
    // 初始化时清空旧计数
    preferences.edit().remove("image_data").apply();
    score1 = findViewById(R.id.score1);
    score1.setText("0");

    // 下面保留你原来的倒计时逻辑即可
    long duration = TimeUnit.MINUTES.toMillis(1);
    new CountDownTimer(duration, 1000) {
        @Override
        public void onTick(long l) {
            String sDuration = String.format(Locale.ENGLISH, "%01d", TimeUnit.MILLISECONDS.toSeconds(l) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(l)));
            textView.setText(sDuration);
        }

        @Override
        public void onFinish() {
            // 统一用全局的preferences实例删除
            preferences.edit().remove("image_data").commit();
            Intent intent = new Intent(BeginAfter.this, Begindup.class);
            startActivity(intent);
        }
    }.start();
}

// 按钮点击方法也直接用全局实例,不要重复声明变量
public void correct_button(View view) {
    int count = preferences.getInt("image_data", 0);
    count++;
    score1.setText("" + count);
    preferences.edit().putInt("image_data", count).apply();
}

方案2:第二个Activity加按钮触发清除

在Begindup的布局文件中新增清除按钮,给按钮设置android:onClick="clearCount"属性,然后在Begindup类中添加如下逻辑:

public class Begindup extends AppCompatActivity {
    private TextView score1;
    private SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_begindup);
        score1 = findViewById(R.id.score1);
        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        int count = preferences.getInt("image_data", 0);
        score1.setText(String.valueOf(count));
    }

    // 按钮点击触发清除
    public void clearCount(View view) {
        preferences.edit().remove("image_data").apply();
        score1.setText("0");
        Toast.makeText(this, "计数已清除", Toast.LENGTH_SHORT).show();
    }
}

优化建议

  1. 已经在类顶部声明的全局变量(比如score1、preferences)不要在方法中重复声明局部同名变量,避免逻辑混乱
  2. SP提交操作优先用apply()替代commit(),异步提交不会阻塞主线程,性能更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:15:05