Животни циклус мобилне апликације одређује како се понаша при покретању, смањивању, повратку из позадине и затварању. У овом чланку ћемо обрадити App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle и LifecycleOwner. Разумевање ових процеса је критично важно за спречавање цурења меморије, губитка података и неисправног рада апликације. Више детаља у званичној документацији Android Activity Lifecycle.
Главно
Пре него што се упустимо у животни циклус појединачних екрана, важно је разумети животни циклус целе апликације. У iOS-у, апликација пролази кроз пет стања: Not Running (није покренута), Inactive (у позадини, не прима догађаје), Active (активна), Background (у позадини, код се извршава) и Suspended (у позадини, код је суспендован). Ова стања се управљају у AppDelegate-у кроз методе applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground и applicationWillTerminate.
У Android-у, еквивалент је Application Lifecycle, који се прати кроз интерфејс Application.ActivityLifecycleCallbacks. Међутим, Android се више фокусира на животни циклус Activity — појединачног екрана апликације. То је зато што Android апликација може да се састоји од више Activity-ја, сваки са својим циклусом.
Модерни приступ у Android-у је коришћење ProcessLifecycleOwner из библиотеке lifecycle-process. Он омогућава праћење стања целог процеса без везивања за одређену Activity. У iOS-у се за праћење стања апликације користи UISceneDelegate (од iOS 13) или AppDelegate. SceneDelegate управља са више прозора (multiwindow) на iPad-у. Разумевање App Lifecycle-а је посебно важно за IT Sectr при развоју апликација са позадинском синхронизацијом, стримингом и VoIP позивима.
Activity је основни компонент Android апликације који представља један екран. Activity има јасно дефинисан животни циклус којим управља оперативни систем као одговор на радње корисника и системске догађаје (ротација екрана, долазни позив, недостатак меморије).
| Метод | Опис | Шта радити |
|---|---|---|
| onCreate | Позива се једном при креирању Activity | Иницијализација UI, findViewById, подешавање ViewModel |
| onStart | Activity постаје видљива | Покретање анимација, регистрација BroadCastReceiver |
| onResume | Activity добија фокус уноса | Покретање камере, сензора, анимација |
| onPause | Activity губи фокус (делимично видљива) | Чување нацрта, заустављање анимација |
| onStop | Activity није видљива | Ослобађање ресурса, заустављање ажурирања |
| onDestroy | Activity се уништава | Чишћење свих референци, отказати претплату на LiveData |
| onRestart | Позива се пре onStart након onStop | Поновна иницијализација |
Важно: onSaveInstanceState се позива пре onStop да би сачувао привремено стање. Враћање се дешава у onCreate-у путем Bundle savedInstanceState или путем SavedStateHandle у ViewModel-у. Без правилног управљања животним циклусом, апликација ће изгубити све несачуване податке при ротацији екрана.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}
У Jetpack Compose-у, животни циклус Activity остаје непромењен, али Compose пружа додатне алате: Композицију свесну животног циклуса путем LifecycleOwner, ефекте LifecycleEventEffect и DisposableEffect за аутоматско чишћење ресурса при уништавању.
Fragment у Android-у живи унутар Activity и има свој животни циклус, који се делимично поклапа са Activity, али додаје нове методе. Fragment-и могу бити додати, замењени, уклоњени без уништавања Activity, што их чини флексибилнијим, али и сложенијим.
Кључне методе Fragment Lifecycle-а: onAttach — Fragment прикачен на Activity (први позив); onCreate — иницијализација података; onCreateView — креирање View; onViewCreated — View креирана, UI може да се конфигурише; onStart — Fragment видљив; onResume — Fragment у фокусу; onPause — Fragment губи фокус; onStop — Fragment није видљив; onDestroyView — View се уништава; onDestroy — Fragment се уништава; onDetach — Fragment одкачен од Activity.
Кључна разлика од Activity: onCreateView и onDestroyView могу бити позвани више пута (нпр. при пребацивању TabLayout), док се onCreate позива једном. Сходно томе, иницијализацију View треба радити у onViewCreated, а не у onCreateView. Ресурси везани за View (попут RecyclerView адаптера) треба да се чисте у onDestroyView.
UIViewController је основна класа за управљање екранима у iOS-у. Његов животни циклус се састоји од низа метода које UIKit аутоматски позива. Разумевање овог циклуса је критично за правилну иницијализацију UI-ја, управљање подацима и меморијом.
| Метод | Када се позива | Типична употреба |
|---|---|---|
| loadView | Када View Controller учитава своју хијерархију View | Прилагођена иницијализација без storyboard |
| viewDidLoad | Након учитавања View у меморију (једном) | Подешавање UI, учитавање почетних података |
| viewWillAppear | Пре појављивања View на екрану | Ажурирање података, претплата на обавештења |
| viewDidAppear | Након појављивања View на екрану | Покретање анимација, покретање анимација праћења |
| viewWillDisappear | Пре нестанка View са екрана | Чување стања, отказати претплату на обавештења |
| viewDidDisappear | Након нестанка View са екрана | Заустављање анимација, ослобађање ресурса |
| dealloc | Када се View Controller уништава | Ослобађање свих ресурса |
Важно: viewDidLoad се позива само једном у животу View Controller-а. За ажурирање података при сваком појављивању користите viewWillAppear. Ако се претплаћујете на NotificationCenter у viewWillAppear, обавезно се одјавите у viewDidDisappear да бисте избегли цурење меморије.
SwiftUI управља животним циклусом View-а кроз структуре View. Уместо метода повратног позива, SwiftUI користи модификаторе onAppear и onDisappear. За глобална стања апликације користи се App Lifecycle кроз протоколе App и Scene. SwiftUI аутоматски управља креирањем и уништавањем View-а на основу стања, што поједностављује развој, али захтева разумевање идентитета и животног века View-а.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner је интерфејс из Android Architecture Components који означава објекат који има животни циклус (Activity, Fragment). LifecycleObserver је интерфејс који омогућава објекту да се претплати на догађаје LifecycleOwner-а. Заједно чине основу реактивног управљања животним циклусом у модерном Android развоју.
Уместо експлицитног позивања метода у onStart/onStop, препоручује се коришћење DefaultLifecycleObserver (замена за застарели LifecycleObserver са @OnLifecycleEvent анотацијама). Ово је приступ који промовише Google за ViewModel и друге компоненте које треба да реагују на животни циклус без директних референци на Activity или Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
У IT Sectr-у користимо LifecycleOwner у свим Android пројектима. ViewModel се претплаћује на LifecycleOwner Activity-ја путем viewModelScope и lifecycleScope, што гарантује аутоматско отказивање корутина при уништавању Activity-ја. Ово спречава цурење меморије и чини код чистијим и сигурнијим.
Често постављана питања
Activity пролази кроз шест стања: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Редослед: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad се позива једном.
LifecycleOwner је компонента Android Architecture Components која поседује животни циклус Activity-ја или Fragment-а. Омогућава претплату на догађаје путем LifecycleObserver-а.
iOS апликација пролази кроз пет стања: Not Running, Inactive, Active, Background, Suspended. Транзиције се управљају путем UIApplicationDelegate-а.
Saved State је механизам Android-а за чување стања Activity/Fragment при ротацији екрана или поновном креирању процеса. Користи onSaveInstanceState и SavedStateHandle.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.