Когда приложение под 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: базовый пример
Чтобы система узнала о существовании экрана, его необходимо объявить в файле манифеста 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
Переход между 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(), экран скрывается, но объект обычно остаётся в памяти. Если системе не хватит ресурсов, она может уничтожить процесс целиком — поэтому состояние нужно сохранять заранее, а не в момент закрытия.