8. diel - Android programovanie - Životný cyklus aktivity
V dnešnom Android Kotline tutoriále si vysvetlíme, čo je to aktivita a popíšeme si jej životný cyklus.
Čo je aktivita
Aktivitu si môžeme predstaviť ako jednu obrazovku v aplikácii.
Zapneme aplikáciu a zobrazí sa úvodná animácia. To je prvá aktivita. Potom sa zobrazí menu aplikácie s možnosťami "Kalkulačka", "Poznámky" a "Editor", to bude druhá aktivita. Po kliknutí na jednotlivé ponuky v menu nás aplikácia presmeruje do tretej, štvrtej alebo piatej aktivity podľa možnosti, ktorú sme si vybrali.
Z našej aplikácie môžeme pristupovať aj k aktivitám iných aplikácií alebo k aktivitám systému. Je možné napríklad spustiť aktivitu pre výber fotografie z galérie alebo výber priečinka alebo súboru.
Životný cyklus aktivity
Android, ako OS určený primárne pre smartfóny, sám zodpovedá za aktivity a všetko, čo s nimi súvisí. Je jasné, že majiteľ telefónu radšej odpovie na nečakaný prichádzajúci hovor alebo SMS, než aby aplikáciu sám musel minimalizovať. Podobných situácií môže nastať viac, okrem prichádzajúceho hovoru môže napr. užívateľ aktivitu pozastaviť sám, keď sa vráti do hlavnej ponuky.
Z toho vyplýva, že nie je vždy jasné, či sa naša aktivita nepozastaví alebo neukončí. Preto existujú rôzne metódy, ktoré systém na aktivite volá v rôznych situáciách a tým nám na ne umožňuje reagovať. Pozrime sa na nasledujúcu schému životného cyklu aktivity Android aplikácií:
Najskôr si popíšeme jednotlivé stavy aktivít, potom sa zameriame na popis obslužných metód.
Stav aktivity
Všetko má na starosti trieda Activity
. Tá poskytuje množstvo
udalostí, ktoré umožňujú aktivite reagovať na to, že sa jej stav zmenil.
Teda, že systém sám vytvára, zastavuje alebo obnovuje aktivitu alebo
ukončuje proces, v ktorom je aktivita umiestnená. Pomocou obslužných metód
udalostí životného cyklu aktivity môžeme určiť, ako sa naša aktivita
zachová, keď napr. užívateľ aktivitu opustí a potom ju znova zobrazí v
popredí.
Pokiaľ napríklad vytvárame streamovaný videoprehrávač, môžeme pri prerušení aktivity video pozastaviť a ukončiť pripojenie aplikácie k internetu. Až sa používateľ vráti, môžeme sa znovu pripojiť k sieti a umožniť mu obnoviť video z miesta, v ktorom predtým skončil. Inými slovami, každá obslužná metóda nám pomáha vykonávať konkrétnu prácu, ktorá je vhodná pre danú zmenu stavu.
Vďaka správnemu spracovaniu prechodov medzi jednotlivými stavmi aktivity bude naša aplikácia výkonnejšia a stabilnejšia.
Každá aktivita sa nachádza súčasne len v jednom z nasledujúcich stavov:
- Beží - Aktivita sa úspešne spustila a beží na popredí, je teda pre užívateľov viditeľná.
- Pozastavená - Aktivita je vidieť, je ale prekrytá inou aktivitou - upozornením na prichádzajúcu SMS, hovor alebo napríklad dialógom o plnom nabití batérie.
- Ukončená - Aktivita nie je vidieť, používateľ k nej nemá prístup, ale jej objekt ešte nebol úplne zničený. Užívateľ sa k nej bude môcť vrátiť, pokiaľ nebude zničená, napríklad kvôli nedostatku pamäte.
- Zničená - Aktivita je úplne mŕtva.
- Pádu aplikácie, ak používateľ počas jej používania prijme telefónny hovor alebo prepne na inú aplikáciu.
- Zbytočné spotrebe cenných systémových prostriedkov, keď ich užívateľ aktívne nepoužíva.
- Strate rozrobené práce užívateľa, ak aplikáciu opustí a vráti sa k nej neskôr alebo pokiaľ treba len zariadenie otočí.
Udalosti životného cyklu
Pre ošetrenie prechodov medzi fázami životného cyklu aktivity, poskytuje
trieda Activity
základnú sadu siedmich obslužných metód:
onCreate()
- Táto metóda je jediná, ktorú musíme vždy prepísať. Pri spustení aktivity sa Android postará o základné veci, ako vytvorenie objektu a spustenie procesu a potom zavolá metóduonCreate()
. V nej nadefinujeme všetko potrebné, aby sa aktivita mohla rozbehnúť. Určíme napríklad, aké grafické rozhranie sa nám má zobraziť, či má byť zobrazený app bar, inicializujeme atribúty triedy a pod.onStart()
- Následne sa volá metódaonStart()
, pokiaľ aktivita bola prvýkrát spustená alebo bola aktivovaná po svojom skrytí (napr. po zhasnutí displeja zariadenia, prečítaní prichádzajúcej SMS, otočení zariadenia a pod.). Táto metóda nemôže dostať užívateľský vstup.onResume()
- Ďalšia metóda sa volá tesne predtým, než je aktivita posunutá do popredia (reštart, prvé spustenie alebo odpauzovanie), môže dostať užívateľský vstup.onPause()
- Pred prechodom aktivity do pozadia sa volá metódaonPause()
. Systém dostáva informáciu o tom, že aktivita už nie je v popredí a získava právomoc násilného ukončenia aktivity (v prípade nedostatku pamäti). Metóda je tiež volaná, pokiaľ je aktivita viditeľná len čiastočne. Táto metóda je vhodným miestom na uvoľnenie rôznych systémových prostriedkov, ktoré užívateľ v pozastavenej aktivite nepotrebuje.onStop()
- Keď sa má pozastavená aktivita ukončiť, zavolá sa metódaonStop()
, aktivita potom nie je viditeľná pre užívateľov.onRestart()
- Ako vyplýva z predchádzajúceho diagramu, pokiaľ bola aktivita ukončená, ale nebola zničená, môžeme ju obnoviť pomocou metódyonRestart()
, ktorá sa zavolá pred metódouonStart()
.onDestroy()
- Posledná metóda sa volá pred zrušením aktivity. Dôvodom môže byť, že užívateľ túto aktivitu ukončil alebo systém dočasne ničí aktivitu kvôli zmene konfigurácie (rotáciu zariadenia alebo režimu viacerých okien). V metódeonDestroy()
by mali byť uvoľnené všetky prostriedky, ktoré doteraz uvoľnené neboli.
Metódu onCreate()
už máme vygenerovanú v kóde triedy
projektu SimpleCalc
. Je to jediná metóda životného cyklu
aktivity, ktorej prepísanie je povinné. Android Štúdiom vygenerovaný kód
vyzerá nasledovne:
override fun onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) }
Aktivita v metóde onCreate()
nastaví layout, v prípade
nášho projektu SimpleCalc
, riadkom:
setContentView(R.layout.activity_main)
Odkazuje teda na layout activity_main.xml
, ktorý je v
priečinku res/layout/
.
Pri programovaní nie je vždy nutné brať ohľad na všetky
spomínané metódy. Niekedy ich skrátka nie je potrebné použiť. Jedinou
podmienkou je použitie metódy onCreate()
.
Vo vytvorenom projekte SimpleCalc
si teraz prepíšeme aj
zvyšných šesť metód životného cyklu aktivity a vložíme do nich výpis
správ pre nástroj Logcat. S týmto nástrojom sme sa zoznámili v časti o ladení
aplikácií. Tu nám umožní pozorovať, kedy sa aká metóda spustí.
Doplnenie udalostí do
SimpleCalc
Na prepisovanie metód môžeme jednoducho využiť automatické dopĺňanie
kódu. Keď budeme chcieť prepísať metódu onPause()
, začneme
písať jej názov a Android Studio nám ponúkne zvyšok deklarácie metódy
samo:
Do súboru MainActivity.kt
teda pridáme tieto časti 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()") } }
Prepísali sme všetky chýbajúce metódy životného cyklu aktivity a do nich pridali správy pre Logcat, kde vypisujeme, ktorá metóda sa zavolala. Logcat otvoríme z menu takto: View -> Tool Windows -> Logcat:
V otvorenom okne, do poľa pre filtrovanie správ, vložíme obsah
tag:[obsah konstanty TAG_LIFECYCLE]
:
Následne spustíme aplikáciu SimpleCalc
na nejakom zariadení
(skutočnom alebo virtuálnom). Zariadenie skúsime otáčať, aplikáciu
odstrániť z displeja tlačidlom pre zobrazenie plochy telefónu, a potom ju
znovu otvoriť. Alebo v zozname otvorených aplikácií túto aplikáciu
vyhodíme úplne preč (ukončíme aplikáciu). V okne Logcatu môžeme
sledovať, ktoré metódy životného cyklu boli volané.
Výstup v Logcate potom vyzerá napríklad takto:
Všetko si sami vyskúšajte vo svojom projekte.
V nasledujúcej lekcii, Android programovanie - ConstraintLayout - Vytvorenie obmedzení , si predstavíme
ConstraintLayout
a ukážeme si, ako vytvárať a odstraňovať
obmedzenia rôznymi spôsobmi.