A mobilalkalmazás életciklusa meghatározza, hogyan viselkedik az alkalmazás indításkor, minimalizáláskor, háttérből való visszatéréskor és bezáráskor. Ebben a cikkben áttekintjük az App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle és LifecycleOwner fogalmakat. Ezen folyamatok megértése kritikus fontosságú a memóriaszivárgások, adatvesztés és az alkalmazás helytelen működésének megelőzéséhez. További részletek a hivatalos Android Activity Lifecycle dokumentációban.
Főbb pontok
Mielőtt belemennénk az egyes képernyők életciklusába, fontos megérteni a teljes alkalmazás életciklusát. iOS-ben az alkalmazás öt állapoton megy keresztül: Not Running (nem fut), Inactive (háttérben, nem fogad eseményeket), Active (aktív), Background (háttérben, kód fut) és Suspended (háttérben, kód felfüggesztve). Ezeket az állapotokat az AppDelegate kezeli az applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground és applicationWillTerminate metódusokon keresztül.
Androidban az megfelelője az Application Lifecycle, amely az Application.ActivityLifecycleCallbacks interfészen keresztül követhető. Az Android azonban jobban összpontosít egy Activity — egy egyedi alkalmazásképernyő — életciklusára. Ez azért van, mert egy Android-alkalmazás több Activity-ből állhat, mindegyik saját ciklussal.
A modern megközelítés Androidban a ProcessLifecycleOwner használata a lifecycle-process könyvtárból. Lehetővé teszi a teljes folyamat állapotának nyomon követését anélkül, hogy egy adott Activity-hez lenne kötve. iOS-ben az alkalmazás állapotának nyomon követésére a UISceneDelegate (iOS 13-tól) vagy az AppDelegate szolgál. A SceneDelegate több ablakot (multiwindow) kezel iPad-en. Az App Lifecycle megértése különösen fontos az IT Sectr számára háttérszinkronizálással, streameléssel és VoIP-hívásokkal rendelkező alkalmazások fejlesztésekor.
Activity az Android-alkalmazás alapvető összetevője, amely egy képernyőt képvisel. Az Activity-nek egyértelműen meghatározott életciklusa van, amelyet az operációs rendszer kezel a felhasználói műveletekre és rendszereseményekre (képernyő forgatása, bejövő hívás, kevés memória) válaszul.
| Metódus | Leírás | Mit tegyünk |
|---|---|---|
| onCreate | Egyszer hívódik meg az Activity létrehozásakor | UI inicializálása, findViewById, ViewModel beállítása |
| onStart | Az Activity láthatóvá válik | Animációk indítása, BroadCastReceiver regisztrálása |
| onResume | Az Activity bemeneti fókuszt kap | Kamera, érzékelők, animációk indítása |
| onPause | Az Activity elveszti a fókuszt (részben látható) | Piszkozatok mentése, animációk leállítása |
| onStop | Az Activity nem látható | Erőforrások felszabadítása, frissítések leállítása |
| onDestroy | Az Activity megsemmisül | Minden hivatkozás tisztítása, leiratkozás LiveData-ról |
| onRestart | Az onStop után az onStart előtt hívódik | Újrainicializálás |
Fontos: Az onSaveInstanceState az onStop előtt hívódik az átmeneti állapot mentésére. A helyreállítás az onCreate-ben történik a Bundle savedInstanceState vagy a ViewModel-ben lévő SavedStateHandle segítségével. Az életciklus megfelelő kezelése nélkül az alkalmazás elveszíti az összes nem mentett adatot képernyő forgatásakor.
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()
// Отписка от всех подписок
}
}A Jetpack Compose-ban az Activity életciklusa változatlan marad, de a Compose további eszközöket kínál: Életciklus-tudatos kompozíció a LifecycleOwner segítségével, LifecycleEventEffect és DisposableEffect effektek az automatikus erőforrás-tisztításhoz megsemmisítéskor.
Fragment Androidban egy Activity-n belül él, és saját életciklussal rendelkezik, amely részben átfedésben van az Activity-vel, de új metódusokat ad hozzá. A Fragment-ek hozzáadhatók, lecserélhetők, eltávolíthatók az Activity megsemmisítése nélkül, ami rugalmasabbá, de összetettebbé teszi őket.
A Fragment Lifecycle fő metódusai: onAttach — Fragment az Activity-hez csatolva (első hívás); onCreate — adatok inicializálása; onCreateView — View létrehozása; onViewCreated — View létrejött, UI konfigurálható; onStart — Fragment látható; onResume — Fragment fókuszban; onPause — Fragment elveszti a fókuszt; onStop — Fragment nem látható; onDestroyView — View megsemmisül; onDestroy — Fragment megsemmisül; onDetach — Fragment leválasztva az Activity-ről.
Fő különbség az Activity-től: Az onCreateView és onDestroyView többször is meghívható (pl. TabLayout váltásakor), míg az onCreate egyszer hívódik. Ennek megfelelően a View inicializálását az onViewCreated-ben kell végezni, nem az onCreateView-ben. A View-hoz kapcsolódó erőforrásokat (pl. RecyclerView adapterek) az onDestroyView-ben kell tisztítani.
UIViewController az iOS-ben a képernyők kezelésének alaposztálya. Életciklusa metódusok sorozatából áll, amelyeket az UIKit automatikusan meghív. Ennek a ciklusnak a megértése kritikus a helyes UI-inicializáláshoz, adatkezeléshez és memóriakezeléshez.
| Metódus | Mikor hívódik | Tipikus használat |
|---|---|---|
| loadView | Amikor a View Controller betölti a View hierarchiáját | Egyedi inicializálás storyboard nélkül |
| viewDidLoad | Miután a View betöltődött a memóriába (egyszer) | UI beállítása, kezdeti adatok betöltése |
| viewWillAppear | Mielőtt a View megjelenik a képernyőn | Adatok frissítése, feliratkozás értesítésekre |
| viewDidAppear | Miután a View megjelent a képernyőn | Animációk indítása, követési animációk indítása |
| viewWillDisappear | Mielőtt a View eltűnik a képernyőről | Állapot mentése, leiratkozás értesítésekről |
| viewDidDisappear | Miután a View eltűnt a képernyőről | Animációk leállítása, erőforrások felszabadítása |
| dealloc | Amikor a View Controller megsemmisül | Minden erőforrás felszabadítása |
Fontos: A viewDidLoad csak egyszer hívódik meg a View Controller élete során. Az adatok frissítéséhez minden megjelenéskor használja a viewWillAppear-t. Ha feliratkozik a NotificationCenter-re a viewWillAppear-ben, feltétlenül iratkozzon le a viewDidDisappear-ben a memóriaszivárgás elkerülése érdekében.
A SwiftUI a View-k életciklusát View struktúrákon keresztül kezeli. A callback metódusok helyett a SwiftUI a onAppear és onDisappear módosítókat használja. A globális alkalmazásállapotokhoz az App Lifecycle-t használja az App és Scene protokollokon keresztül. A SwiftUI automatikusan kezeli a View-k létrehozását és megsemmisítését az állapot alapján, ami egyszerűsíti a fejlesztést, de megköveteli a View identitásának és élettartamának megértését.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}LifecycleOwner egy interfész az Android Architecture Components-ből, amely egy életciklussal rendelkező objektumot (Activity, Fragment) jelöl meg. LifecycleObserver egy interfész, amely lehetővé teszi egy objektum számára, hogy feliratkozzon a LifecycleOwner eseményeire. Együtt alkotják a reaktív életciklus-kezelés alapját a modern Android-fejlesztésben.
Ahelyett, hogy explicit módon hívnánk metódusokat az onStart/onStop-ban, ajánlott a DefaultLifecycleObserver használata (az elavult LifecycleObserver helyett @OnLifecycleEvent annotációkkal). Ezt a megközelítést a Google támogatja a ViewModel és más összetevők számára, amelyeknek az életciklusra kell reagálniuk anélkül, hogy közvetlen hivatkozásaik lennének az Activity-re vagy Fragment-re.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}Az IT Sectr-nél a LifecycleOwner-t használjuk minden Android-projektben. A ViewModel a viewModelScope és lifecycleScope segítségével iratkozik fel az Activity LifecycleOwner-jére, garantálva a korutinok automatikus törlését az Activity megsemmisülésekor. Ez megakadályozza a memóriaszivárgásokat és tisztábbá, biztonságosabbá teszi a kódot.
Gyakran Ismételt Kérdések
Az Activity hat állapoton megy keresztül: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Sorrend: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. A viewDidLoad egyszer hívódik.
LifecycleOwner egy Android Architecture Components összetevő, amely egy Activity vagy Fragment életciklusának tulajdonosa. Lehetővé teszi az eseményekre való feliratkozást a LifecycleObserver segítségével.
Az iOS-alkalmazás öt állapoton megy keresztül: Not Running, Inactive, Active, Background, Suspended. Az átmeneteket a UIApplicationDelegate kezeli.
Saved State az Android mechanizmusa az Activity/Fragment állapotának megőrzésére képernyő forgatásakor vagy folyamat újraépítésekor. Az onSaveInstanceState-t és SavedStateHandle-t használja.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.