Android
29
Когда экземпляр
Ac ti vi ty
становится видимым (например, после появления
из-за другого экземпляра
Ac ti vi ty
),
вызывается метод
onStart
. Вызов
onStart
всегда следует за вызовом
onCreate
, но не всем вызовам
onStart
предшествует
вызов
onCreate
.
Метод
onResume
вызывается каждый раз, когда
Ac ti vi ty
получает фокус ввода.
Экземпляр
Ac ti vi ty
может потерять фокус, если содержащее его приложение
будет свернуто, на передний план будет
выведено другое приложение, про
-
изойдет телефонный звонок или даже если поверх содержимого
Ac ti vi ty
по
-
явится диалоговое окно, несмотря на то что большая часть этого содержимого
все еще будет видна. После восстановления фокуса ввода – при закрытии дру
-
гого приложения, прекращении телефонного звонка или закрытии диалога –
будет вызван метод
onResume
. Метод
onResume
всегда следует за
onStart
, но не всем
событиям
onResume
предшествуют события
onStart
.
Теперь пройдемся по другой ветке, ведущей к уничтожению.
Каждый раз, когда
Ac ti vi ty
теряет фокус ввода (см.
onResume
), вызывается ме
-
тод
onPause
.
Ситуация с методом
onStop
сложнее, его смысл часто искажается в ходе обыч
-
ного диалога. Метод
onStop
вызывается при уничтожении
Ac ti vi ty
, но он может
быть воссоздан заново, например когда система отберет и вновь вернет ресур
-
сы приложению. За
onStop
следует событие
onDestroy
(см. ниже) или
onRestart
,
означающее, что
Ac ti vi ty
был восстановлен из сохраненных «подсказок» после
остановки. Всем событиям
onStop
предшествует
onPause
, но не за всеми собы
-
тиями
onPause
следует
onStop
. За более полной информацией об этом событии
обращайтесь к документации (
https://oreil.ly/POytI
). Вот выдержка из докумен
-
тации:
Когда
Ac ti vi ty
больше не виден пользователю, он переходит в состояние
«приостановлен», и
система вызывает
onStop()
. Это может произойти,
например, когда вновь запущенный экземпляр
Ac ti vi ty
охватывает весь
экран. Система может также вызвать
onStop()
, когда
Ac ti vi ty
завершил ра
-
боту и вскоре будет уничтожен.
Метод
onDestroy
вызывается перед уничтожением экземпляра
Ac ti vi ty
, когда
его повторное восстановление не предполагается. Если, находясь в
Ac ti vi ty
, вы
коснетесь кнопки
Назад
, будет вызван метод
onDestroy
. Это подходящее место
для освобождения ресурсов. Всем событиям
onDestroy
предшествует
onStop
, но
не за
всеми событиями
onStop
следует
onDestroy
.
В документации четко указано, что нельзя рассчитывать на
onDestroy
для
осво бождения объемных ресурсов или выполнения асинхронных операций.
Это верно, но многие интерпретируют эти слова как то, что
можно
рассчиты
-
вать на
onStop
или
onPause
, однако это не так. Представьте, что ваше устройство
попало под колесо грузовика (или, что более вероятно, разрядился аккумуля
-
тор). Ваше приложение будет закрыто немедленно, без вызова любых методов
обработки событий жизненного цикла и без всяких шансов на освобождение
ресурсов. Выполнять такую работу в
onPause
ничуть не безопаснее, чем в
onDe
stroy
. Тем не менее, поскольку вызов
onDestroy
, как правило, означает, что
Ac
ti vi ty
вскоре будет уничтожен и утилизирован сборщиком мусора, можно не
беспокоиться о занятых ресурсах, которые и так будут освобождены.
30
Контроллеры пользовательского интерфейса
Экземпляры
Fragment
имеют
очень похожий жизненный цикл, включаю
-
щий дополнительные вызовы
onCreateView
(очень важный – значение, возвра
-
щаемое этим методом, представляющее экземпляр
View
с пользовательским
интерфейсом этого фрагмента) и
onDestroyView
.
Существуют также
onAc ti vi
tyCreated
и другие методы, которые вызываются, когда фрагмент добавляется
(
onAttached
) в пользовательский интерфейс или удаляется из него (
onDetached
)
с использованием методов
FragmentTransaction
.
Обратите внимание, что классы
Fragment
,
FragmentManager
и
FragmentTransaction
претерпели изменения с течением времени. Для согласованности и чтобы га
-
рантировать совместимость с последними версиями ОС, мы рекомендуем ис
-
пользовать классы из библиотеки поддержки. В большинстве случаев они вза
-
имозаменяемы – для этого достаточно просто импортировать
android.support.
v4.app.Fragment
вместо
android.app.Fragment
; вызывая
new
Fragment();
, вы получи
-
те
Fragment
из пакета библиотеки поддержки. Точно так же используйте
android.
support.v7.app.AppCompatAc ti vi ty
вместо
android.app.Ac ti vi ty
, который имеет ме
-
тод
getSupportFragmentManager
, возвращающий
FragmentManager
с
расширенным
API, пригодным для использования с экземплярами
Fragment
из библио теки
поддержки.
Кроме того, доступны также версии AndroidX этих (и некоторых новых)
классов, но на самом деле, даже спустя год разработки, их нельзя назвать ста
-
бильными (хотя среди них есть несколько классов, выпущенных с пометкой
«стабильный»). Библиотеки Jetpack могут выполнять многие из этих функций,
и Google предлагает использовать их в новых проектах, если это возможно, но
не забывайте, что разработка с нуля – явление гораздо более редкое, чем со
-
провождение и дальнейшее развитие. Не стесняйтесь исследовать эти альтер
-
нативы, возможно, какие-то из них лучше подойдут для вас и вашей команды;
мы (авторы) решили продолжать использовать имеющиеся у нас библиотеки
и наборы инструментов просто потому, что они обеспечивают большинство
необходимых нам возможностей. Но со временем ситуация обязательно из
-
менится, поэтому, как в случае с любой технологией, старайтесь идти в ногу со
временем и следовать последним рекомендациям.
iOS
UIKit, фреймворк пользовательского интерфейса, на который опираются поч
-
ти
все приложения для iOS, основан на архитектуре MVC. В iOS контроллер
пользовательского интерфейса (символ «C» в аббревиатуре MVC) – это класс
UIViewController
. В типичном приложении есть несколько экземпляров и под
-
классов
UIViewController
, вместе осуществляющих управление поведением
иерар хии объектов, формирующих представления.
Do'stlaringiz bilan baham: