Activity — базовый компонент Android-приложения, представляющий один экран с пользовательским интерфейсом. Система управляет экранами через строгий жизненный цикл — колбэки onCreate, onResume и onDestroy. Каждое Activity объявляется в AndroidManifest.xml и запускается через Intent. Подробнее об истории Android читайте в официальной документации Google.
Главное
Activity — ключевой компонент Android-приложения, предоставляющий окно для взаимодействия с пользователем. Каждое Activity управляет отдельным экраном: список задач, форма входа, просмотр фото. Система Android создаёт Activity при запросе и уничтожает, когда память нужна другим приложениям.
Впервые Activity появилось в Android 1.0 (2008) и остаётся основным строительным блоком интерфейса. По данным Google (2026), 98% приложений в Google Play содержат минимум одно Activity. В современной архитектуре Google рекомендует один Activity с множеством Fragment, однако классическое многокранное приложение остаётся распространённой практикой.
Activity stack (back stack) — стек задач, который хранит историю переходов. Когда пользователь нажимает «Назад», текущее Activity уничтожается, и восстанавливается предыдущее. Система управляет стеком автоматически, но разработчик может контролировать поведение через launchMode и флаги Intent.
Жизненный цикл Activity — набор состояний и колбэков, через которые проходит экран от создания до уничтожения. Понимание Lifecycle критически важно: неверная работа с состояниями приводит к утечкам памяти, потерям данных и вылетам приложения.
Система Android вызывает колбэки в строгом порядке. Разработчик переопределяет нужные методы, чтобы инициализировать ресурсы, сохранять данные и освобождать память. Каждому колбэку соответствует пара: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.
| Колбэк | Назначение | Действие разработчика |
|---|---|---|
| onCreate | Вызывается при создании Activity | Инициализация UI, подписка на ViewModel |
| onStart | Activity становится видимой | Запуск анимаций, камеры, GPS |
| onResume | Activity получает фокус ввода | Возобновление видео, таймеров |
| onPause | Activity теряет фокус | Сохранение черновиков, остановка анимаций |
| onStop | Activity скрыто другим экраном | Освобождение тяжёлых ресурсов |
| onDestroy | Activity уничтожается | Очистка подписок, Closeable |
Различают четыре состояния Activity: Running (onResume активен), Paused (видимо, но без фокуса), Stopped (не видимо), Destroyed (уничтожено). Система может убить Activity в состоянии Stopped при нехватке памяти — данные необходимо сохранить в onSaveInstanceState.
Рассмотрим три ключевых метода жизненного цикла Activity с примером на Kotlin. onCreate — точка входа, вызывается один раз. Здесь происходит связывание layout через setContentView, инициализация RecyclerView, подписка на LiveData. onStart — Activity становится видимой для пользователя. onResume — Activity получает фокус и готово к взаимодействию.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
loadItems()
}
override fun onStart() {
super.onStart()
startLocationUpdates()
}
override fun onResume() {
super.onResume()
resumeVideoPlayer()
}
}В примере onCreate инициализирует RecyclerView и загружает данные. onStart запускает обновление геолокации — ресурс, который должен работать только когда экран видим. onResume возобновляет видео, остановленное в onPause. Такое разделение предотвращает лишнюю работу в фоне.
Каждое Activity должно быть объявлено в файле AndroidManifest.xml. Без регистрации система не найдёт экран и выбросит исключение ActivityNotFoundException. В манифесте задаются имя класса, тема, ориентация, launchMode и фильтры Intent.
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<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>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity" />
</application>Флаг exported определяет, могут ли другие приложения запускать Activity. Для основного экрана exported=true, для внутренних экранов — false. Атрибут parentActivityName включает стандартную навигацию «Наверх» (Up Navigation).
Intent — объект, описывающий действие, которое нужно выполнить. В контексте Activity Intent используется для запуска другого экрана с передачей данных. Intent бывает явным (указывает конкретный класс) и неявным (указывает действие, система подбирает подходящий компонент).
// Явный Intent — запуск DetailActivity с данными
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("item_id", itemId)
putExtra("item_name", itemName)
}
startActivity(intent)
// Получение данных в DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""Для получения результата от запущенного Activity используется Activity Result API, заменивший устаревший startActivityForResult. Новый API типобезопасен, декларативен и работает с Jetpack Compose.
private val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
}
}
fun openPicker() {
val intent = Intent(this, PickerActivity::class.java)
getResult.launch(intent)
}При повороте экрана или смене конфигурации Android пересоздаёт Activity — последовательно вызывает onDestroy и onCreate. Без сохранения состояния пользователь теряет введённые данные, позицию скролла и выбранные элементы. Для решения этой проблемы Android предоставляет два механизма: onSaveInstanceState и ViewModel.
onSaveInstanceState сохраняет простые данные в Bundle до вызова onDestroy. ViewModel из Jetpack выдерживает пересоздание Activity и хранит данные в памяти, что эффективнее для сложных объектов и сетевых запросов.
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel автоматически сохраняет данные
viewModel.items.observe(this) { items ->
updateAdapter(items)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
}
}Современный подход от Google — Single Activity архитектура с одним Activity и множеством Fragment. Приложение использует одно MainActivity, а всю навигацию выполняет Navigation Component через NavHostFragment. Преимущества: централизованная навигация, общий ViewModel на экран, корректная работа с Deep Links.
Jetpack Navigation Component автоматизирует работу с back stack, анимации переходов и передачу аргументов. NavHostFragment размещается в layout Activity, а граф навигации (NavGraph) описывает все экраны и связи между ними. Такой подход рекомендован Google для новых проектов и соответствует принципам Material Design.
class MainActivity : AppCompatActivity() {
private val navController by lazy {
findViewById<NavHostFragment>(R.id.nav_host_fragment)
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Настройка NavigationUI для AppBar
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}Часто задаваемые вопросы
Activity — полноценный экран приложения с собственным жизненным циклом. Fragment — часть UI внутри Activity, которая переживает пересоздание Activity и зависит от его Lifecycle. Activity обязателен, Fragment опционален.
Ограничений нет. Каждый экран обычно представляет отдельное Activity. Для простого приложения достаточно одного, для многокранных — от 5 до 20. Google рекомендует один Activity с множеством Fragment.
launchMode определяет, как Activity создаётся в стеке задач. Четыре режима: standard (создаётся новый экземпляр), singleTop, singleTask (один экземпляр в задаче) и singleInstance (изолированная задача). Режим задаётся в AndroidManifest.xml.
Через Intent — объект с экстрами (putExtra), в которые помещаются примитивы, строки, Parcelable или Serializable. Для обратной связи используется Activity Result API — современная типобезопасная замена startActivityForResult.
Configuration Change — пересоздание Activity при изменении конфигурации (поворот экрана, смена языка, клавиатура). Система вызывает onDestroy → onCreate. Для сохранения данных используется onSaveInstanceState или ViewModel из Jetpack.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.