Когда приложение под Android показывает вам экран с кнопкой «Войти», а после нажатия открывает другой экран со списком чатов — за каждый из этих экранов отвечает отдельный Activity. Если вы пишете приложение и не понимаете, почему после поворота телефона введённые данные исчезают, почти всегда причина кроется именно в жизненном цикле Activity.

Activity (активити, «активность») — это базовый компонент Android-приложения, который представляет собой один экран с пользовательским интерфейсом. В этой статье разберём, как он устроен, какие методы жизненного цикла нужно знать и каких ошибок стоит избегать при разработке.

Определение Activity простыми словами

Можно провести аналогию с окнами на компьютере: каждое окно программы — это отдельная «сцена», и в Android такой сценой выступает Activity. Экран авторизации — один Activity, главный экран — второй, экран настроек — третий. Пользователь перемещается между ними, а система управляет их созданием, приостановкой и уничтожением.

С технической точки зрения Activity — это класс, наследуемый от android.app.Activity (или от AppCompatActivity при использовании библиотеки совместимости). Внутри класса разработчик описывает, какой макет интерфейса загрузить и как экран должен реагировать на действия пользователя.

💡

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

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

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

  • 🟢 onCreate() — вызывается при первом создании экрана; здесь загружается макет через setContentView()
  • ▶️ onStart() — экран становится видимым для пользователя
  • ⏸️ onResume() — экран на переднем плане и готов к взаимодействию
  • ⏹️ onPause() — экран частично перекрыт другим окном или диалогом
  • 🛑 onStop() — экран полностью скрыт
  • 🗑️ onDestroy() — экран уничтожается, ресурсы освобождаются

Понимание этой последовательности критично: если сохранить данные формы не в том методе, пользователь потеряет введённый текст при сворачивании приложения или повороте экрана.

⚠️ Внимание: при повороте устройства система по умолчанию уничтожает текущий Activity и создаёт его заново. Все несохранённые данные в полях объекта будут потеряны — используйте onSaveInstanceState() или архитектурные компоненты для их сохранения.
📊 Как вы используете Activity?
Пишу собственные Android-приложения
Только изучаю разработку
Просто хотел понять термин
Использую в учебных проектах

Как создать Activity: базовый пример

Чтобы система узнала о существовании экрана, его необходимо объявить в файле манифеста AndroidManifest.xml. Без этой записи попытка открыть Activity приведёт к падению приложения. Минимальное объявление выглядит так:

<activity android:name=".MainActivity" android:exported="true">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

Сам класс на Kotlin в простейшем виде содержит всего один переопределённый метод:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

}

}

☑️ Проверка перед запуском нового Activity

Выполнено: 0 / 5

Переход между Activity: Intent

Для открытия одного экрана из другого используется механизм Intent (интент, «намерение»). Это объект-сообщение, который говорит системе, какой компонент нужно запустить, и может нести с собой дополнительные данные.

val intent = Intent(this, SettingsActivity::class.java)

intent.putExtra("user_name", "Иван")

startActivity(intent)

Внутри целевого Activity переданные данные извлекаются через intent.getStringExtra("user_name"). Такой подход позволяет экранам обмениваться информацией без прямых ссылок друг на друга, что упрощает архитектуру приложения.

💡

Если нужно получить результат обратно (например, выбранное фото), используйте Activity Result API — метод startActivityForResult() считается устаревшим в современных версиях библиотек.

Activity, Fragment и View: в чём разница

Новички часто путают эти три понятия. Таблица ниже показывает ключевые различия:

КомпонентНазначениеОсобенности
ActivityЭкран-контейнер приложенияУправляется системой, имеет жизненный цикл, объявляется в манифесте
FragmentПереиспользуемая часть интерфейса внутри ActivityИмеет собственный жизненный цикл, зависит от родительского Activity
ViewОтдельный элемент интерфейса (кнопка, текст, список)Рисуется на экране, не имеет самостоятельного жизненного цикла
ServiceФоновая работа без интерфейсаНе показывает экран, работает даже когда приложение свёрнуто

В современной разработке популярен подход Single Activity: приложение содержит один Activity, а экраны реализуются как Fragment или через декларативный UI-фреймворк Jetpack Compose. Это упрощает навигацию и передачу состояния между экранами.

Что такое стек Activity (back stack)

Система хранит открытые Activity в стеке. Когда вы открываете новый экран, он кладётся поверх предыдущего. Нажатие кнопки «Назад» снимает верхний Activity со стека и уничтожает его, возвращая пользователя на предыдущий экран. Поведение стека можно менять через флаги Intent, например FLAG_ACTIVITY_CLEAR_TOP.

Типичные ошибки при работе с Activity

Большинство проблем начинающих разработчиков связано с непониманием жизненного цикла. Вот что стоит проверить в первую очередь, если приложение ведёт себя непредсказуемо:

  • ❌ Вызов setContentView() вне метода onCreate() — макет не инициализируется корректно
  • ❌ Запуск сетевого запроса в onCreate() без учёта пересоздания экрана — запрос дублируется при повороте
  • ❌ Хранение ссылки на Activity в статическом поле — приводит к утечкам памяти
  • ❌ Отсутствие объявления Activity в манифесте — приложение падает с ошибкой при попытке открыть экран
⚠️ Внимание: длительные операции (загрузка файлов, запросы к базе данных) нельзя выполнять в методах жизненного цикла напрямую — это блокирует главный поток и вызывает ошибку ANR («приложение не отвечает»). Используйте корутины, потоки или специальные компоненты вроде WorkManager.
💡

Главное правило: Activity может быть уничтожен системой в любой момент после onStop(). Никогда не храните важные данные только в полях Activity — сохраняйте состояние заранее.

Где встречается термин Activity за пределами Android

Слово «activity» используется и в других контекстах разработки, что иногда сбивает с толку. В UML существуют диаграммы активности (activity diagrams), описывающие последовательность действий процесса. В некоторых фреймворках и BPM-системах «activity» обозначает отдельный шаг бизнес-процесса.

Однако в подавляющем большинстве случаев, когда речь идёт о мобильной разработке, под Activity понимается именно компонент Android. Если вы встретили термин в вакансии Android-разработчика или в документации Google — речь идёт об экране приложения.

Часто задаваемые вопросы

Может ли приложение работать без Activity?

Да, если ему не нужен пользовательский интерфейс. Например, фоновые службы (Service), виджеты или приложения-компаньоны для умных часов могут обходиться без Activity. Но любое приложение с экранами обязано иметь хотя бы один Activity.

Чем отличаются Activity и AppCompatActivity?

AppCompatActivity — наследник базового Activity из библиотеки совместимости AndroidX. Он добавляет поддержку новых возможностей (темы, тулбар) на старых версиях Android. В современных проектах почти всегда используется именно он.

Почему данные пропадают при повороте экрана?

При смене ориентации система по умолчанию уничтожает Activity и создаёт его заново. Чтобы сохранить данные, переопределите onSaveInstanceState() или используйте ViewModel из Android Architecture Components, которая переживает пересоздание экрана.

Сколько Activity должно быть в приложении?

Жёсткого правила нет. Классический подход — отдельный Activity на каждый крупный экран. Современный подход Single Activity предполагает один Activity и набор Fragment или экранов Compose. Выбор зависит от архитектуры проекта и предпочтений команды.

Что происходит с Activity при сворачивании приложения?

Вызываются методы onPause() и onStop(), экран скрывается, но объект обычно остаётся в памяти. Если системе не хватит ресурсов, она может уничтожить процесс целиком — поэтому состояние нужно сохранять заранее, а не в момент закрытия.