Вступай в группу во "ВКонтакте"!

Вступай в группу во "ВКонтакте"!

четверг, 17 ноября 2011 г.

Поворот устройства и дальнейшая работа Activity


           Любопытный момент - наподобие небольшого открытия сделали с товарищем, совместно делая приложение (игрушку). Некий абстрактный класс представляет собой наследника Activity (назовём его MyActivity). Реализует некие действия, отображает пользователю разметку, пользователь взаимодействует с элементами разметки и.. поворачивает в пространстве телефон (можно сэмулировать из-под Eclipse'а комбинацией Ctrl-F11 в Винде), что же происходит?!?!
              Разметка перестраивается и приложение через мгновения неожиданно валится!.. Смотрим лог.



               NullPointerException. Некий метод в другом классе, берущем объекты из MyActivity уже ссылается на нечто пустое. Что же произошло? Все объекты удалились, GC освободил память под дальнейшую работу.
Логируем буквально все callback-методы нашей рабочей активити:
- задаем сообщение в лог о создании/пересоздании активити. onCreate(), тобишь;
- задаем сообщение в лог об уничтожении нашей активити. onDestroy(), надо думать;
- ... лог всего, что происходит при переходах, повороте экрана.

Портретный режим. Производим некие действия..

Начальный лог показывает создание данного Activity

                   Приводим здесь результаты отслеживания поворота и лога сообщений в DDMS:
Повернули экран!

Наблюдаем наш лог. Callback-методы onDestroy-onCreate сработали.
     
            А произошло вот что. Заново сработал метод Activity - onCreate()! Вот это да..Оказывается, Activity удаляется при смене конфигурации, заново создается, стартуется, вообщем идет полный цикл жизни Activity от начала.
Это теоретически и документально подтверждается в свеже-задаренной мне книге у Рето Майера:
" При изменении языка, региона или аппаратной конфигурации Android прерывает работу всех приложений и затем запускает из повторно, перезагружая значения из ресурсов. " 
И тут же указывают возможные пути обработки или даже избегания такого явления:
" Чтобы заставить Activity отслеживать изменения конфигурации при выполнении программы, добавьте ее узел в манифесте атрибут android:condigChanged, указав, какие именно события хотите обрабатывать:
- orientation - положение экрана изменено с портретного на альбомное (или наоборот);
- keyboardHidden - клавиатура выдвинута или спрятана
- fontScale - пользователь изменил предпочтительный размер шрифта
.. "
         Надеюсь, кому-то это было в новость и сильно облегчит понимание логики работы android-приложения. Мотайте на ус, ребятки-девчатки.

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

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