Пересоздание явлений

Сейчас мы рассмотрим случай уничтожения явлений в ходе обычной эксплуатации приложения, например при нажатии пользователем кнопки назад или при вызове метода finish(). Система может уничтожить явление в случае, если оно остановлено и не используется долгое время или если другому приложению не хватает памяти.

Если явление уничтожено из-за нажатия кнопки назад или явление само себя завершило, система удалит экземпляр Activity навсегда. Однако, если система уничтожит явление из-за системных ограничений (в обход нормальному функционированию приложения), при его создании данные, описывающее состояние явления будут восстановлены. Данные, которые система использует для восстановления предыдущего состояния называются “состояние экземпляра” и являются коллекцией элементов ключ-значение, хранящихся в объекте типа Bundle.

Внимание: ваше явление уничтожается и создается заново при каждом повороте экрана. Система делает это, поскольку конфигурация экрана меняется и ваше явление может потребовать загрузки альтернативных ресурсов(например разметки).

По умолчанию, система использует экземпляр Bundle для сохранения информации о каждом объекте типа View в разметке явления. В общем, если ваше явление было уничтожено и пересоздано, состояние разметки автоматически восстановится, не требуя вашего вмешательства. Однако, ваше явление может иметь информацию, которую вы не хотите сохранять.

Примечание:Для того, чтобы система восстановила состояние View элементов явления, каждый визуальный компонент типаView должен иметь уникальный идентификатор, заданный с помощью атрибута android:id.

Чтобы хранить дополнительные данные о состоянии явления, необходимо переопределить метод обратного вызова onSaveInstanceState(). Система вызывает данный метод когда пользователь покидает явление и передает ему объект типа Bundle, который будет сохранен в том случае, если явление будет неожиданно уничтожено. Если позже системе понадобится пересоздать экземпляр явления, она передаст данный Bundle объект в методы onRestoreInstanceState() и onCreate().

схема восстановления данных явления

Рисунок 1.Перед остановкой явления система вызывает onSaveInstanceState() (1), в котором вы можете указать дополнительные данные для восстановления состояния. Если явление уничтожено и должно быть пересоздано, система передает данные состояния экземпляра, объявленные в точке (1), в методы onCreate() (2) и onRestoreInstanceState() (3).

Сохранение состояния экземпляра явлений

Перед завершением явления система вызывает метод onSaveInstanceState(), в котором явление сохраняет состояние в виде пар ключ-значение. По умолчанию данный метод сохраняет информацию о состоянии элементов разметки, таких как текстовые поля или позиция скролла у списка.

Для сохранения дополнительной информации необходимо переопределить метод onSaveInstanceState() и добавить нужные пары ключ-значение в объект типа Bundle. Например:

Внимание:Всегда вызывайте метод onSaveInstanceState() базового класса, поскольку он содержит код для сохранения состояния иерархии разметки.

Восстановление состояния экземпляра явлений

Если явление пересоздано после уничтожения, вы можете восстановить его предыдущее состояние из объекта типа Bundle, который система передает в методы onCreate() и onRestoreInstanceState().

Поскольку метод onCreate() вызывается и при первом запуске явления и после его пересоздания, необходимо проверять объект Bundle на null, прежде чем попытаться его прочитать. Если он равен null, система создаст новый экземпляр класса Activity, иначе восстановит его в предыдущее состояние.

Пример восстановления данных состояния в методе onCreate():

Вместо восстановления данных в методе onCreate() вы можете переопределить метод onRestoreInstanceState(), который система вызывает после метода onStart(). Метод onRestoreInstance() система вызывает только в том случае, если есть данные о предыдущем состоянии явления и нет необходимости проверять их наличие внутри метода:

Внимание:Всегда вызывайте метод onRestoreInstanceState() базового класса для того, чтобы восстановить состояние элементов разметки.

Подробнее о пересоздании явлений во время выполнения (например при повороте экрана), читайте в разделе Изменение состояния при выполнении.

Добавить комментарий