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