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(); } }
优化建议
- 已经在类顶部声明的全局变量(比如
score1、preferences)不要在方法中重复声明局部同名变量,避免逻辑混乱 - SP提交操作优先用
apply()替代commit(),异步提交不会阻塞主线程,性能更好
内容的提问来源于stack exchange,提问作者user16240688
相关产品推荐
相关产品推荐

