Resuscitation
Ciele
- Naučiť sa ošetrovať rôzne stavy, v ktorých sa Aktivita môže nachádzať.
- Vytvoriť možnosť pokračovania v hre.
Úvod
Z doterajších cvičení by ste mali ovládať životný cyklus aktivít, teda
v akých rôznych stavoch sa môže aktivita nachádzať. V tomto cvičení sa naučíte,
ako ošetriť správanie Aktivity obsluhujúcej hranie hry
pri aplikácii týchto stavov počas jej životného cyklu.
Postup
-
V tomto kroku budete uvažovať situáciu, kedy je beh Aktivity prerušený, ale Aktivita bude znova vyvolaná do popredia, teda nenastane situácia, že je proces ukončený alebo je Aktivita deaktivovaná.Takáto situácia nastáva, ak beh Aktivity je zatienený vyvolaním behu inej Aktivity v popredí, napr. prichádzajúci hovor, SMS správa, upozornenia atď. Aktivita vtedy môže ale nemusí zostať viditeľná. V tomto prípade budete implementovať metódy
- onPause() - volaná keď je beh Aktivity pozastavený, v tejto metóde je vhodné ukladať trvalé dáta
- onResume() - volaná pri opätovnom vyvolaní behu Aktivity, tu sa uložené dáta načítavajú
Úloha: Otvorte si projekt HelloAndroid z minulého cvičenia alebo si ho stiahnite a importujte do vývojového prostredia Eclipse.Úloha: Deklarujte v Aktivite src/tuke.fei.hello/Game.java premennú typu long, do ktorej sa bude ukladať stav počítadla a premennú typu GameView pre objekt hracieho poľa.Úloha: Implementujte metódu onPause(), zavolajte super metódu a ak nie je hra v danom momente vyriešená, je treba uložiť aktuálnu hodnotu počítadla (chronometra).Poznámka: Celkový čas behu aktivity aj počas pozastaveného behu získate z už v minulých cvičeniach použitej metódy SystemClock.elapsedRealtime(), ďalej určite využijete volanie metódy getBase() na objekte chronometra.Úloha: Implementujte metódu onResume(), zavolajte super metódu a ak nie je hra vyriešená, je treba nastaviť hodnotu počítadla na uloženú hodnotu a spustiť opätovne počítanie. -
V tomto kroku budete uvažovať situáciu, kedy je beh Aktivity pozastavený, následne je proces ukončený z dôvodu uvoľnenia pamäte iným aplikáciám. Aktivita je v stave, kedy nebola ukončená a môže byť opäť vyvolaná s využitím prechodne uložených dát o stave Aktivity pred termináciou procesu.Poznámka: Je rozdiel medzi prechodne uloženými dátami a trvalo uloženými dátami. V tomto prípade nebola Aktivita ukončená, preto si stále udržiava aj prechodné dáta o predchádzajúcom stave, ktoré sú inak ukončením Aktivity zničené.V tomto prípade budete implementovať metódu
- onSaveInstanceState - ukladá prechodné dáta o stave Aktivity do objektu typu Bundle, ktorý je pri opätovnom vyvolaní aktivity parametrom pre metódu
- onCreate() - volaná pri opätovnom vyvolaní Aktivity, vykonáva načítanie stavu Aktivity, v ktorom sa nachádzala pred termináciou procesu
Úloha: Deklarujte statický kľúč KEY_TILES pre ukladanie poľa dlaždíc a KEY_SCORE_TIME pre ukladanie uplynulého času a inicializujte ich na jedinečné reťazce.Úloha: Implementujte metódu onSaveInstanceState(Bundle), zavolajte jej super metódu a uložte aktuálne pole dlaždíc z hracieho poľa pod príslušným kľúčom volaním metódy putParcelableArray(String, Parcelable[]) na Bundle objekte.Úloha: Uložte aktuálny čas hrania pod príslušným kľúčom volaním metódy putLong(String, long) na Bundle objekte.Úloha: Upravte metódu onCreate(Bundle) tak, aby v prípade neprázdneho Bundle objektu v parametre načítala z daného objektu uložené dáta, teda pole dlaždíc typu Tile a odohratý čas.Úloha: Upravte triedu hracieho poľa src/tuke.fei.hello/GameView.java, pridajte do metódy newGame parameter typu Tile[] a upravte metódu tak, aby bolo zohľadňované prichádzajúce pole dlaždíc.Úloha: Upravte metódu onCreate(Bundle) v Game.java tak, aby v prípade vytvárania hracieho poľa boli využité uložené prechodné údaje, ak existujú. -
Pri hraní akejkoľvek hry môže nastať situácia, že hráč musí hru vypnúť, ale pri ďalšom spustení by chcel rozohratú partiu dohrať. Práve tejto udalosti sa budete venovať v tomto kroku - ako uložiť rozohratú hru, aby po ukončení Aktivity, a teda aj celej aplikácie bolo možné v riešení pokračovať.Úloha: Predpokladajme, že sa možnosť hrať nedokončenú hru sa má vyvolať na podnet hráča nie automaticky, preto vytvorte v hlavnom menu tlačidlo pre túto voľbu a nevyhnutné operácie s tým súvisiace.Ako bolo spomenuté v predchádzajúcich krokoch, ukladanie trvalých dát budete implementovať v metóde onPause(). V princípe budete ukladať zase iba pole dlaždíc a hodnotu časovača. Existuje množstvo spôsobov ako uložiť trvalé dáta, napr. použitím databázy, zápis do súboru. Tu sa naučíte využiť manažment interného perzistetného stavu Aktivity pomocou objektu getPreferences(int) typu SharedPreferences , ktorý dovoľuje ukladať, meniť a získavať dáta vo forme kľúč-hodnota primitívnych typov asociované s Aktivitou.Úloha: Pole dlaždíc budete ukladať ako dva reťazce, spätne parsovateľné, jeden reprezentujúci postupnosť čísiel dlažíc, druhý farby dlaždíc v postupnosti, v akej sú usporiadané v poli. Vytvorte a implementujte pomocné metódy, ktoré vytvoria a vrátia dané reťazce z aktuálneho hracieho poľa dlaždíc.Úloha: Vytvorte a implementujte pomocnú metódu, ktorá z daných reťazcov prichádzajúcich v parametroch metódy spätným parsovaním vráti pole dlaždíc. Túto metódu využijete, ak hráč zvolí možnosť pokračovania riešenia rozohratej hry.Volaním getPreferences(int), ktorej parametrom bude kontextová premenná MODE_PRIVATE (privátny mód, kedy sa dáta ukladajú do privátneho súboru vlastného danej Aktivite), získate objekt, do ktorého dáta zapíšete spôsobom:
- volaním edit() pre možnosť editovania
- pridaním dát pomocou metód putString(String, String) a putLong(String,long)
- potvrdenie uloženia dát volaním commit()
Úloha: Vytvorte metódu saveTiles(), ktorá uloží požadované dáta vrátanie hodnoty časovača pod jedinečnými kľúčmi a aplikujte volanie tejto metódy v onPause().Úloha: V triede src/tuke.fei.hello/Hello.java implementujte akciu na stlačenie tlačidla pre pokračovanie v rozohratej hre tak, aby bolo volané vytvorenie hracieho poľa samozrejme bez zobrazenia dialógu stupňa obtiažnosti. Pre túto voľbu bude treba použiť jedinečný index, ktorý využijete aj v Aktivite Game.Úloha: Pri vytváraní Aktivity Game implementujte funckcionalitu, ktorá ak používateľ zvolí pokračovanie v rozohratej hre, načíta uložené trvalé dáta opäť volaním getPreferences(int) v privátnom móde a použije ich pri vytváraní hracieho poľa.Poznámka: Pri získavaní dát už nie je potrebné využívať editor, preto postačí na získanom objekte iba zavolať potrebné metódy getString(String, String) a getLong(String, long), kde druhými argumentami sú predvolené hodnoty.
Doplňujúce úlohy
Ďalšie zdroje