Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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í:

Android - Tvorba mobilních aplikací v Kotlin

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á metodu onCreate(). 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á metoda onStart(), 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á metoda onPause(). 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 metoda onStop(), 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í metody onRestart(), která se zavolá před metodou onStart().
  • 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:

Android - Tvorba mobilních aplikací v Kotlin

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:

Android - Tvorba mobilních aplikací v Kotlin

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

Android - Tvorba mobilních aplikací v Kotlin

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:

Android - Tvorba mobilních aplikací v Kotlin

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.


 

Předchozí článek
Řešené úlohy k 5.-7. lekci Android v Kotlin
Všechny články v sekci
Android - Tvorba mobilních aplikací v Kotlin
Přeskočit článek
(nedoporučujeme)
Android Programování - Neobjevujte kolo, použijte Gradle
Článek pro vás napsal Marek Urbańczyk
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje programování v Kotlinu, Javě. Má také zkušenosti s C#.
Aktivity