Почему мои SharedPreferences сохраняются во всех активностях после использования clear () в Android? - PullRequest
0 голосов
/ 12 марта 2019

Я просмотрел все и не могу найти ответ на свой вопрос.По какой-то причине данные, сохраненные в 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);
}

До применения ():

Debugger

После подачи заявления ():

Debugger

В основной деятельности:

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

От основной деятельности:

Debugger

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

Сначала , у вас есть другое имя файла настроек для getSharedPreferences (имя строки, режим int) , в onStop() и onClickSave() методы:

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

// in onClickSave()
SharedPreferences sp getSharedPreferences(SAVE_KEY, MODE_PRIVATE);

вам нужно использовать одно и то же имя файла для доступа к одному и тому же предпочтению.

Second , onStop() не всегда гарантированно вызывается, поэтому это не надежный метод для сохранения вашегопредпочтения.Связанный ответ: OnStop () всегда предшествует onPause ()

Третий , всегда сохраняйте предпочтение, когда вам нужно сохранить значение в нем.Не ждите, чтобы сохранить его позже и надеясь, что вы можете зависеть от onPause(), onStop() или onDestroy().Никогда не предполагайте, что ваше приложение будет корректно завершено пользователем или системой.

0 голосов
/ 13 марта 2019

С Координация действий Документация для Android.

Когда одно действие запускает другое, они оба испытывают переходы жизненного цикла.Первое действие прекращает работу и переходит в состояние «Приостановлено» или «Остановлено», в то время как другое действие создается.В случае, если эти действия совместно используют данные, сохраненные на диске или в другом месте, важно понимать, что первое действие не полностью остановлено перед созданием второго.Скорее, процесс запуска второго пересекается с процессом остановки первого.

Порядок обратных вызовов жизненного цикла четко определен, особенно когда два действия находятся в одном процессе (приложении), а одно -начиная с другой.Вот порядок операций, которые происходят, когда действие A запускает действие B:

  1. Выполняется метод действия A * onPause () .

  2. Действия B onCreate () , onStart () и onResume () выполняются последовательно.(Действие B теперь имеет фокус пользователя.)

  3. Затем, если действие A больше не отображается на экране, выполняется его метод onStop () .

Эта предсказуемая последовательность обратных вызовов жизненного цикла позволяет управлять переходом информации из одного действия в другое.

Возвращаясь к вашему случаю, когда вы запускаете MainActivity из FirstActivity.

  1. FirstActivity s onPause () метод выполняется.

  2. MainActivity s *Методы 1051 * onCreate () , onStart () и onResume () выполняются последовательно.(MainActivity теперь имеет фокус пользователя.)

  3. Затем, если FirstActivity больше не виден на экране, выполняется его метод onStop () .

Когда выполняется код в onClickSave.

SharedPreferences spTemp = this.getSharedPreferences(TEMP_KEY, MODE_PRIVATE);
spTemp.edit().clear().apply();

В это время TEMP_KEY prefs было очищено.После того, как 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, в то время размер prefs равен 2, а не 0. Как вы и ожидали.

Почему мои SharedPreferences остаются такими же, как и до очисткиэто?

Это предсказуемое или ожидаемое поведение в Android.Вы можете поместить лог в onCreate () , onStart () , onResume () метод MainActivity, тогда вы можете увидеть TEMP_KEY prefs sizeв это время всегда 0.

Как это можно исправить?

Не добавлять новые записи в TEMP_KEY в onStop () , вместо этого вы должны добавить onPause () .

0 голосов
/ 12 марта 2019

Сохранить в общих настройках

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...