Lekce 8 - Android programování - Životní cyklus aktivity
V předešlém cvičení, Řešené úlohy k 5.-7. lekci Android v Kotlin, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
V dnešním Android Kotlin tutoriálu si vysvětlíme, co je to aktivita a popíšeme si její životní cyklus.
Co je aktivita
Aktivitu si můžeme představit jako jednu obrazovku v aplikaci.
Zapneme aplikaci a zobrazí se úvodní animace. To je první aktivita. Poté se zobrazí menu aplikace s možnostmi "Kalkulačka", "Poznámky" a "Editor", to bude druhá aktivita. Po kliknutí na jednotlivé nabídky v menu nás aplikace přesměruje do třetí, čtvrté nebo páté aktivity podle možnosti, kterou jsme si vybrali.
Z naší aplikace můžeme přistupovat i k aktivitám jiných aplikací nebo k aktivitám systému. Je možné například spustit aktivitu pro výběr fotografie z galerie či výběr složky nebo souboru.
Životní cyklus aktivity
Android, jakožto OS určený primárně pro chytré telefony, sám zodpovídá za aktivity a vše, co s nimi souvisí. Je jasné, že majitel telefonu raději odpoví na nenadálý příchozí hovor nebo SMS, než aby aplikaci sám musel minimalizovat. Podobných situací může nastat více, kromě příchozího hovoru může např. uživatel aktivitu pozastavit sám, když se vrátí do hlavní nabídky.
Z toho plyne, že není vždy jasné, zda se naše aktivita nepozastaví nebo neukončí. Proto existují různé metody, které systém na aktivitě volá v různých situacích a tím nám na ně umožňuje reagovat. Podívejme se na následující schéma životního cyklu aktivity Android aplikací:

Nejdříve si popíšeme jednotlivé stavy aktivit, poté se zaměříme na popis obslužných metod.
Stav aktivity
Vše má na starosti třída Activity
. Ta poskytuje řadu
událostí, které umožňují aktivitě reagovat na to, že se její stav
změnil. Tedy, že systém sám vytváří, zastavuje nebo obnovuje aktivitu
nebo ukončuje proces, ve kterém je aktivita umístěna. Pomocí obslužných
metod událostí životního cyklu aktivity můžeme určit, jak se naše
aktivita zachová, když např. uživatel aktivitu opustí a poté ji znovu
zobrazí v popředí.
Pokud například vytváříme streamovaný videopřehrávač, můžeme při přerušení aktivity video pozastavit a ukončit připojení aplikace k internetu. Až se uživatel vrátí, můžeme se znovu připojit k síti a umožnit mu obnovit video z místa, ve kterém předtím skončil. Jinými slovy, každá obslužná metoda nám pomáhá provádět konkrétní práci, která je vhodná pro danou změnu stavu.
Díky správnému zpracování přechodů mezi jednotlivými stavy aktivity bude naše aplikace výkonnější a stabilnější.
Každá aktivita se nachází současně jen v jednom z následujících stavů:
- Běží - Aktivita se úspěšně spustila a běží na popředí, je tedy pro uživatele viditelná.
- Pozastavená - Aktivita je vidět, je ale překrytá jinou aktivitou - upozorněním na příchozí SMS, hovor nebo například dialogem o plném nabití baterie.
- Ukončená - Aktivita není vidět, uživatel k ní nemá přístup, ale její objekt ještě nebyl úplně zničen. Uživatel se k ní bude moci vrátit, pokud nebude zničena, například kvůli nedostatku paměti.
- Zničená - Aktivita je úplně mrtvá.
Korektní implementací metod událostí se můžeme vyhnout následujícím problémům:
- pádu aplikace, pokud uživatel během jejího používání přijme telefonní hovor nebo přepne na jinou aplikaci,
- zbytečné spotřebě cenných systémových prostředků, když je uživatel aktivně nepoužívá,
- ztrátě rozdělané práce uživatele, pokud aplikaci opustí a vrátí se k ní později nebo pokud třeba jen zařízení otočí.
Pojďme si nyní jednotlivé metody představit.
Události životního cyklu
Pro ošetření přechodů mezi fázemi životního cyklu aktivity, poskytuje
třída Activity
základní sadu sedmi obslužných metod:
onCreate()
- Tato metoda je jediná, kterou musíme vždy přepsat. Při spuštění aktivity se Android postará o základní věci, jako vytvoření objektu a spuštění procesu a poté zavolá metoduonCreate()
. V ní nadefinujeme vše potřebné, aby se aktivita mohla rozjet. Určíme například, jaké grafické rozhraní se nám má zobrazit, zda má být zobrazen app bar, inicializujeme atributy třídy apod.onStart()
- Následně se volá metodaonStart()
, pokud aktivita byla poprvé spuštěna nebo byla aktivována po svém skrytí (např. po zhasnutí displeje zařízení, přečtení příchozí SMS, otočení zařízení apod.). Tato metoda nemůže dostat uživatelský vstup.onResume()
- Další metoda se volá těsně předtím, než je aktivita posunuta do popředí (restart, první spuštění nebo odpauzování), může dostat uživatelský vstup.onPause()
- Před přechodem aktivity do pozadí se volá metodaonPause()
. Systém dostává informaci o tom, že aktivita již není v popředí a získává pravomoc násilného ukončení aktivity (v případě nedostatku paměti). Metoda je také volána, pokud je aktivita viditelná jen částečně. Tato metoda je vhodným místem pro uvolnění různých systémových prostředků, které uživatel v pozastavené aktivitě nepotřebuje.onStop()
- Když se má pozastavená aktivita ukončit, zavolá se metodaonStop()
, aktivita pak není viditelná pro uživatele.onRestart()
- Jak vyplývá z předchozího diagramu, pokud byla aktivita ukončena, ale nebyla zničena, můžeme ji obnovit pomocí metodyonRestart()
, která se zavolá před metodouonStart()
.onDestroy()
- Poslední metoda se volá před zrušením aktivity. Důvodem může být, že uživatel tuto aktivitu ukončil, nebo systém dočasně ničí aktivitu kvůli změně konfigurace (rotaci zařízení, nebo režimu více oken). V metoděonDestroy()
by měly být uvolněny všechny prostředky, které dosud uvolněny nebyly.
Aktivity v projektu kalkulačky
Metodu onCreate()
již máme vygenerovanou v kódu třídy
projektu SimpleCalc
. Je to jediná metoda životního cyklu
aktivity, jejíž přepsání je povinné. Android Studiem vygenerovaný kód
vypadá následovně:
override fun onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) }
Aktivita v metodě onCreate()
nastaví layout, v případě
našeho projektu SimpleCalc
, řádkem:
setContentView(R.layout.activity_main)
Odkazuje tedy na layout activity_main.xml
, který je ve složce
res/layout/
.
Při programování není vždy nutné brát zřetel na
všechny zmíněné metody. Někdy je zkrátka není potřeba použít. Jedinou
podmínkou je použití metody onCreate()
.
Ve vytvořeném projektu SimpleCalc
si nyní přepíšeme i
zbylých šest metod životního cyklu aktivity a vložíme do nich výpis
zpráv pro nástroj Logcat. S tímto nástrojem jsme se seznámili v části o
ladění
aplikací. Zde nám umožní pozorovat, kdy se jaká metoda spustí.
Doplnění událostí do
SimpleCalc
Pro přepisování metod můžeme jednoduše využít automatické
doplňování kódu. Když budeme chtít přepsat metodu onPause()
,
začneme psát její název a Android Studio nám nabídne zbytek deklarace
metody samo:

