С Координация действий Документация для Android.
Когда одно действие запускает другое, они оба испытывают переходы жизненного цикла.Первое действие прекращает работу и переходит в состояние «Приостановлено» или «Остановлено», в то время как другое действие создается.В случае, если эти действия совместно используют данные, сохраненные на диске или в другом месте, важно понимать, что первое действие не полностью остановлено перед созданием второго.Скорее, процесс запуска второго пересекается с процессом остановки первого.
Порядок обратных вызовов жизненного цикла четко определен, особенно когда два действия находятся в одном процессе (приложении), а одно -начиная с другой.Вот порядок операций, которые происходят, когда действие A запускает действие B:
Выполняется метод действия A * onPause () .
Действия B onCreate () , onStart () и onResume () выполняются последовательно.(Действие B теперь имеет фокус пользователя.)
Затем, если действие A больше не отображается на экране, выполняется его метод onStop () .
Эта предсказуемая последовательность обратных вызовов жизненного цикла позволяет управлять переходом информации из одного действия в другое.
Возвращаясь к вашему случаю, когда вы запускаете MainActivity
из FirstActivity
.
FirstActivity
s onPause () метод выполняется.
MainActivity
s *Методы 1051 * onCreate () , onStart () и onResume () выполняются последовательно.(MainActivity
теперь имеет фокус пользователя.)
Затем, если 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 () .