saveInstanceState в родительском действии равен нулю, когда нажата кнопка вверх в дочернем действии - PullRequest
0 голосов
/ 02 мая 2018

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

У меня есть два вида деятельности - 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");
}

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

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

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



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

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

Сказано:

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

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

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

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

...