Do souboru MainActivity.kt
tedy přidáme tyto části
kódu:
class MainActivity : AppCompatActivity { // ... companion object { // ... var TAG_LIFECYCLE = "lifecycle" } override fun onCreate(savedInstanceState: Bundle?) { // ... Log.d(TAG_LIFECYCLE, "onCreate()") // ... } override fun onStart() { super.onStart() Log.d(TAG_LIFECYCLE, "onStart()") } override fun onResume() { super.onResume() Log.d(TAG_LIFECYCLE, "onResume()") } override fun onPause() { super.onPause() Log.d(TAG_LIFECYCLE, "onPause()") } override fun onStop() { super.onStop() Log.d(TAG_LIFECYCLE, "onStop()") } override fun onRestart() { super.onRestart() Log.d(TAG_LIFECYCLE, "onRestart()") } override fun onDestroy() { super.onDestroy() Log.d(TAG_LIFECYCLE, "onDestroy()") } }
Přepsali jsme všechny chybějící metody životního cyklu aktivity a do nich přidali zprávy pro Logcat, kde vypisujeme, která metoda se zavolala. Logcat otevřeme z menu takto: View -> Tool Windows -> Logcat:

V otevřeném okně, do pole pro filtrování zpráv, vložíme obsah
tag:[obsah konstanty TAG_LIFECYCLE]
:

Následně spustíme aplikaci SimpleCalc
na nějakém
zařízení (skutečném nebo virtuálním). Zařízení zkusíme otáčet,
aplikaci odstranit z displeje tlačítkem pro zobrazení plochy telefonu a pak
ji znovu otevřít. Nebo v seznamu otevřených aplikací tuto aplikaci
vyhodíme úplně pryč (ukončíme aplikaci). V okně Logcatu můžeme
sledovat, které metody životního cyklu byly volány.
Výstup v Logcatu pak vypadá třeba takto:

Vše si sami vyzkoušejte ve svém projektu.
V příští lekci, Android Programování - Neobjevujte kolo, použijte Gradle, se naučíme používat balíčkovací nástroj Gradle.