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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.