суббота, 22 ноября 2014 г.

Жизненный цикл активности

На днях возобновил свои исследования по написанию программ на java под Android, и снова столкнулся с тем, что не очень понимаю, когда вызываются методы обратного вызова onSaveInstanceState и onRestoreInstanceState, а когда нет. Различные схемы жизненного цикла активности, найденные мной в Интернете, были не совсем полными.

Тогда на основе всего собранного материала, в том числе и из первоисточника, а также собственных экспериментов в эмуляторах и на реальных устройствах, я нарисовал свою диаграмму-памятку жизненного цикла активности, снабдив её дополнительной полезной информацией. Получилось вот что:



Если кто захочет переопубликовать эту схему у себя, сошлитесь на мой блог, пожалуйста :-)


Список перехватываемых методов активности
(хуки, методы обратного вызова)

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

onCreate — инициализация активности.

onPause — обработка ситуации, когда активность теряет фокус (например, перекрыта диалоговым окном или собирается останавливаться).

Описание всех методов

onCreate — инициализация активности. Сюда передаются данные класса Bundle о последнем состоянии активности в её предыдущей жизни, если таковая была, сохранённые ранее в методе onSaveInstanceState для восстановления этого состояния. Для построения интерфейса здесь вызывают метод setContentView(int), где int — идентификатор XML-разметки, определяющей интерфейс пользователя. Также здесь используют вызовы findViewById(int) для получения доступа к виджетам (визуальным элементам), с которыми далее потребуется работать программно.

onStart — запуск активности. Здесь обычно создаются объекты, которые затем разрушаются в методе onStop.

onRestoreInstanceState — восстановление состояния активности. Срабатывает только в том случае, если активность воссоздаётся заново и есть данные о её состоянии класса Bundle, сохранённые ранее в методе onSaveInstanceState. Здесь восстанавливают сохранённое ранее состояние активности в случае, если оно было разрушено. Кроме того, то же самое можно сделать в onCreate.

onPostCreate — метод предназначен для системных классов, чтобы сделать окончательную инициализацию. В приложении этот перехват, как правило, не используют.

onResume — здесь обычно запускают анимацию, открывают устройства с эксклюзивным доступом (такие, как камера) и т.п.

onPostResume — метод предназначен для системных классов, чтобы сделать окончательную инициализацию после отработки кода метода onResume. В приложении этот перехват, как правило, не используют.

onAttachedToWindow — метод вызывается, когда главное окно активности подключается к оконному менеджеру.

onPause — обработка ситуации, когда активность теряет фокус (например, перекрыта диалоговым окном или собирается останавливаться). Здесь фиксируют любые изменения данных, сделанные пользователем, потому что дальше жизнь активности на устройствах с Android до версии 3 не гарантируется. На более свежих версиях жизнь активности гарантируется до завершения отработки метода onStop, а значит, сохранение можно реализовать и там. Тем не менее, общая рекомендация — сохранять данные именно в onPause. Также здесь останавливают анимацию и другие процессы, грузящие процессор. Определить причину потери фокуса можно методом isFinishing(), который возвращает true, если активность в любом случае должна уничтожиться (нажата кнопка «назад» или вызван метод finish() в коде). 

onSaveInstanceState — сохранение состояния активности. Срабатывает только в том случае, если активность останавливается и может быть убита системой, но фактически ещё нужна. Это происходит, например, при вызове следующей активности, при нажатии кнопки «домой» а также в случае полного разрушения активности и создания её заново в результате изменения конфигурации устройства (смена языка, устройства ввода, ориентации экрана и т.п.). Объект класса Bundle, хранящий состояние активности, передаётся в методы onCreate, onPostCreate и onRestoreInstanceState.

onStop — вызывается перед остановкой активности. Здесь освобождаются объекты, созданные в методе onStart. В версиях Android до 3.x может не срабатывать, если активность, находящаяся не в фокусе, уничтожается из-за острой нехватки памяти.

onDestroy — выполнение окончательной очистки перед уничтожением активности. Здесь освобождают все занятые ресурсы (потоки и пр., созданные в onCreate). Организовывать тут сохранение данных не следует, потому что при нехватке памяти активность может быть убита системой без вызова этого метода. Сохраняйте данные в onPause или в onSaveInstanceState.

onDetachedFromWindow — метод вызывается, когда главное окно активности отключается от оконного  менеджера.

onRestart — подготовка к перезапуску активности. Здесь можно, например, выполнить перезапрос курсоров, деактивированных в onStop, если они не были созданы через managedQuery.

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



Комментариев нет:

Отправить комментарий