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

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

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

Поскольку A получает topicId из намерения, когда я нажимаю кнопку «Вверх» в B, в A нет намерения, а topicId по умолчанию равен -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");
}

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

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

Может кто-нибудь сказать мне, почему Bundle в onCreate() в этом случае нулевой? Я установил родительскую активность 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 лет ...

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



Редактировать

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

Сказано:

When you press back, the Activity is destroyed and the data it had is lost. After this you will always get null in the bundle as a new, fresh instance is being created when you reopen the app.

The Bundle savedInstanceState is used when the activity is being recreated due to some changes (like rotation), or because it was paused in the background for a long time.

If you want to persist some data, consider SharedPreferences for small stuff, or maybe a database (SQLite, Realm) or files for large stuff.

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

Как вы начали занятие Б? SavedInstanceState - это то, что Android делает, когда ему нужна память и убивает действия, чтобы освободить память /

Uriel Frankel 03.05.2018 10:51

В действии A у меня есть фрагмент с RecyclerView и внутри него несколько CardView для задач. Я прикрепил onClickListener к задачам, и при щелчке по нему следующий код обрабатывает его: @Overridepublic void onItemClick(int id) {Intent intent = new Intent(getActivity(), CreateTaskActivity.class);intent.putExtra(CreateTaskActivity.EXTRA_TASK_ID, id);startActivity(intent);}

castafiore 03.05.2018 12:59

что такое android: launchMode of activity b?

Uriel Frankel 03.05.2018 17:05

Он не указан, поэтому это должно быть значение по умолчанию standard.

castafiore 04.05.2018 08:24

кнопка "Назад" уничтожает действие, лучший способ - использовать для этого SharedPreferences.

maxwellnewage 08.06.2019 20:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
485
0

Другие вопросы по теме