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

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á metoduonCreate()
. 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 (poonCreate()
) 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ánaonStop()
a aktivita se restartuje, volá seonRestart()
, jenž se provede předonStart()
.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). VonDestroy()
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:

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:

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

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:

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.