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 minulé lekci, Android programování - Dokončení implementace kalkulačky, jsme se věnovali ladění a generování .apk souboru.

V dnešním Android Java tutoriálu i vysvětlíme co je to aktivita a popíšeme si její životní cyklus.

Activity

Aktivitu si můžeme představit jako jednu obrazovku v aplikaci. Uveďme si příklad. Zapneme aplikaci, zobrazí se úvodní animace. To je první aktivita. Poté se zobrazí menu aplikace s možnostmi "Kalkulačka", "Poznámky" a "Editor", toto 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 - například aktivita pro výběr fotografie z galerie či výběr složky nebo souboru.

Životní cyklus aktivity

Android, jakožto OS 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) atd.

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 nám na tyto situace tak umožňuje reagovat. Podívejme se na následující schéma životního cyklu aktivity Android aplikací:

Životní cyklus Android aktivity - Základy vývoje Android aplikací v Javě

Stav aktivity

Třída Activity 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 těchto 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 v tu chvíli 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 uživateli obnovit video z místa, ve kterém předtím skončil. Jinými slovy, každá obslužná metoda nám umožňuje provádět konkrétní práci, která je vhodná pro danou změnu stavu. Díky správné práci ve správný čas a správnému zpracování přechodů bude naše aplikace výkonnější a stabilnější. Korektní implementací metod událostí se můžeme vyhnout například těmto 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 dokonce pokud třeba zařízení jen otočí.

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á.
  • Pauza - Aktivita jde vidět, je ale například překrytá jinou aktivitou (upozorněním na příchozí SMS, hovor, nebo například dialogem o plném nabití baterie při nabíjení). Uživatel se k takové aktivitě nijak nedostane a nemůže s ní pracovat.
  • Zastavená - 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.
  • Ukončená - Aktivita je úplně mrtvá.

Události životního cyklu

Pro ošetření přechodů mezi fázemi životního cyklu aktivity třída Activity poskytuje 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. Dále zavolá metodu onCreate(). V ní nadefinujeme vše potřebné, aby se aktivita mohla rozjet, například jaké grafické rozhraní se nám má zobrazit, zda má být zobrazen app bar, inicializujeme zde atributy třídy apod.
  • onStart() - Volá se, pokud aktivita byla poprvé spuštěna (po onCreate()) nebo byla aktivována po svém skrytí (např. po zhasnutí displeje zařízení, příchozí SMS, systémovém dialogu například o nabití baterie nebo jiném dialogu jiné aktivity, otočení zařízení apod.), nemůže dostat uživatelský vstup.
  • onResume() - Volá se těsně než je aktivita posunuta do popředí (restart, první spuštění nebo odpauzování), může dostat uživatelský vstup.
  • onPause() - Volá se před přechodem aktivity do pozadí. 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 (například při nedostatku paměti). Tato metoda je volána i v případě, že aktivita je viditelná jen částečně - například pod poloprůhledným dialogovým oknem. 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() - Volá se, když se má aktivita zastavit, není viditelná pro uživatele.
  • onRestart() - Jak vyplývá z předchozího diagramu, pokud byla zavolána onStop() a aktivita se restartuje, volá se onRestart(), jenž se provede před onStart().
  • onDestroy() - Volá se 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 onDestroy() by měly být uvolněny všechny prostředky, které dosud nebyly uvolněny, například v metodě onStop().

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

protected void 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/. R poukazuje na automaticky vygenerovaný soubor R.java, kde jsou uloženy zdroje (resources).

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().

Praktická ukázka

V našem vytvořeném projektu SimpleCalc přepíšeme i zbylých 6 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í. Nyní nám umožní pozorovat, kdy se jaká metoda spustí.

Pro přepisování metod můžeme jednoduše využít automatické doplňování kódu. Když budeme chtít, například, přepsat metodu onPause(), začneme psát její název a již nám Android Studio nabízí zbytek deklarace metody samo:

Základy vývoje Android aplikací v Javě

Do souboru MainActivity.java tedy přidáme tyto části kódu:

public class MainActivity extends AppCompatActivity {

    // ...

    final String TAG_LIFECYCLE = "lifecycle";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ...

        Log.d(TAG_LIFECYCLE, "onCreate()");

        // ...
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG_LIFECYCLE, "onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG_LIFECYCLE, "onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG_LIFECYCLE, "onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG_LIFECYCLE, "onStop()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG_LIFECYCLE, "onRestart()");
    }

    @Override
    protected void 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:

Základy vývoje Android aplikací v Javě

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

Základy vývoje Android aplikací v Javě

Následně spustíme aplikaci SimpleCalc na nějakém zařízení (skutečném nebo virtuální). 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 vyhodit úplně pryč (ukončení aplikace). V okně Logcatu můžeme sledovat, které metody životního cyklu byly volány. Na následujícím obrázku je vidět příklad výpisu Logcatu:

Základy vývoje Android aplikací v Javě

V příští lekci, Android programování - ConstraintLayout - Vytvoření omezení, si představíme ConstraintLayout a ukážeme si jak vytvářet a odstraňovat omezení různými způsoby.


 

Předchozí článek
Android programování - Dokončení implementace kalkulačky
Všechny články v sekci
Základy vývoje Android aplikací v Javě
Přeskočit článek
(nedoporučujeme)
Android programování - ConstraintLayout - Vytvoření omezení
Článek pro vás napsal Jiří Frank
Avatar
Uživatelské hodnocení:
40 hlasů
Autor se věnuje programování v C# a vývoji aplikací pro platformu Android a dalším věcem spojeným s Android OS
Aktivity