saveInstanceState в родительском действии имеет значение null, когда нажата кнопка вверх в дочернем действии

У меня проблема с использованием кнопки «Вверх» в моем приложении. Я уже прочитал много сообщений о подобных проблемах, но ни один из них не касается той же проблемы, которую я хочу решить.

У меня есть два занятия - A и B. Отображает список задач для выбранной категории из базы данных SQLite. Каждая задача относится к категории, поэтому A имеет приватную переменную topicId, переданную из Intent (она действует как фильтр). Когда я нажимаю на задачу, открывается действие B, которое позволяет вам редактировать его. B имеет кнопку «Вверх», которая возвращает вас к A (списку задач).

Поскольку A получает идентификатор темы из намерения, когда я нажимаю кнопку «Вверх» в B, в A нет намерения, а значение темы Id по умолчанию равно -1. Я думал, что сохранить идентификатор легко - просто сохраните его так:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("topicId", this.TOPIC_ID);
}

В методе onCreate() я использовал:

if(savedInstanceState != null) {
    this.TOPIC_ID = savedInstanceState.getInt("topicId");
}

Тем не менее, saveInstanceState, который передается в onCreate(), всегда равен null. Я поместил Log в методы жизненного цикла A, чтобы посмотреть, что произойдет.

  1. Я в A - onCreate() работает, а пакет нулевой
  2. Я нажимаю на задачу в списке (фрагмент, загруженный в ViewPager)
  3. onSaveInstanceState() запускается и сохраняет мой идентификатор
  4. Теперь я в B и нажимаю кнопку «Вверх» (не клавишу «Назад» на телефоне).
  5. Он запускает A's onDestroy(), затем A's onCreate() и пакет null!

Может ли кто-нибудь сказать мне, почему Bundle в onCreate() в этом случае имеет значение null? Я установил родительскую активность B как A в manifest.xml. Я также прочитал решение, которое предполагает, что вы добавили android:launchMode="singleTop" в манифест для A.

Это, однако, не то, что я хочу - если для него установлено значение singleTop, родительская активность НЕ уничтожается, когда вы нажимаете кнопку «Вверх». Я хочу, чтобы он был уничтожен и воссоздан, потому что в B я вношу изменения в задачу, которую я хочу немедленно перезагрузить из БД в A, когда я нажимаю «Вверх».

Буду признателен, если кто-нибудь скажет мне, почему Android передает пакет null onCreate(). Я уже пытался добавить этот код в B, и это не сработало:

Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpFromSameTask(this);

Я думаю, что этот пост посвящен той же проблеме, но это не было ответил 4 года...

Я отправлю код, если вам это нужно. Я не хочу быть слишком подавляющим в начале.



Изменить

После еще нескольких поисков я нашел это решение: ссылка

Сказано:

Когда вы нажимаете назад, действие уничтожается, а данные, которые у него были, теряются. После этого вы всегда будете получать нуль в пакете, поскольку при повторном открытии приложения создается новый свежий экземпляр.

Bundle saveInstanceState используется, когда действие воссоздается из-за некоторых изменений (например, поворота) или из-за того, что оно было приостановлено в фоновом режиме в течение длительного времени.

Если вы хотите сохранить некоторые данные, рассмотрите SharedPreferences для небольших вещей или, возможно, базу данных (SQLite, Realm) или файлы для больших вещей.

Насколько я понимаю, Bundle используется Android только в некоторых специфических случаях, например, когда вы включаете/выключаете экран, нажимаете кнопку «Домой» или меняете ориентацию экрана. В таких случаях, как мой, вы должны полагаться на некоторые другие функции, такие как класс SharedPreferences. Я приветствую людей с более продвинутыми знаниями, чем я, чтобы пролить больше света на этот вопрос.


person castafiore    schedule 02.05.2018    source источник
comment
Как вы начали деятельность B? SaveInstanceState — это то, что Android делает, когда ему нужна память, и убивает действия, чтобы освободить память.   -  person Uriel Frankel    schedule 03.05.2018
comment
В действии A у меня есть фрагмент с RecyclerView и внутри него несколько карточек для задач. Я прикрепил onClickListener к задачам, и когда один из них нажат, следующий код обрабатывает его: @Override public void onItemClick(int id) { Intent intent = new Intent(getActivity(), CreateTaskActivity.class); intent.putExtra(CreateTaskActivity.EXTRA_TASK_ID, id); startActivity(intent); }   -  person castafiore    schedule 03.05.2018
comment
что такое android:launchMode активности b?   -  person Uriel Frankel    schedule 03.05.2018
comment
Он не указан, поэтому он должен быть значением по умолчанию standard.   -  person castafiore    schedule 04.05.2018
comment
кнопка «Назад» уничтожает действие, лучший способ — использовать для этого SharedPreferences.   -  person maxwellnewage    schedule 08.06.2019