понедельник, 24 ноября 2014 г.

Жизненный цикл фрагмента

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



Список перехватываемых методов фрагмента

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

onCreate — инициализация внутренних компонентов фрагмента сохранёнными данными.

onCreateView — формирование компонента для отображения.

onPause — обработка ситуации, когда фрагмент теряет фокус.

Описание всех методов по порядку их вызова:

onAttach — первое подсоединение фрагмента к активности. Сюда передаётся активность, к которой происходит подсоединение.

onCreate — инициализация фрагмента. Сюда передаются данные класса Bundle о последнем состоянии фрагмента в его предыдущей жизни, если таковая была, сохранённые ранее, например, в методе onSaveInstanceState, для восстановления этого состояния. На этот момент активность ещё находится в процессе создания.

onCreateView — формирование вида для отображения. Возвращает вид фрагмента. Может возвращать null для невизуальных компонентов. Сюда передаются данные класса Bundle о последнем состоянии фрагмента, а также контейнер активности, куда будет подключаться фрагмент и «надуватель» разметки.

onViewCreated — вызывается, когда вид сформирован. Сюда передаётся сформированный вид и данные класса Bundle о последнем состоянии фрагмента. Используется для окончательной инициализации вида перед восстановлением сохранённого состояния. В этой точке вид ещё не прикреплён к фрагменту.

onActivityCreated — окончательная инициализация. Вызывется когда метод onCreate() активности был возвращен. Активность создана, фрагмент в неё вставлен. Используется, например, для восстановления состояния фрагмента. Сюда передаются данные класса Bundle о последнем состоянии фрагмента.

onViewStateRestored — инициализация вида на основе сохранённого состояния. Вызывается, когда сохранённое состояние вида восстановлено.

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

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

onPause — обработка ситуации, когда фрагмент теряет фокус. Метод привязан к одноимённому методу жизненного цикла активности. Здесь останавливают анимацию и другие процессы, грузящие процессор.

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

onStop — вызывается перед остановкой фрагмента. Метод привязан к одноимённому методу жизненного цикла активности. Здесь освобождаются объекты, созданные в методе onStart.

onDestroyView — вызывается при отсоединении вида от фрагмента. При следующем отображении фрагмента будет сформирован новый вид.

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

onDetach — вызывается перед отсоединением фрагмента от активности.


суббота, 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.

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