我已经四处张望,似乎找不到解决我问题的答案。由于某些原因,切换活动后,会再次显示保存在SharedPreferences
中的数据。为什么我的SharedPreferences仍然与清除前的完全相同,我该如何解决?
在第一次活动中:
@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()之前:
apply()之后:
在主要活动中:
SharedPreferences sp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
来自主要活动:
答案 0 :(得分:0)
保存到共享首选项
SharedPreferences sp = getSharedPreferences("test" , MODE_PRIVATE);
SharedPreferences.Editor spEditor = sp.edit();
spEditor.putString("hello1" , "hello11");
spEditor.putString("hello2" , "hello22");
spEditor.apply();
清除共享首选项
SharedPreferences sp1 = getSharedPreferences("test" , MODE_PRIVATE);
SharedPreferences.Editor spEditor1 = sp1.edit();
spEditor1.clear();
spEditor1.apply();
从共享首选项获取
SharedPreferences sp2 = getSharedPreferences("test" , MODE_PRIVATE);
String value = sp2.getString("hello1" ,"noting");
Log.i("test_sp" , " == == ==" +value);
答案 1 :(得分:0)
首先,在onStop()
和onClickSave()
方法中,getSharedPreferences(String name, int mode)的首选项文件名称不同:
// in onStop()
SharedPreferences sp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
// in onClickSave()
SharedPreferences sp getSharedPreferences(SAVE_KEY, MODE_PRIVATE);
您需要使用相同的文件名来访问相同的首选项。
第二,并非总是保证会调用onStop()
,因此这不是保存首选项的可靠方法。相关答案:Is onStop() always preceded by onPause()
第三,在需要保留首选项时始终保存该首选项。不要等到以后再保存,希望您可以依赖onPause()
,onStop()
或onDestroy()
。永远不要假设您的应用程序会被用户或系统正常终止。
答案 2 :(得分:0)
摘自Coordinating activities android文档。
当一项活动开始另一项活动时,它们都会经历生命周期 过渡。第一个活动停止运行并进入已暂停 或“已停止”状态,同时创建其他活动。如果这些 活动共享保存到光盘或其他位置的数据, 了解在此之前,第一个活动并未完全停止 第二个被创建。而是开始第二个过程 一个与停止第一个重叠的过程重叠。
生命周期回调的顺序已明确定义,尤其是当 这两个活动处于同一流程(应用程序)中,一个正在开始 另一个。这是活动A时发生的操作顺序 开始活动B:
活动A的 onPause()方法执行。
活动B的 onCreate(), onStart()和 onResume()方法按顺序执行。 (活动B现在具有用户焦点。)
然后,如果活动A在屏幕上不再可见,则会执行其 onStop()方法。
这种可预测的生命周期回调顺序使您可以管理 信息从一种活动到另一种活动的过渡。
从MainActivity
开始FirstActivity
时回到您的情况。
FirstActivity
的 onPause()方法执行。
MainActivity
的 onCreate(), onStart()和 onResume()方法按顺序执行。 (MainActivity
现在以用户为关注焦点。)
然后,如果FirstActivity
在屏幕上不再可见,则会执行其 onStop()方法。
onClickSave
中的代码执行时。
SharedPreferences spTemp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
spTemp.edit().clear().apply();
目前,TEMP_KEY
个首选项已被清除。在屏幕上显示MainActivity
之后,FirstActivity
将不再在屏幕上可见,因此将执行其 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();
在此代码中,您将两个条目再次添加到TEMP_KEY
首选项中。因此,当用户单击MainActivity
中的按钮时,首选大小是2,而不是您期望的0。
为什么我的SharedPreferences仍然和我之前完全一样 清除了吗?
这是Android中的可预期或预期的行为。您可以将日志放入MainActivity
的 onCreate(), onStart(), onResume()方法中,然后可以看到当时TEMP_KEY
的首选项大小始终为0。
我该如何解决?
请勿在 onStop()的TEMP_KEY
中添加新条目,而应在 onPause()中添加。