Životní cyklus mobilní aplikace určuje, jak se chová při spuštění, minimalizaci, návratu z pozadí a zavření. V tomto článku si projdeme App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle a LifecycleOwner. Porozumění těmto procesům je kriticky důležité pro prevenci úniků paměti, ztráty dat a nesprávného chování aplikace. Více podrobností v oficiální dokumentaci Android Activity Lifecycle.
Hlavní body
Než se ponoříme do životního cyklu jednotlivých obrazovek, je důležité pochopit životní cyklus celé aplikace. V iOS aplikace prochází pěti stavy: Not Running (neběží), Inactive (na pozadí, nepřijímá události), Active (aktivní), Background (na pozadí, kód se provádí) a Suspended (na pozadí, kód je pozastaven). Tyto stavy jsou spravovány v AppDelegate prostřednictvím metod applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground a applicationWillTerminate.
V Androidu je ekvivalentem Application Lifecycle, sledovaný prostřednictvím rozhraní Application.ActivityLifecycleCallbacks. Android se však více zaměřuje na životní cyklus Activity — jednotlivé obrazovky aplikace. Je to proto, že aplikace pro Android může sestávat z více Activities, každá s vlastním cyklem.
Moderní přístup v Androidu je použití ProcessLifecycleOwner z knihovny lifecycle-process. Umožňuje sledovat stav celého procesu bez vazby na konkrétní Activity. V iOS se pro sledování stavu aplikace používá UISceneDelegate (od iOS 13) nebo AppDelegate. SceneDelegate zpracovává více oken (multiwindow) na iPadu. Porozumění App Lifecycle je obzvláště důležité pro IT Sectr při vývoji aplikací s background synchronizací, streamováním a VoIP hovory.
Activity je základní komponenta aplikace pro Android představující jednu obrazovku. Activity má jasně definovaný životní cyklus spravovaný operačním systémem v reakci na akce uživatele a systémové události (otočení obrazovky, příchozí hovor, nedostatek paměti).
| Metoda | Popis | |
|---|---|---|
| onCreate | Voláno jednou při vytvoření Activity | Inicializace UI, findViewById, nastavení ViewModel |
| onStart | Activity se stává viditelnou | Spuštění animací, registrace BroadCastReceiver |
| onResume | Activity získává vstupní fokus | Spuštění kamery, senzorů, animací |
| onPause | Activity ztrácí fokus (částečně viditelná) | Uložení konceptů, zastavení animací |
| onStop | Activity není viditelná | Uvolnění prostředků, zastavení aktualizací |
| onDestroy | Activity je zničena | Vyčištění všech referencí, odhlášení odběru LiveData |
| onRestart | Voláno před onStart po onStop | Opětovná inicializace |
Důležité: onSaveInstanceState je voláno před onStop pro uložení dočasného stavu. Obnovení probíhá v onCreate prostřednictvím Bundle savedInstanceState nebo prostřednictvím SavedStateHandle ve ViewModel. Bez správného zpracování životního cyklu aplikace při otočení obrazovky ztratí všechna neuložená data.
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()
// Отписка от всех подписок
}
}V Jetpack Compose zůstává životní cyklus Activity nezměněn, ale Compose poskytuje další nástroje: Složení uvědomující si životní cyklus prostřednictvím LifecycleOwner, efekty LifecycleEventEffect a DisposableEffect pro automatické čištění prostředků při zničení.
Fragment v Androidu žije uvnitř Activity a má vlastní životní cyklus, který se částečně překrývá s Activity, ale přidává nové metody. Fragmenty lze přidávat, nahrazovat, odstraňovat bez zničení Activity, což je činí flexibilnějšími, ale také složitějšími.
Klíčové metody Fragment Lifecycle: onAttach — Fragment připojen k Activity (první volání); onCreate — inicializace dat; onCreateView — vytvoření View; onViewCreated — View vytvořeno, UI lze konfigurovat; onStart — Fragment viditelný; onResume — Fragment v fokusu; onPause — Fragment ztrácí fokus; onStop — Fragment není viditelný; onDestroyView — View zničeno; onDestroy — Fragment zničen; onDetach — Fragment odpojen od Activity.
Klíčový rozdíl od Activity: onCreateView a onDestroyView mohou být volány vícekrát (např. při přepínání TabLayout), zatímco onCreate je volán jednou. Inicializace View by proto měla být provedena v onViewCreated, ne v onCreateView. Prostředky související s View (jako adaptéry RecyclerView) by měly být vyčištěny v onDestroyView.
UIViewController je základní třída pro správu obrazovek v iOS. Jeho životní cyklus se skládá z posloupnosti metod, které UIKit volá automaticky. Porozumění tomuto cyklu je klíčové pro správnou inicializaci UI, správu dat a paměti.
| Metoda | Kdy je volána | |
|---|---|---|
| loadView | Když View Controller načítá svou hierarchii View | Vlastní inicializace bez storyboard |
| viewDidLoad | Po načtení View do paměti (jednou) | Nastavení UI, načtení počátečních dat |
| viewWillAppear | Před zobrazením View na obrazovce | Aktualizace dat, přihlášení k odběru oznámení |
| viewDidAppear | Po zobrazení View na obrazovce | Spuštění animací, spuštění sledovacích animací |
| viewWillDisappear | Před zmizením View z obrazovky | Uložení stavu, odhlášení odběru oznámení |
| viewDidDisappear | Po zmizení View z obrazovky | Zastavení animací, uvolnění prostředků |
| dealloc | Když je View Controller zničen | Uvolnění všech prostředků |
Důležité: viewDidLoad je voláno pouze jednou za životnost View Controlleru. Pro aktualizaci dat při každém zobrazení použijte viewWillAppear. Pokud se přihlašujete k odběru NotificationCenter ve viewWillAppear, nezapomeňte se odhlásit ve viewDidDisappear, abyste předešli únikům paměti.
SwiftUI spravuje životní cyklus View pomocí struktur View. Místo callback metod SwiftUI používá modifikátory onAppear a onDisappear. Pro globální stavy aplikace se používá App Lifecycle prostřednictvím protokolů App a Scene. SwiftUI automaticky spravuje vytváření a ničení View na základě stavu, což zjednodušuje vývoj, ale vyžaduje pochopení identity a životnosti View.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}LifecycleOwner je rozhraní z Android Architecture Components, které označuje objekt mající životní cyklus (Activity, Fragment). LifecycleObserver je rozhraní, které umožňuje objektu přihlásit se k odběru událostí LifecycleOwner. Společně tvoří základ reaktivního řízení životního cyklu v moderním vývoji pro Android.
Místo explicitního volání metod v onStart/onStop se doporučuje použít DefaultLifecycleObserver (náhrada za zastaralý LifecycleObserver s anotacemi @OnLifecycleEvent). Toto je přístup prosazovaný Googlem pro ViewModel a další komponenty, které potřebují reagovat na životní cyklus bez přímých referencí na Activity nebo Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}V IT Sectr používáme LifecycleOwner ve všech Android projektech. ViewModel se přihlásí k odběru LifecycleOwner Activity prostřednictvím viewModelScope a lifecycleScope, což zaručuje automatické zrušení korutin při zničení Activity. Tím se předchází únikům paměti a kód je čistší a bezpečnější.
Často kladené dotazy
Activity prochází šesti stavy: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Pořadí: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad je voláno jednou.
LifecycleOwner je komponenta Android Architecture Components, která vlastní životní cyklus Activity nebo Fragmentu. Umožňuje přihlášení k odběru událostí prostřednictvím LifecycleObserver.
Aplikace pro iOS prochází pěti stavy: Not Running, Inactive, Active, Background, Suspended. Přechody jsou spravovány prostřednictvím UIApplicationDelegate.
Saved State je mechanismus Androidu pro zachování stavu Activity/Fragment při otočení obrazovky nebo obnovení procesu. Používá onSaveInstanceState a SavedStateHandle.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.