Android: onSaveInstanceState на кнопке «Назад»

Я разрабатываю приложение, в котором я переопределяю кнопку «Назад». Я создал флажок. При нажатии на который я вызываю намерение:

startActivityforResult();

А также поддержание состояния активности как:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  savedInstanceState.putBoolean("checkbox", checkbox.isChecked());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  checkbox_state = savedInstanceState.getBoolean("checkbox");
}

которые работают нормально, и состояние поддерживается. Означает, что я ввожу значение в текст редактирования. и установите флажок, вызвав новое действие для результата, и при возврате к первому действию состояние сохраняется.

Теперь, но из второго действия, если я нажму кнопку возврата устройства, состояние не будет сохранено.

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


person Manoj Fegde    schedule 22.03.2013    source источник


Ответы (2)


Когда вы запускаете новую активность, текущая активность скрывается, а новая активность помещается поверх стека. Теперь, если вы нажмете кнопку «Назад» в новом действии, тогда первое действие должно появиться в своем текущем состоянии (если оно не было уничтожено, вызовите finish ()), где оно было оставлено, т.е. если флажок был установлен, он должен оставаться проверено. Вам не нужно сохранять состояние действия, если ориентация не изменена или действие не уничтожено.

Вы уверены, что ничего не делаете в методах onActivityResult или onResume(), которые влияют на состояние флажка? Я бы рекомендовал сначала закомментировать весь код в обоих методах и посмотреть, сохраняет ли ваш флажок состояние. Также можете ли вы убедиться, что сам код не снимает флажок перед запуском нового действия?

person user_CC    schedule 22.03.2013
comment
Я ввожу некоторые данные в текст редактирования в Activity2 и перехватываю эти данные в Activity1 с помощью намерения. - person Manoj Fegde; 22.03.2013

Теперь, но из второго действия, если я нажму кнопку возврата устройства, состояние не будет сохранено.

onSaveInstanceState() в основном используется для изменения конфигурации (например, для поворота экрана).

Итак, что мне делать, чтобы сохранить состояние кнопки «Назад»

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

person CommonsWare    schedule 22.03.2013
comment
Допустим, у меня есть ListView, который я заполняю из базы данных. Считаете ли вы, что я должен заполнять его из базы данных каждый раз, когда я возвращаюсь к нему из другого действия? Или я должен сохранить содержимое адаптера в состоянии и использовать его повторно? Просто хотелось бы узнать ваше отношение к этому :) - person Ε Г И І И О; 02.05.2013
comment
@ΕGIІIO: Заполнение из базы данных является самым безопасным, так как данные вполне могли измениться с момента последней активности. Сохранение его в состоянии - худший выбор. Золотым звеном было бы поддерживать своего рода синглтон управления моделью данных, который кэширует информацию и является точкой доступа к модели данных для всех действий. - person CommonsWare; 02.05.2013
comment
Является ли он худшим, потому что он тратит ресурсы? Если вы знаете, что данные не обновляются, пока вы перемещаетесь между этими двумя действиями, не будет ли более быстрым восстановление их из состояния? Потому что я ненавижу видеть "загрузка, пожалуйста, подождите..." между моими навигациями или когда я поворачиваю экран :) - person Ε Г И І И О; 02.05.2013
comment
@ΕGIІIO: Это худшее, потому что это тратит ресурсы? -- если вы собираетесь занимать кучу оперативной памяти, делайте это так, чтобы извлечь из нее больше пользы. Кроме того, он, скорее всего, будет устаревшим. не было бы более отзывчивым восстановить его из состояния? -- да, если не обращать внимания на все остальные заботы. Потому что я ненавижу видеть "загрузка, пожалуйста, подождите..." между моими навигациями или когда я поворачиваю экран - у вас есть другие проблемы, если только Traceview не показывает, что 100% вашей задержки связано с вводом-выводом базы данных. - person CommonsWare; 02.05.2013
comment
@ΕGIІIO: для изменений конфигурации лучшим решением будет сохранить файл ListFragment. Навигация не должна вызывать повторный запрос к базе данных, если только предыдущий экземпляр действия не был finish() выполнен. - person CommonsWare; 02.05.2013
comment
Большое спасибо за ваш ценный совет. Я рассмотрю реализацию ListFragment. И я должен увидеть, что такое Traceview :) Блин, я так новичок в Android! Спасибо еще раз. - person Ε Г И І И О; 02.05.2013