Cvičenie 2 - Základné stavebné prvky Android aplikácie
Úvod do problematiky - cieľom druhého cvičenia je ozrejmiť si prácu so základnými stavebnými prvkami Android aplikácie.
Aktivita (Activity)
Predstavuje základný stavebný prvok Android aplikácie
- V Android aplikáciách neexistuje hlavná metóda main() podobne ako v iných jazykoch, ktorá predstavuje vstupný bod programu/aplikácie.
- Takáto aplikácia sa skladá z tzv. aktivít, ktoré reprezentujú samotné “obrazovky”.
- V manifeste je jedna obrazovka označená ako hlavná aktivita – zobrazí sa ihneď po spustení aplikácie.
- Cez aktivitu sa spravidla implementuje viac, alebo menej komplexná čiastková úloha, ktorú má používateľ realizovať.
- Aplikácia môže pozostávať z viacerých aktivít, ktoré si navzájom odovzdávajú údaje. Napríklad po spustení, aplikácia zobrazí uvítaciu obrazovku (prvú aktivitu), o pár sekúnd zobrazí menu (druhú aktivitu), atď.
- Keď sa spustí ďalšia aktivita, predchádzajúca aktivita sa pozastaví a uloží do zásobníka. Zásobník funguje na princípe LIFO (last in, first out). Po stlačení tlačidla naspäť, aplikácia vyberie zo zásobníka predchádzajúcu aktivitu, ktorú opäť spustí.
Životný cyklus aktivity
Android, ako OS primárne pre chytré telefóny, zodpovedá za aktivity a všetko čo s nimi súvisí. Keďže aplikácie majú rozličné priority, môže nastať niekoľko situácií (napríklad prichádzajúci hovor), v ktorých sa vyžaduje pozastavenie aktuálne bežiacej aplikácie (napr. hry) a návrat do hlavnej ponuky, zdvihnutie hovoru, atď.
Keďže nie je vždy jasné, ako dlho daná aktivita pobeží, rozlišujeme viacero stavov v kt. sa môže nachádzať:
- Active - aktivita je úspešne spustená a beží na popredí, je teda pre používateľov viditeľná.
- Paused - aktivita je viditeľná, ale nieje možné s ňou interagovať. Napríklad pri prekrytí inou aktivitou - dialógové okná, upozornenie na prichádzajúcu SMS a pod.
- Stopped - aktivita je zastavená (napr. pri minimalizovaní aplikácie). Je možné ju opätovne zavolať, keďže jej objekt ešte nebol úplne zničený.
- Destroyed - aktivita je úplne ukončená a jej objekt je uvoľnený z pamäte.
Prechod medzi týmito stavmi je zabezpečený 7 základnými metódami:
Metóda | Popis |
OnCreate() | Táto metóda je volaná pri prvom spustení aktivity. V metóde sa inicializujú grafické XML súbory, premenné a objekty potrebné pre beh aplikácie. Ako parameter je odovzdaný objekt typu Bundle s uloženým predchádzajúcim stavom aktivity (ak nejaký existuje). |
OnStart() | V metóde onStart() aktivita prechádza do popredia a realizuje činnosti potrebné pre zobrazenie aktuálneho používateľského rozhrania. Rozdiel medzi metódami je zrejmý z diagramu: OnStart() je volaná pri každom spustení, ktoré nasleduje po predchádzajúcom zastavení / vytvorení aktivity. |
OnResume() | Táto metóda je volaná tesne pred tým, ako je aktivita presunutá z pozadia do popredia. |
OnPause() | V tejto metóde aktivita prechádza do pozadia. V metóde je vhodné ukladať zmeny údajov, s ktorými aktivita pracovala a ukončenie snímania údajov zo senzorov (GPS...), všetkých animácií a operácií náročných na CPU. Operácie realizované v metóde onPause() musia byť časovo nenáročné. |
OnStop() | Je volaná pri zastavení aktivity. Aktivita je stále v pamäti a používateľ ju môže kedykoľvek presunúť do popredia. |
OnRestart() | Ako vyplýva z diagramu, po zavolaní metódy onStop() je pri opätovnom presune aktivity do popredia volaná metóda onRestart() pred onStart().
|
OnDestroy() | Metóda je volaná pri ukončení životnotného cyklu aktivity. |
Trieda Toast
- Slúži pre zobrazenie stručných informácií a poskytnutie spätnej väzby v malom vyskakovacom okne.
- Upozornenie vypĺňa minimálny priestor na obrazovke, zobrazí sa na pár sekúnd a následne automaticky zmizne.
- Toasty netreba odklikávať a predstavujú tzv. flash notifications.
- Volanie triedy Toast môže náslene vyzerať takto:
Na vytvorenie Toastu je volaná metóda makeText(), ktorá má 3 parametre:
context
- predstavuje aktivitu, z ktorej vytvárame toast. Referencia na túto aktivitu sa nachádza v premennej this
.
text
- textový reťazec určený pre výpis.
duration
- dĺžka zobrazenia. Poznáme dve záklané konštanty: Toast.LENGTH_SHORT a Toast.LENGTH_LONG.
Úloha 2.1
Vytvorte volanie triedy Toast v každej metóde životného cyklu aktivity a vyskúšajte jednotlivé výpisy pri spustení, minimalizovaní a vypnutí aplikácie.
Úloha 2.2
Vyskúšajte jednotlivé toasty pri prijatí hovoru a sms správy v emulátore. (/.../Phone)
Používateľské rozhranie
- Používateľské rozhranie v Androide je reprezentované prostredníctvom tzv. layout súborov vo formáte XML.
- Tieto súbory sú uložené v priečinku
app/res/layout/
(napr. activity_main.xml).
- Priradenie vybraného layoutu k aktivite sa vykonáva príkazom setContentView(R.layout.activity_main); v metóde OnCreate.
- R.layout.* - odkaz na súbor v adresáry /res/layout
- Po kliknutí na súbor activity_main.xml sa nám zobrazí aktuálna štruktúra rozloženia používateľského rozhrania zvolenej aktivity.
- Pre zobrazenie XML formátu a elementov, prepneme záložku v pravom hornom rohu do Code. Aktuálne je v ňom iba
<TextView>
.
- Jednotlivé elementy obsahujú atribúty, vďaka ktorým je možné definovať ich vlastnosti. Napríklad
android:text
, ktorý predstavuje zobrazovaný text.
- Ďalší z týchto atribútov je napríklad
anroid:id
, ktorý umožňuje daný element identifikovať v kóde.
- V
<TextView>
aktuálne chýba, tak ho doplníme:
Pre jednoduchú interakciu s používateľom pridáme <Button>
Interakcia s prvkami používateľského rozhrania
Po kliknutí na tlačidlo poznáme viacero spôsobov interakcie s kódom, jeden z nich môže vyzerať napríklad takto:
- Prostredníctvom atribútu android:onClick, ktorého hodnota bude meno metódy, ktorá sa zavolá.
- Táto metóda sa však musí nachádzať v triede, ktorej vzhľad je definovaný práve týmto súborom.
- Príslušný atribút elementu
<Button>
bude vyzerať nasledovne:
android:onClick="pressAction"
- V triede
MainActivity
následne vytvoríme metódu, ktorá: bude pomenovaná ako pressAction()
- Má jeden parameter typu View, ktorý je referenciou na pohľad (v našom prípade tlačidlo), na ktorý bolo kliknuté
- Jej prázdna definícia bude vyzerať nasledovne:
public void pressAction(View view){}
- Najprv veľmi jednoducho overíme len to, či je táto metóda naozaj po kliknutí na tlačidlo zavolaná.
- Aktualizujeme preto túto metódu a vložíme do nej volanie triedy Toast pre vypísanie správy na obrazovku
- Ak sa pozrieme na deklaráciu metódy pressAction(), má jeden parameter typu
View
- Tento parameter je referenciou na objekt, nad ktorým je volaná táto metóda (
<Button>
)
- Keďže samotné tlačidlo je inštanciou triedy
Button
a je potomkom triedy View
je potrebné ho pretypovať.
- Preto ak chceme zmeniť atribút "text" tohto tlačidla použijeme:
- Ak však chceme zmeniť text v samotnom
<TextView>
, potrebujeme získať objekt reprezentujúci tento element.
- Na to použijeme metódu findViewById(), ktorá má jeden parameter - identifikátor daného elementu.
- Identifikátor sa nachádza v atribúte
android:id
, pričom v kóde je reprezentovaný pomocou triedy R
- K objektu elementu
<TextView>
sa teda dostaneme nasledovne:
TextView label = (TextView) findViewById(R.id.label);
- Metóda pressAction() môže náslene vyzerať napríklad takto:
Úloha 2.3
Vytvorte členskú premennú typu boolean
, ktorá bude meniť 2 alternatívne texty v <TextView>
prostreníctvom metódy pressAction()
Intent (Zámer)
- Intent v Android-e predstavuje objekt reprezentujúci správu, pomocou ktorej je možné požiadať o vykonanie príslušnej akcie od inej časti aplikácie.
- Ak aplikácia chce vykonať operáciu, ku ktorej potrebuje inú aktivitu, napr. vybrať kontakt, zobraziť mapu, vytočiť telefónne číslo a podobne, vyjadrí to cez objekt Intent.
- Pri vytváraní intentu špecifikujeme:
- akciu ktorá sa má vykonať, napr. odoslanie správy (mail, SMS)
- dáta potrebné pre výber správnej aktivity
- Poznáme dva typy intentov:
Implicitné intenty
- Nemá definovanú cieľovú aktivitu, ale operáciu, ktorá má byť vykonaná, preto spustí aktivitu, ktorá túto operáciu vykonáva.
- Výber je ponechaný na rozhodnutí operačného systému. Ak je vhodných viacero aktivít, rozhodne používateľ.
- Typickým príkladom je vytvorenie fotografie, zobrazenie dokumentu, webovej stránky..
- Napríklad otvorenie webovej adresy:
- Ak máme k dispozícii len jeden prehliadač, rovno sa načíta webová stránka.
- Ak je k dispozícii viac prehliadačov, OS zobrazí výberové okno.
Úloha 2.4
Vytvorte novú aktivitu s názvom SecondActivity prostredníctvom File->New->Activity->Empty Views Activity
Explicitné intenty
- Tieto intenty presne určujú akú akciu je potrebné vykonať (kto, akým spôsobom, s akými dátami)
- Majú explicitne definovanú cieľovú aktivitu, ktorú je potrebné spustiť.
- Pomáhajú cieľovej aktivite odovzdať potrebné dáta.
- Slúži na to konštruktor s dvoma parametrami: contextom (obvykle this) a spomínaným názvom triedy novej aktivity.
- V prípade ak chceme odovzdať dáta nasledujúcej aktivite použijeme
.putExtra
(name, value)
- name - predstavuje unikátny identifikátor objektu
- value - objekt typu int, float, string atd.
- Volanie takéhoto intentu a dát v inej aktivite (napr. v onCreate), môže vyzerať nasledovne:
.getIntExtra
(name, defaultValue) pre typ integer
Úloha 2.5
Vyskúšajte prenos rôznych dátových typov medzi 2 aktivitami (boolean, int, float, string) a vypíšte jednotlivé výsledky prostredníctvom triedy Toast.