Activity — какво е, екран на приложение в Android и неговият Lifecycle

Автор: IT Sectr Публикувано: 2026-02-22 Време за четене: 7 мин

Activity — основен компонент на Android приложение, представляващ един екран с потребителски интерфейс. Системата управлява екраните чрез строг жизнен цикъл — callback-ите onCreate, onResume и onDestroy. Всяко Activity се декларира в AndroidManifest.xml и се стартира чрез Intent. Прочетете повече за историята на Android в официалната документация на Google.

Основни точки

  • Activity — компонент на Android, представляващ един екран с UI. Управлява се чрез Lifecycle
  • Жизнен цикъл включва 6 callback-а: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • Intent — механизъм за стартиране на Activity и прехвърляне на данни между екрани
  • Manifest — задължителна регистрация на всяко Activity в AndroidManifest.xml
  • ViewModel — компонент на Jetpack за запазване на данни при повторно създаване на Activity

Какво е Activity?

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

Жизненият цикъл на Activity — набор от състояния и callback-и, през които екранът преминава от създаване до унищожаване. Разбирането на Lifecycle е критично: неправилната работа със състояния води до изтичане на памет, загуба на данни и сривове на приложението.

Android системата извиква callback-ите в строг ред. Разработчикът предефинира необходимите методи, за да инициализира ресурси, да запази данни и да освободи памет. Всеки callback има двойка: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.

CallbackПредназначениеДействие на разработчика
onCreateИзвиква се при създаване на ActivityИнициализация на UI, абонамент за ViewModel
onStartActivity става видимоСтартиране на анимации, камера, GPS
onResumeActivity получава фокус за въвежданеВъзобновяване на видео, таймери
onPauseActivity губи фокусЗапазване на чернови, спиране на анимации
onStopActivity скрито от друг екранОсвобождаване на тежки ресурси
onDestroyActivity се унищожаваПочистване на абонаменти, Closeable

Състояния на Activity

Различават се четири състояния на Activity: Running (onResume активен), Paused (видимо, но без фокус), Stopped (невидимо), Destroyed (унищожено). Системата може да убие Activity в състояние Stopped при липса на памет — данните трябва да се запазят в onSaveInstanceState.

Методи на жизнения цикъл: onCreate, onStart, onResume

Нека разгледаме три ключови метода на жизнения цикъл на Activity с пример на Kotlin. onCreate — входна точка, извиква се веднъж. Тук става свързването на layout чрез setContentView, инициализация на RecyclerView, абонамент за LiveData. onStart — Activity става видимо за потребителя. onResume — Activity получава фокус и е готово за взаимодействие.

kotlin
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

Всяко Activity трябва да бъде декларирано във файла AndroidManifest.xml. Без регистрация системата няма да намери екрана и ще хвърли изключение ActivityNotFoundException. В манифеста се задават име на класа, тема, ориентация, launchMode и филтри на Intent.

xml
<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).

Стартиране на Activity чрез Intent

Intent — обект, описващ действие, което трябва да се изпълни. В контекста на Activity, Intent се използва за стартиране на друг екран с прехвърляне на данни. Intent може да бъде явен (посочва конкретен клас) и неявен (посочва действие, системата избира подходящия компонент).

kotlin
// Явен 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.

kotlin
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 и съхранява данни в паметта, което е по-ефективно за сложни обекти и мрежови заявки.

kotlin
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())
    }
}

Архитектура Single Activity и Jetpack

Съвременният подход на Google — архитектура Single Activity с едно Activity и множество Fragment. Приложението използва едно MainActivity, а цялата навигация се извършва от Navigation Component чрез NavHostFragment. Предимства: централизирана навигация, общ ViewModel на екран, коректна работа с Deep Links.

Jetpack Navigation Component автоматизира работата с back stack, анимациите на преходи и предаването на аргументи. NavHostFragment се поставя в layout на Activity, а навигационният граф (NavGraph) описва всички екрани и връзките между тях. Този подход се препоръчва от Google за нови проекти и съответства на принципите на Material Design.

kotlin
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?

Activity — пълноценен екран на приложение със собствен жизнен цикъл. Fragment — част от UI вътре в Activity, която издържа на пресъздаване на Activity и зависи от неговия Lifecycle. Activity е задължително, Fragment е опционален.

Колко Activity може да има в едно приложение?

Няма ограничения. Всеки екран обикновено представлява отделно Activity. За просто приложение е достатъчно едно, за многоекранни — от 5 до 20. Google препоръчва едно Activity с множество Fragment.

Какво е launchMode в Activity?

launchMode определя как Activity се създава в стека от задачи. Четири режима: standard (създава се нова инстанция), singleTop, singleTask (една инстанция в задачата) и singleInstance (изолирана задача). Режимът се задава в AndroidManifest.xml.

Как да прехвърля данни между Activity?

Чрез Intent — обект с екстри (putExtra), в които се поставят примитиви, низове, Parcelable или Serializable. За обратна връзка се използва Activity Result API — съвременна типобезопасна замяна на startActivityForResult.

Какво е Configuration Change в Android?

Configuration Change — пресъздаване на Activity при промяна на конфигурацията (завъртане на екрана, смяна на език, клавиатура). Системата извиква onDestroy → onCreate. За запазване на данни се използва onSaveInstanceState или ViewModel от Jetpack.

Обобщение

  • Activity — основен компонент на Android, представляващ един екран с потребителски интерфейс и управляван чрез жизнения цикъл
  • Жизнен цикъл се състои от шест callback-а: onCreate, onStart, onResume, onPause, onStop, onDestroy — всеки със строго предназначение
  • Intent осигурява стартиране на Activity и прехвърляне на данни между екрани чрез явни и неявни извиквания
  • AndroidManifest.xml изисква задължителна регистрация на всяко Activity с име, тема, ориентация и филтри
  • ViewModel от Jetpack запазва данни при пресъздаване на Activity, замествайки ръчното запазване в onSaveInstanceState
  • Архитектура Single Activity с Navigation Component — съвременен стандарт, препоръчан от Google за Android проекти
  • launchMode управлява поведението на Activity в стека от задачи: от стандартен до singleInstance за изолирани екрани

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също