Жизненный цикл Activity

Activity проходит через предсказуемую последовательность состояний — от onCreate до onDestroy, — и понимание этих колбэков помогает корректно управлять ресурсами и не терять данные.
Суть: система может в любой момент приостановить, остановить или уничтожить экран, поэтому знание жизненного цикла защищает от утечек памяти и потери состояния.

Android — система с ограниченными ресурсами, и она активно управляет тем, какие экраны активны. Когда пользователь открывает приложение, сворачивает его, поворачивает экран или принимает звонок, Activity переходит между состояниями. На каждый переход система вызывает соответствующий колбэк, давая вам шанс отреагировать.

Ключевые колбэки идут парами. onCreate — создание экрана, здесь настраивают интерфейс; парный ему onDestroy — уничтожение. onStart делает экран видимым, onStop — невидимым. onResume переводит в активное взаимодействие, onPause приостанавливает.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // настройка UI: setContent { ... } для Compose
    }
    override fun onResume() {
        super.onResume()
        // экран на переднем плане: запустить анимации, обновления
    }
    override fun onPause() {
        super.onPause()
        // уходим с экрана: остановить то, что не нужно в фоне
    }
}

Диаграмма жизненного цикла

  Запуск
    |
    v
  onCreate()  --> создание, настройка UI
    |
    v
  onStart()   --> экран становится видимым
    |
    v
  onResume()  --> пользователь взаимодействует
    |
    |   [пользователь работает с экраном]
    v
  onPause()   --> экран теряет фокус
    |
    v
  onStop()    --> экран не виден
    |
    v
  onDestroy() --> экран уничтожается

Как работает под капотом

После onCreate система быстро вызывает onStart и onResume подряд — экран появляется и сразу готов к работе. При сворачивании приложения порядок обратный: onPause, затем onStop. Особый случай — поворот экрана: по умолчанию Activity пересоздаётся (onDestroy → onCreate), и несохранённое состояние теряется. Именно поэтому состояние нужно держать не в полях Activity, а в ViewModel, которая переживает поворот, — об этом будет отдельный урок.

Зачем это знать в эпоху Compose

Даже в single-activity приложении на Compose жизненный цикл никуда не исчезает: вся Compose-иерархия живёт внутри одной Activity. Понимание колбэков нужно, чтобы правильно освобождать ресурсы (камеру, геолокацию, подписки), приостанавливать тяжёлую работу, когда экран не виден, и не терять данные при пересоздании. Compose дополнительно предлагает lifecycle-aware инструменты, чтобы собирать данные только когда экран на переднем плане.

Частые ошибки

Хранить важные данные в полях Activity. При повороте экрана Activity пересоздаётся, и данные теряются. Решение — ViewModel.

Не освобождать ресурсы. Камера или подписка, не закрытая в onPause/onStop, ведёт к утечкам и разряду батареи.

Делать тяжёлую работу в onCreate. Долгие операции в onCreate тормозят запуск; выносите их в фон.

Best practices

  • Состояние, переживающее поворот, держите в ViewModel, а не в Activity.
  • Освобождайте ресурсы в парных колбэках (взяли в onStart — отдали в onStop).
  • Не блокируйте onCreate тяжёлыми операциями.
  • Для сбора данных в Compose используйте lifecycle-aware подход (collectAsStateWithLifecycle).

Логику переходов между состояниями удобно смоделировать как простой конечный автомат на Python. Запустите врезку.

# Аналог переходов жизненного цикла Activity
transitions = {
    'created':   'started',
    'started':   'resumed',
    'resumed':   'paused',
    'paused':    'stopped',
    'stopped':   'destroyed',
}

state = 'created'
print('onCreate ->', state)
while state in transitions:
    state = transitions[state]
    print('on' + state.capitalize(), '->', state)

Попробуй сам ▶ — добавьте возврат из stopped обратно в started (приложение снова открыли). В реальном Android система так и делает, когда пользователь возвращается к свёрнутому приложению.

Итог: Activity живёт по предсказуемому сценарию из парных колбэков. Понимание этого цикла защищает от утечек и потери данных, а сохранение состояния мы доверим ViewModel. Дальше — первая встреча с Jetpack Compose.

Проверьте себя
1. Что произойдёт с обычной Activity при повороте экрана по умолчанию?
AНичего, состояние сохраняется автоматически в полях
BActivity пересоздаётся (onDestroy, затем onCreate), и несохранённое состояние теряется
CПриложение закрывается
DВызывается только onResume
2. В каком колбэке Activity становится видимой пользователю?
AonCreate
BonStart
ConDestroy
DonPause