Image
16.6.2016 0 Comments

Vývoj pre Android – Aktivita a jej životný cyklus / 5. časť

Späť na úvod >> Späť na seriál

Na rozdiel od aplikácií pre desktopové operačné systémy (Windows, Linux...) vkóde aplikácie pre Android nie je žiadny exaktný vstupný bod typu main(). Androidové aplikácie sa skladajú zviacerých od seba nezávislých komponentov – aktivít aslužieb, ktoré si navzájom môžu odovzdávať údaje.

Operačný systém sám určuje, kedy budú vytvorené inštancie aktivít, kedy budú odsunuté do pozadia či zničené. Aktivita reprezentuje jednu obrazovku s používateľským rozhraním. Je to určitá analógia okna, prípadne dialógového okna zklasických aplikácií Windows.

Vsprávne navrhnutej aplikácii sa prostredníctvom aktivity implementuje viac alebo menej komplexná čiastková úloha, ktorú má používateľ realizovať (napríklad vyplniť formulár, nastaviť parametre, vybrať si položku zo zoznamu a pod.). Aktivita je predurčená na to, aby zobrazovala používateľské rozhranie a zachytávala interakcie používateľa cezeň. Jednotlivé aktivity by mali fungovať samostatne.

Mali by mať presne definované vstupy a výstupy. Prečo? Aby bolo možné zaplikácie zavolať aktivitu inej aplikácie a prepoužívateľa to bude vyzerať ako kontinuálny proces, ako keby aktivita inej aplikácie bola integrálnou súčasťou aktivity, zktorej ju spustil. Väčšinou aktivita zaberá celú plochu displeja, ale nie je to pravidlo. Aktivitu možno vprípade potreby definovať ako celoobrazovkovú.

Objektová reprezentácia aktivity

V Java kóde je aktivita objekt odvodený od triedy android.app.Activity. Aktivita reaguje na udalosti životného cyklu a prekrýva príslušné metódy. Každá aktivita má vlastný životný cyklus atreba počítať stým, že inštancie aktivít aslužieb môžu byť vodôvodnených prípadoch kedykoľvek odstránené. Ak napríklad začnú dochádzať systémové zdroje, systém sa pokúsi odstrániť nepoužívané komponenty. Aktivita zodpovedá za uloženie svojho stavu, teda množinu údajov, ktoré tento stav definujú. Aktivita nemá verejne prístupný konštruktor, takže jej spustenie sa dá ovplyvniť iba parametrom typu Bundle vmetóde onCreate. Aktivita môže spúšťať inú aktivitu vrátane aktivít inej aplikácie.

Jedna zaktivít je definovaná ako hlavná (main). Tá sa zobrazí po štarte aplikácie. Po spustení ďalšej aktivity sa predchádzajúca aktivita pozastaví, ale zostane vpamäti voblasti nazývanej back stack. Do tejto oblasti sa aktivita ukladá po spustení. Vtedy zároveň prevezme fókus čiže príznak, že ide oaktívnu aktivitu zobrazenú na displeji zariadenia.

Životný cyklus aktivity

Životný cyklus aktivity je definovaný metódami, ktoré sa spúšťajú vpresne definovaných situáciách vurčenom poradí.

Životný cyklus aktivity najlepšie pochopíte zdiagramu. Má tri hlavné fázy:
Aktivita na popredí – zobrazuje sa na displeji amá takzvaný fókus, to znamená, že interaguje spoužívateľom. Bežiace aktivity na popredí sú vstavoch Running, prípadne Resumed.
Pozastavená aktivita – je stále vpamäti, je spravidla čiastočne viditeľná, no stráca fókus, to znamená, že používateľ knej nemá prístup. Typický príklad je prekrytie aktivity dialógom. Vprípade akútneho nedostatku pamätemôže systém aplikáciu vtomto stave odstrániť.
Zastavená aktivita – je kompletne prekrytá inou aktivitou. Aktivita je však stále vpamäti, ato voblasti back stacku, takže nie je problém sa knej vprípade potreby vrátiť. Pri nedostatku pamäte systém najskôr odstráni tieto aktivity aaž potom, ak nedostatok pamäte pretrváva, prídu na rad pozastavené aktivity.

Ak používateľ potrebuje obnoviť aktivitu zo stavu pozastavená alebo zastavená a používať ju na popredí, dochádza k reštartu aktivity. Ak treba realizovať vniektorej fáze životného cyklu isté špecifické akcie, je nevyhnutné prepísať jednu alebo viac týchto metód napojených na životný cyklus.

Schéma životného cyklu aktivity (zdroj: developer.android.com)

Podnetom na spustenie aktivity môže byť ťuknutie používateľa na ikonu aplikácie, prípadne je táto aktivita explicitným alebo implicitným cieľom nejakého zámeru (Intent). Nasledujúci opis životného cyklu aktivity možno najlepšie sledovať na diagrame.

onCreate()

Metóda onCreate(Bundle savedInstanceState){…} sa prvýkrát aktivuje po spustení aktivity. Vtele metódy sa zatiaľ na pozadí vytvára používateľské rozhranie akonfigurujú sa premenné aobjekty potrebné na beh aktivity. Po zavolaní metódy onCreate() je aktivita stále zastavená, neviditeľná anekomunikuje spoužívateľom. Vmetóde sa obyčajne rieši zavedenie layoutu a inicializácia prvkov view, nastavenie premenných, prípadne získanie dát z volajúceho Intentu. Ako parameter je odovzdaný objekt Bundle s uloženým predchádzajúcim stavom aktivity (ak nejaký existuje).

onStart() a onResume()

Aktivita prechádza do popredia. Vmetóde onStart() sa realizujú činnosti potrebné nato, aby bolo možné zobraziť používateľské rozhranie aktivity. Rozdiel medzi metódami je zrejmý zdiagramu. OnStart() sa volá pri spúšťaní, ktoré nasleduje po predchádzajúcom zastavení aktivity. Po spustení metódy onStart() zvyčajne nasleduje spustenie metódy onResume(). Metóda onResume() sa volá vtedy, keď aktivita prechádza z pozadia do popredia.

onPause()

Ak je spustená iná aktivita, prechádza aktivita, ktorá bola predtým na popredí, do pozadia. Vtejto metóde je vhodné automaticky uložiť zmeny údajov, sktorými aktivita pracovala, napríklad do databázy, súborov, dokumentov a podobne. Metóda sa volá vtedy, ak aktivita prestane byť na popredí, napríklad pri prechode na inú aktivitu, pri zobrazení dialógu, po stlačení tlačidla HOME. Vmetóde sa obvykle rieši uloženie aktuálnych neobnoviteľných dát, ukončenie snímania údajov zo senzorov (GPS...), ukončenie všetkých animácií a operácií náročných na CPU, uvoľnenie zámkov typu screenlock, wakeLock apodobne. Operácie realizované v metóde onPause() musia byť časovo nenáročné.

onStop()

Volá sa pri zastavení aktivity ziného dôvodu, než je nedostatok pamäte. Aktivita je stále v back stacku a používateľ ju môže znova zobraziť na popredí. Vtedy sa volá metóda onRestart().

onDestroy()

Metóda sa volá pri ukončovaní životnosti aktivity bez ohľadu na to, či sa tak stane explicitne alebo implicitne.

Väzby medzi aktivitami cez Intent

Výhoda Androidu je v tom, že väzby medzi aktivitami sú slabé aneostré. Vstupy avýstupy aktivít sú definované pomocou Intents. Znalci angličtiny okamžite pochopia, že tento pojem je odvodený od slova intention, po našom úmysel. Intent je asynchrónna správa, ktorá nesie informáciu o požadovanej akcii. Akciou môže byť spustenie aktivity, služby, prípadne používateľsky definovaná akcia.

Základné rozdelenie zámerov vychádzaz ich smerovania.

Explicitné – presne určuje, akú akciu treba vykonať, kto,akým spôsobom asakými údajmi ju vykoná. Majú explicitne definovanú cieľovú aktivitu, ktorú je potrebné spustiť.
Implicitné – zámer nemá definovanú cieľovú aktivitu, ale operáciu, ktorá sa má vykonať, preto spustí aktivitu, ktorá môže túto operáciu vykonávať. Výber sa ponechá na rozhodnutie operačného systému. Ak je vhodných viac aktivít, musí ovýbere rozhodnúť používateľ. Typický príklad je zosnímanie fotografie, zobrazenie dokumentu či webovej stránky.

Trieda Intent je v podstate dátová štruktúra, ktorá sa používa na dva účely. Umožňuje zadať operáciu, ktorú treba vykonať, alebo intent môže predstavovať udalosť, ktorá nastala vsystéme aoktorej je potrebné informovať ďalšie komponenty.

Ak aplikácia chce vykonať operáciu, pri ktorej potrebuje súčinnosť inej aktivity (napríklad vybrať kontakt, zobraziť mapu, zosnímať obrázok, vytočiť telefónne číslo apod.), vyjadrí to cez objekt Intent. Intenty umožňujú vzájomnú komunikáciu voľne prepojených komponentov androidovej aplikácie. Zhľadiska implementácie ide oinštanciu triedy android.content.Intent. Intent môže obsahovať údaje, ktoré sú uložené vinštancii triedy Bundle. Intent môže spúšťať aj aktivity iných aplikácií.

Oznamuje systému, čo má aktivita vúmysle. Napríklad používateľ chce poslať SMS, vyhľadať údaje zo zoznamu kontaktov, aktivovať vstavaný fotoaparát apodobne. Ako systém tento úmysel splní, je jeho záležitosť. Vpraxi to funguje tak, že systém vyhľadá všetky aktivity, ktoré môžu príslušný Intent splniť, a ak ich nájde viac, ponúkne používateľovi možnosť výberu. Môžete si zmeniť aplikáciu, ktorá vám zobrazuje zoznam kontaktov či vykoná inú činnosť. Následne sa vybraná aktivita spustí apríslušný Intent sa jej odovzdá ako vstup.

Aplikácia, aktivita či komponent môžu reagovať na rôzne druhy zámerov. Android však potrebuje vokamihu spúšťania aplikácie vedieť, na aké zámery bude možné reagovať. Každá aplikácia má vo svojom manifeste v súbore AndroidManifest.XML takzvaný IntentFilter, ktorý definuje typy zámerov, ktoré dokáže príslušná aplikácia obslúžiť.

<activity ...
<intent-filter ...>
...
<action android:name="actionName" />
...
</intent-filter>
...
</activity>

 

intent.png

Princíp fungovania intentu

Odovzdávanie údajov a výsledkov

Trieda Bundle umožňuje prenos údajov medzi komponentmi. Údaje sa ukladajú vo forme párových dvojíc kľúč – hodnota. Prenos údajov cez mechanizmus Bundle je pomerne rýchly, no je určený len na menšie objemy údajov, rádovo kilobajty. Inštanciu triedy Bundle možno získať pomocou metódy triedy Intent getExtras().

Trieda Bundle umožňuje prenášať ľubovoľné dátové typy. Preto treba definovať rozhranie zaisťujúce serializáciu tried Serializable alebo Parcelable. Serializable rozhranie umožňuje dynamické rozpoznávanie typov, ktoré je však náročné, takže tento spôsob je rádovo pomalší než serializácia pomocou rozhrania Parcelable, ktoré vyžaduje explicitnú definíciu pre serializáciu aj deserializáciu triedy.

Ak sa po spustení aktivity očakáva, že po jej skončení sa vráti výsledok, treba aktivitu spustiť pomocou metódy startActivityForResult(). Výsledok sa nastaví pomocou metódy setResult() vmetóde finish(). Vaktivite, ktorá očakáva výsledok od inej aktivity, je nevyhnutné predefinovať metódu onActivityResult().

V budúcom pokračovaní sa budeme venovať návrhu používateľského rozhrania akontajnerovým prvkom na dynamické rozmiestnenie komponentov.

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá