Activity — основен компонент на Android приложение, представляващ един екран с потребителски интерфейс. Системата управлява екраните чрез строг жизнен цикъл — callback-ите 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 — набор от състояния и callback-и, през които екранът преминава от създаване до унищожаване. Разбирането на Lifecycle е критично: неправилната работа със състояния води до изтичане на памет, загуба на данни и сривове на приложението.
Android системата извиква callback-ите в строг ред. Разработчикът предефинира необходимите методи, за да инициализира ресурси, да запази данни и да освободи памет. Всеки callback има двойка: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.
| Callback | Предназначение | Действие на разработчика |
|---|---|---|
| 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също