java为什么在Android中使用clear()后,我的SharedReference会在活动中持久存在?
我已经找遍了,似乎找不到我的问题的答案。出于某种原因,SharedPreferences
中保存的数据在切换活动后重新出现。为什么我的SharedReferences仍然和我清除它之前一样,我该如何修复它
在第一个活动中:
@Override
protected void onStop() {
super.onStop();
SharedPreferences sp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
Gson gson = new Gson();
String objectJson = gson.toJson(object, Object.class);
String activityJson = "FirstActivity";
SharedPreferences.Editor editor = sp.edit();
editor.putString(CONTINUE_KEY, objectJson);
editor.putString(ACTIVITY_KEY, activityJson);
editor.apply();
}
public void onClickSave() {
Gson gson = new Gson();
String objectJson = gson.toJson(object);
SharedPreferences sp getSharedPreferences(SAVE_KEY, MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString(object.getDate(), objectJson);
editor.apply();
SharedPreferences spTemp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
spTemp.edit().clear().apply();
// go back to the main menu
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
在应用()之前:
在apply()之后:
在主要活动中:
SharedPreferences sp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
主要活动:
# 1 楼答案
保存到共享首选项
从共享偏好中清除
从共享偏好中获取
# 2 楼答案
来自Coordinating activitiesandroid文档
回到你的案例,当你从
FirstActivity
开始MainActivity
FirstActivity
的onPause()方法执行MainActivity
的onCreate()、onStart()和onResume()方法按顺序执行。(MainActivity
现在以用户为中心。)然后,如果
FirstActivity
在屏幕上不再可见,则执行其onStop()方法当
onClickSave
中的代码执行时此时,
TEMP_KEY
prefs已被清除。当MainActivity
在屏幕上可见后,FirstActivity
将不再在屏幕上可见,因此它的onStop()方法将执行在这段代码中,您再次将两个条目添加到
TEMP_KEY
prefs中。因此,当用户单击MainActivity
中的按钮时,此时prefs大小是2,而不是您预期的0这在安卓系统中是可预测或预期的行为。你可以在
MainActivity
方法的^{onCreate(),onStart(),onResume()中放置一个日志,然后你可以看到TEMP_KEY
prefs大小在当时总是0不要在^{onStop()中的
TEMP_KEY
中添加新条目,而是应该在onPause()中添加新条目# 3 楼答案
首先,您对getSharedPreferences(String name, int mode)、在
onStop()
和onClickSave()
方法中有不同的首选文件名:您需要使用相同的文件名来访问相同的首选项
Second,
onStop()
并不总是保证被调用,因此它不是保存首选项的可靠方法。相关答案:Is onStop() always preceded by onPause()第三个,当需要保存首选项中的值时,请始终保存首选项。不要等到以后再保存它,希望你可以依赖
onPause()
、onStop()
或onDestroy()
。永远不要认为你的应用程序会被用户或系统优雅地终止