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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође