Image
29.6.2016 0 Comments

Programujeme pre Android / 8.časť

Úlohou tejto časti seriálu je opísať zmeny vykonané v našej vzorovej aplikácii, týkajúce sa jej novej funkcionality, a ozrejmiť dotknuté oblasti súvisiacej teórie. Medzi najnovšou (v.3) a predošlou (v.2) verziou aplikácie planovac sú dva funkčné rozdiely:

1. doplnenie novej aktivity (sub-aktivity) – definícia príslušnej triedy, spustenie subaktivity, získanie požadovaného výsledku, komunikácia medzi aktivitami,
2. úprava aplikácie súvisiaca s doplnením času plánovaného vykonania úlohy.

Obr. 1 Design mód Android Studia s rozmiestnením prvkov UI DateTimeActivity

Zámysly (intents)

Intenty sú základný mechanizmus OS Android na internú komunikáciu v rámci aplikácií, ako aj na vzájomnú komunikáciu medzi viacerými aplikáciami. Na intenty dokážu reagovať aktivity, služby a prijímače oznámení. V našich článkoch budeme tieto rozdielne „druhy programov“ nazývať súčasťami aplikácií (ďalej len súčasti).

Intenty sa používajú na:

1. explicitný štart súčastí uvedením konkrétneho mena triedy danej súčasti,
2. implicitný štart súčastí uvedením činnosti, ktorá sa má vykonať so zaslanými údajmi,
3. systémové oznámenie o vzniku udalosti (event broadcasting).

OS Android používa intenty v pomerne veľkom rozsahu, čím vytvára aplikačné prostredie riadené udalosťami (event driven), resp. správami (message-passing mechanism). Tento dizajn je základný princíp fungovania Androidu. Aplikácie v rámci svojho vnútorného priestoru, ale aj na komunikáciu s okolitým priestorom nepoužívajú konkretizované názvy svojich súčastí, ale v drvivej väčšine uvádzajú iba svoje „zámysly“ na vykonanie činnosti.

Ku každému intentu dokážeme priradiť ďalšie doplňujúce údaje, a to pomocou systému tzv. extra hodnôt. Tie spravujeme pomocou metód putExtra() a get[type]Extra(). Ich úlohou je ukladať, resp. čítať tzv. páry NVP (Name / Value Pair v tvare položka = hodnota) priradené k danému intentu.

Riešenie zámyslu (intent resolution)

Implicitné intenty definujú činnosť, ktorú požadujeme vykonať, voliteľne doplnenú o údaje, s ktorými sa má daná činnosť vykonať. V prípade, že našu požiadavku na štart súčasti aplikácie zašleme implicitným intentom, Android použije interný mechanizmus riešenia zámyslu, na základe ktorého vyberie tú súčasť, ktorá je najvhodnejšia na vykonanie požadovanej činnosti. OS Android teda sám rozhodne, ktorá registrovaná súčasť je vhodná na vykonanie požadovanej činnosti, a ak je takých súčastí viac, požiada o výber používateľa.

Proces výberu vhodnej súčasti je založený na viacerých krokoch. Dôležitý je fakt, že na výbere sa zúčastňujú iba tzv. registrované súčasti. Tie musia byť uvedené v manifeste aplikácie so súčasným uvedením zoznamu činností, ktoré dokážu vykonať. Týmto zoznamom je tzv. filter zámyslu (intent-filter). Aplikácie takto deklarujú, že ich konkrétna súčasť dokáže daný intent spracovať a vykonať požadovanú činnosť so zaslanými údajmi.

Trieda Intent okrem iného obsahuje aj niekoľko tzv. natívnych činností, ktoré sú nadviazané na konkrétne natívne súčasti aplikácií. OS Android na základe nich vie automaticky determinovať, ktorú konkrétnu súčasť má spustiť.

Celosystémové udalosti (broadcast events)

OS Android okrem použitia intentov na uvedenie zámyslu aplikácií zaslaného iným súčastiam používa rovnaký mechanizmus aj na celosystémové zasielanie správ, resp. udalostí. Tie sú následne spracúvané tzv. prijímačmi oznámení (Broadcast Receivers), ktoré v prípade vzniku udalosti vykonajú príslušnú činnosť. Receivery uvedené v manifestoch aplikácií dokážu prijímať systémové udalosti aj v prípade, že konkrétna aplikácia nie je spustená. Receivery samy osebe nevykonávajú žiadnu časovo náročnú činnosť. Ich najčastejšia úloha je spustiť na ne nadväzujúcu súčasť. K intent-filtrom a receiverom sa ešte viackrát vrátime v nasledujúcich častiach nášho seriálu.

Obr. 2 Grafický výstup aktivít aplikácie planovac_v3

Nová aktivita aplikácie planovac_v3

Naše riešenie výberu dátumu a času prislúchajúcich k plánovanej úlohe je síce v mnohom „amatérske“, ale vo svojej jednoduchosti slúži ako ukážka spolupráce viacerých aktivít v rámci jednej aplikácie.

Novú aktivitu sme vytvorili kliknutím pravého tlačidla myši na hlavnom balíčku aplikácie (com.example.planovac_v3.app) a výberom New -> Activity -> Blank Activity. Vpísali sme meno novej aktivity = meno novej triedy = DateTimeActivity a meno rodiča (Hierarchical Parent) = MainActivity.

IDE Android Studio pre nás automaticky vytvorilo, resp. upravilo:

- layout activity_date_time.xml,
- NVP v súbore strings.xml,
- štandardnú konfiguráciu menu date_time.xml,
- konfiguráciu súboru AndroidManifest.xml (pridanie atribútov novej aktivity).

Ďalšou úlohou bolo rozmiestniť príslušné View v rámci layoutu activity_date_time.xml. Prácu sme si zjednodušili použitím Design módu, v rámci ktorého sme na obrazovku zariadenia postupne umiestnili kontajner ScrollView, layout LinearLayout a dva widgety zo skupiny Date & Time, konkrétne DatePicker a TimePicker. Uvedené prvky sme nakoniec doplnili o tlačidlo.

V rámci triedy DateTimeActivity sme na jej začiatku sprístupnili widgety DatePicker, TimePicker a Button. Následne sme nastavili interný dátum a čas podľa dátumu a času, s ktorým pracuje MainActivity.

Najdôležitejšia časť programového kódu sa týka reakcie tlačidla na stlačenie. Na tomto mieste bolo potrebné definovať hodnoty reťazcov, ktoré sú výsledkom (result) spustenej aktivity. Potom je vykonaná metóda určená na vrátenie kódu výsledku (result code) a hodnôt reťazcov setResult(). Za ňou nasleduje metóda finish(), ktorá aktivitu ukončí a odstráni ju zo zásobníka (stack).

Štart novej aktivity, presnejšie subaktivity, nastane po kliknutí na tlačidlo so zobrazeným dátumom a časom. Používateľovi je takto umožnené meniť uvedené údaje pomocou na to určených grafických prvkov. Po kliknutí na tlačidlo sa vykoná nasledujúci kód:

Intent i = new Intent(context, DateTimeActivity.class);
startActivityForResult(i, REQUEST_FOR_DATE);

Jeho úloha je jednoduchá:

1. v prvom kroku sa vytvorí inštancia triedy Intent s explicitne definovanou triedou (subaktivitou), ktorá sa má spustiť,
2. v druhom kroku dôjde k spusteniu subaktivity so súčasným nastavením tzv. kódu požiadavky (request code), subaktivita bude vytvorená, naštartovaná a presunutá na vrchol zásobníka.

Ukončenie subaktivity automaticky spustí metódu onActivityResult() tej aktivity, ktorá danú subaktivitu spustila. V rámci nej treba skontrolovať kód požiadavky, ktorý bol použitý na spustenie subaktivity, a kód výsledku, ktorý vrátila subaktivita pri svojom ukončení. Hodnoty konkrétnych reťazcov získame pomocou konkrétnej formy už spomínanej metódy getStringExtra().

 

 

Zobrazit Galériu
Autor: Marek Sopko

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

Mohlo by Vás zaujímať

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

Žiadne komentáre

Vyhľadávanie

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

Najnovšie videá