为什么在Android中使用clear()之后,我的SharedPreferences在各个活动之间仍然存在?

时间:2019-03-11 21:15:43

标签: java android sharedpreferences

我已经四处张望,似乎找不到解决我问题的答案。由于某些原因,切换活动后,会再次显示保存在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()之前:

Debugger

apply()之后:

Debugger

在主要活动中:

SharedPreferences sp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);

来自主要活动:

Debugger

3 个答案:

答案 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:

     
      
  1. 活动A的 onPause()方法执行。

  2.   
  3. 活动B的 onCreate() onStart() onResume()方法按顺序执行。 (活动B现在具有用户焦点。)

  4.   
  5. 然后,如果活动A在屏幕上不再可见,则会执行其 onStop()方法。

  6.   
     

这种可预测的生命周期回调顺序使您可以管理   信息从一种活动到另一种活动的过渡。

MainActivity开始FirstActivity时回到您的情况。

  1. FirstActivity onPause()方法执行。

  2. MainActivity onCreate() onStart() onResume()方法按顺序执行。 (MainActivity现在以用户为关注焦点。)

  3. 然后,如果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()中添加。