VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky Obor: Aplikovaná informatika
Vy t v o ř e n í a p l i k a c e p ro p l a t f o r m u A n d ro i d bakalářská práce
Autor: Jaromír Bárta Vedoucí práce: Ing. Jiří Mrkvička
Jihlava 2012
Abstrakt Tato bakalářská práce si klade za cíl seznámit veřejnost s možnostmi vývoje aplikace pro mobilní zařízení s operačním systémem Android. Teoretická část této práce popisuje platformu samotnou, vývojové prostředí a také nástroje a knihovny, které jsou při vývoji aplikace nepostradatelné. Praktická část popisuje vývoj konkrétní aplikace. Jsou zde popsány klíčové funkcionality vyvíjené aplikace a mnoho postupů, které mohou být přínosné pro začínající vývojáře.
Klíčová slova Android, Java, SDK, Eclipse, Google, Aktivita
Abstract The aim of this bachelors work is introducing the public with facilities of development of application for mobile phones with operational system Android. Theoretical part of this work describes platform, developmental environment and also tools and libraries that are necessary during the development of application. Practical part describes development of the particular application. It describes particular funkcionalities of developing application and many working techniques that can be useful for beginning developers.
Keywords Android, Java, SDK, Eclipse, Google, Activity
Vysoká škola polytechnická Jihlava Tolstého 16, 586 01 Jihlava
ZADÁNÍ BAKALÁŘSKÉ PRÁCE
Autor práce: Studijní program: Obor: Název práce: Cíl práce:
Jaromír Bárta Elektrotechnika a informatika Aplikovaná informatika Vytvoření aplikace pro platformu Android Vytvořte aplikaci, která umožní vyhledat dle daných parametrů nebo polohy GPS restaurace v okolí. Navrhněte způsob komunikace aplikace s databází MySQL, která bude dle zadaných parametrů poskytovat data. Dále vytvořte funkce pro zobrazení okolních restaurací na mapě, odesílání recenzí, navigaci k vybrané restauraci, výpis jídelních lístků, vyhledávání restaurací podle jídel, zjištění města, ve kterém se uživatel nachází atp. Popište nástroje potřebné pro vývoj aplikace, programovací jazyk a potřebné SDK knihovny.
Ing. Jiří Mrkvička vedoucí bakalářské práce
Ing. Bc. Michal Vopálenský, Ph.D. vedoucí katedry Katedra elektrotechniky a informatiky
Poděkování Rád bych poděkoval mému vedoucímu bakalářské práce Ing. Jiřímu Mrkvičkovi za inspiraci při tvorbě této bakalářské práce. A dále bych také rád poděkoval všem členům své rodiny za jejich podporu.
Prohlašuji, že předložená bakalářská práce je původní a zpracoval jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutím licence. V Jihlavě dne 2. 1. 2012 ...................................................... Podpis
Obsah 1
Úvod .......................................................................................................................... 9
2
Platforma Android ................................................................................................... 10
3
2.1
Dostupné verze systému................................................................................... 10
2.2
Architektura platformy Android....................................................................... 12
Nástroje použité při vývoji aplikace........................................................................ 13 3.1
SDK pro Android ............................................................................................. 13
3.1.1
DDMS....................................................................................................... 13
3.1.2
SDK manager............................................................................................ 14
3.1.3
AVD manager............................................................................................ 14
3.1.4
Emulátor.................................................................................................... 14
3.1.5
Draw9patch ............................................................................................... 15
3.2
Eclipse .............................................................................................................. 16
3.2.1 4
Struktura Android projektu...................................................................................... 17 4.1
5
Android Development Tools..................................................................... 17
Aktivity a intenty.............................................................................................. 20
4.1.1
Teoretické stavy aktivit ............................................................................. 21
4.1.2
Životní cyklus aktivit ................................................................................ 21
4.1.3
Intent ......................................................................................................... 23
Aplikace „Kam na jídlo“ ......................................................................................... 26 5.1
Struktura Aplikace............................................................................................ 26
5.2
Úvod Activity ................................................................................................... 27
5.2.1
Vyhledávání .............................................................................................. 28
5.2.2
Určení polohy zařízení.............................................................................. 28
5.2.3
Našeptávač ................................................................................................ 29
5.2.4
Ošetření připojení zařízení k síti Internet ................................................. 30
5.3
List Activities ................................................................................................... 31
5.3.1
ListJidlo Activity....................................................................................... 31
5.3.2
ListRestaurace Activity............................................................................. 32
5.4
Map Activity..................................................................................................... 33
5.5
Detail Activity .................................................................................................. 34
5.5.1
Detail Restaurace ...................................................................................... 35
5.5.2
Detail Jídla ................................................................................................ 36
5.6
OdeslatRecenzi Activity................................................................................... 37
5.6.1
Získání fotografie jídla.............................................................................. 38
5.6.2
Odeslání recenze ....................................................................................... 38
5.7
JidelniListek Activity ....................................................................................... 38
5.8
Design Aplikace ............................................................................................... 39
5.9
Připojení k databázi.......................................................................................... 40
6
Závěr........................................................................................................................ 42
7
Seznam použité literatury ........................................................................................ 43
8
Seznam obrázků....................................................................................................... 44
9
Seznam zkratek........................................................................................................ 45
I. TEORETICKÁ ČÁST
1 Úvod Cílem mé bakalářské práce je vytvořit program pro platformu Android, který na základě aktuální polohy uživatele a zadaných parametrů vyhledá restaurace v jeho okolí. Podíl takzvaných chytrých telefonů se na trhu každým rokem rapidně zvyšuje a tyto přístroje jsou dnes již dostupné prakticky komukoliv. Právě aplikace vytvořené pro tyto telefony dokážou uživateli ulehčit každodenní činnosti. V dnešní době již není takovým problémem zjistit, jakým spojem se dostanete domů, jaké bude odpoledne počasí, kolik kilometrů jste před chvílí uběhl, nebo kde se můžete dobře najíst. Sám již několik let chytrý telefon vlastním a aktivně využívám mnoho aplikací, které jsou v naprosté většině volně stažitelné. Nejrozšířenějšími operačními systémy pro chytré telefony jsou v dnešní době Apple iOS, Windows Phone 7, Nokia Symbian OS, nebo již zmíněný Google Android. Moje bakalářská práce bude vyvinuta pro operační systém Android, protože prodej telefonů s tímto operačním systémem je nyní v Evropě na prvním místě a každým měsícem stoupá. Dalším důvodem je také to, že mám s touto platformou největší zkušenosti a v neposlední řadě, že jsou aplikace programovány v programovacím jazyce Java, který je mi blízký. Aplikace na vyhledávání okolních restaurací by měla splňovat jisté funkcionality, jako je například možnost zobrazení vyhledaných restaurací na mapě, navigace k vybrané restauraci, vyhledání konkrétního jídla, detail vybraného jídla, odeslání recenze s fotkou jídla a podobně. Podrobněji tyto funkce popíšu v praktické části této bakalářské práce. Aplikace bude odesílat parametry na webovou PHP stránku, jejímž prostřednictvím bude získávat data z databáze mySQL.
9
2 Platforma Android Tuto open-source platformu začala již v roce 2003 vyvíjet Kalifornská firma Android Inc., která byla v roce 2005 prodána společnosti Google Inc, a stala se tak jednou z jeho dceřiných společností. Dne 5. listopadu 2007 bylo vytvořeno konsorcium Open handset Aliance, složené ze společností zabývajících se výrobou mobilních zařízení, čipů nebo aplikací. Toto konsorcium si kladlo za cíl vytvořit otevřený standart pro mobilní zařízení. V ten samý den byl ohlášen první produkt tohoto konsorcia, Android, postavený na Linuxovém jádře. O týden později také vydali první open-source Android SDK pro vývojáře. Prvním komerčně dostupným mobilním telefonem s operačním systémem Android se stal produkt společnosti HTC pod názvem Dream. Již před rokem však počet zařízení běžících na tomto operačním systému překonal hranici dvou set kusů. Největší podíl z tohoto počtu mají jednoznačně mobilní telefony, avšak Android se dnes už dá nalézt také na navigacích, tabletech, netboocích, čtečkách knih, lékařském zařízení, nebo například náramkových hodinkách. V budoucnosti je dále plánováno použití tohoto systému do domácích spotřebičů.
2.1 Dostupné verze systému Od první verze v roce 2008 přibylo několik aktualizací, které odstraňují chyby a rozšiřují systém o nové funkce. Google tyto verze pojmenovává po různých sladkostech.
Obrázek 1- Historie verzí Androidu
Verze systému Android a jejich nejdůležitější vylepšení:
Android 1.5 – Cupcake o Možnost nahrávat a sledovat videa z kamery. o Softwarová klávesnice rozšířena o automatické dokončování slov. o Animace při přechodu mezi obrazovkami. 10
Android 1.6 – Donut o Vylepšený Android Market. o Možnost označení více fotek v Galerii pro vymazání. o Quick Search Box
Android 2.0/2.1 – Eclair o Optimalizována rychlost hardwaru o Podpora pro více velikostí a rozlišení displeje o Digitální zoom fotoaparátu
Android 2.2 – Froyo o Možnost instalovat aplikace na paměťovou kartu. o Možnost vytvořit z telefonu WiFi hotspot, nebo sdílet internetové připojení přes kabel USB. o Adobe vydalo plugin Adobe Flash 10.1.
Android 2.3/2.4 – Gingerbread o Podpora video formátu WebM pro HTML5 video o Podpora protokolu SIP pro internetovou telefonii
Android 3.0/3.1/3.2 – Honeycomb o Optimalizovaná podpora pro tablety s novým virtuálním a holografickým prostředím. o Přidána systémová lišta, která urychlí přístup k oznámením, statusům, a takzvaným měkkým navigačním tlačítkům. o Přidán panel akcí, umožňující rychlý ke kontextovému menu, navigaci, nebo například komponentám.
Android 4.0 - Ice Cream Sandwich o Přidány virtuální tlačítka, nahrazující kapacitní. o Widgety jsou v menu odděleny do nového tab-listu. o Snadnější vytváření složek.[1]
11
2.2 Architektura platformy Android Návrh této architektury je založen na otevřenosti systému s co největší flexibilitou, umožňující jeho rychlý vývoj.
Obrázek 2 - Architektura Android[2]
Applications: Tato vrstva je tvořena základními aplikacemi, které android nabízí. Mezi ně patří například e-mail klient, program pro tvorbu sms, kalendář, mapy, navigace, prohlížeč, kontakty, a další. Všechny tyto aplikace jsou napsány v jazyce Java.
Application framework: Obsahuje třídy a rozhraní potřebné pro vývoj Aplikací. Tím, že je Android otevřenou platformou, mohou vývojáři vytvářet velice pestré a inovativní aplikace. Mají také možnost využít veškerý hardware zařízení, jako například určení lokace, požití kompasu, gyroskop, odesílání sms, volání a mnohé další.
Libraries: Sada C/C++, které jsou využívány různými komponenty systému Android. Můžeme zde najít například relační databázi SQLite, OpenGL pro tvorbu 3D grafiky, WebKit pro renderování HTML, nebo Media Framework pro spouštění audio/video souborů.
Android Runtime: Veškeré spuštěné aplikace v OS Android běží na virtuálním stroji Dalvik, který vyvinula společnost Google. Toto řešení nese mnoho výhod, jako je například to, že aplikace nemohou nijak ovlivnit chod operačního systému, a zároveň také nemají přímý přístup k hardwaru. Dále také umožňuje vytvářet platformu nezávislou na hardwaru. 12
3 Nástroje použité při vývoji aplikace 3.1 SDK pro Android Zahrnuje nástroje pro vývoj aplikací pro platformu Android. Tento balíček nástrojů je podporován všemi hlavními platformami operačních systémů jako jsou Windows, Mac OS nebo Linux. Nejpoužívanějšími z těchto nástrojů jsou nástroje pro: debugging(ddms), emulátor, AVD manager, SDK manager nebo hierarchy viewer. Nejaktuálnější
SDK
knihovny
jsou
volně
ke
stažení
na
stránkách
http://developer.android.com/sdk/index.html
3.1.1 DDMS Nástroj DDMS slouží k ladění spuštěného programu, který běží na emulátoru nebo na připojeném zařízení. Pomocí DDMS můžeme nasimulovat situace, které mohou na zařízení nastat v době, kdy je aplikace spuštěna. Například můžeme simulovat příchozí volání, příchozí textovou zprávu, odeslat na zařízení informace o poloze, omezovat rychlost připojení. Mezi další funkce DDMS také patří možnost vytvoření snímku obrazovky zařízení nebo zachytávání chyb (LogCat), které nastanou při běhu aplikace,.
Obrázek 3 - DDMS -Emulator Control
13
3.1.2 SDK manager Tento nástroj slouží ke správě vašeho SDK balíčku. S jeho pomocí můžeme doinstalovat nové verze platforem Android nebo nové utility. Zároveň tento nástroj hlídá, aby všechny komponenty balíčku SDK byly aktuální.
3.1.3 AVD manager Pomocí tohoto nástroje si můžete vytvořit virtuální zařízení. Při vytváření můžete nastavit různé parametry, které určují, jak se bude emulátor při spuštění chovat. Nejdůležitějšími parametry jsou nejspíše volba verze systému Android, rozlišení obrazovky, úhlopříčka nebo velikost paměti. Prakticky lze nastavit vše tak, aby emulátor ve všech směrech simuloval reálné zařízení.
3.1.4 Emulátor Emulátor slouží k testování vaší aplikace bez přítomnosti fyzického zařízení. Jde o virtuální stroj spuštěný v operačním systému na vašem počítači, který se chová jako zařízení s operačním systémem Android. Podle předem nastavených hodnot emulátoru, čímž lze nasimulovat téměř všechna známá zařízení, na kterých systém Android 14
v současnosti běží. Při vývoji aplikace je velmi důležité vytvořit několik virtuálních zařízení, které se liší například ve verzích systému Android nebo rozlišením obrazovky, čímž se zvýší pravděpodobnost, že na různých zařízeních bude aplikace vypadat a fungovat stejně. Přestože lze, jak jsem již zmínil, nastavit parametry emulátoru tak, aby se choval jako reálné zařízení, doporučuje se před samotným dokončením aplikaci otestovat na několika fyzických zařízeních.
Obrázek 4 - Emulator
3.1.5 Draw9patch Pomocí tohoto nástroje je možné vytvářet z .PNG souborů, soubory .9.PNG. Výhodou těchto souborů je možnost nastavit na obrázku body, které se budou při změně velikosti roztahovat a dále také body, ve kterých bude zobrazen například text. Tyto soubory se hodí například pro tvorbu tlačítek, ve kterých při změně jejich velikosti nedochází k deformaci důležitých částí jako je text nebo obrázek uvnitř tlačítka. Tento způsob úpravy obrázků můžeme využít například v okamžiku, kdy pro různé velikosti obrazovek potřebujeme roztáhnout tlačítka přes celou šířku obrazovky.
Obrázek 5 - Příklad 9patch obrázku
15
3.2 Eclipse Jistě lze vyvíjet aplikace pro Android i v poznámkovém bloku, ale tento způsob je naprosto neefektivní. Dobrou náhradou je tedy open-source vývojové prostředí Eclipse, které je oficiálně podporováno pro vývoj aplikací běžících na systému Android. Zároveň je také asi nejpoužívanějším prostředím při programování v jazyce Java. Prostředí také zahrnuje funkce jako oprava syntaxe v reálném čase, navrhování knihovních funkcí, možnost grafického zobrazení xml nákresů, barevné zvýraznění kódu, hromadné přejmenování prvků v rámci celého projektu nebo například automatické vytváření nových tříd a jejich metod. Nespornou výhodou tohoto vývojového prostředí je také možnost rozšíření o velké množství pluginů. Pro potřeby vývojáře aplikací pro platformu Android vznikl plugin s názvem ADT (Android Development Tools).
Obrázek 6 - Eclipse
16
3.2.1 Android Development Tools Tento plugin rozšiřuje základní Eclipse o množství doplňků, které vývojářům ve velké míře usnadňují a zrychlují jejich práci. V prostředí si po instalaci vyberete umístění vašich nástrojů SDK. Veškeré nástroje pak budete moci spouštět prostřednictvím tohoto prostředí. Zbavíte se tedy zdlouhavého spouštění nástrojů přes konzoli a mnoho zdlouhavých nastavení zvládnete na několik „kliků“. Tento plugin také umožňuje vytvářet android projekt s předpřipravenou strukturou.
4 Struktura Android projektu Stejně jako u jakéhokoliv jiného Java projektu je struktura pevně daná tak, aby byla čitelná pro překladový systém operačního systému Android. V následujících odstavcích popíši, co jednotlivé položky stromové struktury znamenají.
Obrázek 7- Struktura projektu
/SRC Složka SRC obsahuje balíčky, ve kterých se nacházejí Java soubory se zdrojovými kódy. Tyto balíčky mohou obsahovat vytvořené třídy, nebo aktivity. V praxi je vhodné roztřídit zdrojové kódy do různých balíčků podle jejich základní funkce.
/GEN Soubory ve složce GEN jsou automaticky generovány Eclipse pluginem ADT. Tato složka obsahuje soubor R.java, který obsahuje reference na všechny zdroje použité v aplikaci. Každý nový zdroj, který je přidán do aplikace, je automaticky indexován v tomto souboru. 17
/Android[verze] Tato složka je nazývána cílovou knihovnou systému Android. Obsahuje soubor Android.jar., který poskytuje všechny základní knihovny systému. V tomto případě je tato složka rozšířena také o knihovní funkce pro práci s mapami. Verze v závorce odpovídá verzi systému, který byl zvolen při tvorbě projektu.
/Assets V této složce jsou uchovávána takzvaná raw data. Mohou to být například audio, video nebo obrázkové soubory. K těmto souborům přistupujeme pouze prostřednictvím knihovny AssetsManager. V praxi se tato složka používá velmi zřídka, například když potřebujeme číst data po bytech.
/BIN Pokud se nám podaří projekt úspěšně zkompilovat, uloží se soubory po kompilaci právě do této složky. Tato složka pak bude obsahovat soubory tříd, Dex soubory, které jsou spustitelné virtuálním strojem Dalvik, APK archivy a další.
/RES Pojmenování složky vzniklo zkrácením anglického slova resources. V překladu toto slovo znamená zdroje. Jejím obsahem jsou tedy externí soubory, které v aplikaci můžeme využít. Může jít například o obrázky, xml soubory stylů, řetězce, zvukové soubory nebo například animace. Podsložky: /drawable - tato složka obsahuje převážně rastrovou grafiku, která se využívá při stylizování grafického prostředí. V samotné struktuře projektu však existují tyto složky čtyři. Konkrétně jde o drawable-ldpi, mdpi, hdpi, xhdpi. Toto rozdělení vzniklo kvůli různému rozlišení obrazovek. Pokud tedy chceme, aby výsledné grafické prostředí aplikace vypadalo na různých typech displayů alespoň podobně, je zapotřebí vložit grafické soubory do všech těchto složek. Název vkládaného souboru musí ve všech případech zůstat stejný, ale rozměr obrázkových souborů by se měl v doporučeném poměru měnit (obrázek 8). Android poté automaticky, podle rozlišení obrazovky vybere, ze které složky bude zdrojové soubory používat.
18
Obrázek 8 - Příklad rozdílného rozlišení
/layout - v této složce se nachází všechny xml návrhy uživatelského prostředí. Jde v podstatě o rozložení ovládacích prvků v oblasti obrazovky a samozřejmě také definice jejich vizuální podoby. /values - již z názvu je zřejmé, že tato složka bude obsahovat soubory, ze kterých bude aplikace čerpat různá data. Konkrétně jde o xml soubory, které mohou obsahovat řetězce, pole různých hodnot, definice stylů nebo například definice vlastních barev. Tento způsob zapisování dat má oproti přímému vkládání do kódu mnoho jednoznačných výhod. Můžeme například změnit celé jazykové sady pouhým výběrem jiného xml souboru. To stejné platí například i u barev nebo stylů, kde změnou hodnoty ovlivníme všechny prvky, které se na ní odkazují. Vše se tedy stává mnohem přehlednějším, než hledat dané parametry přímo v kódu.
Android Manifest Základem každé aplikace programované pro platformu Android je xml soubor AndroidManifest, který se nachází přímo v kořenovém adresáři projektu. Tento soubor obsahuje deklaraci obsahu aplikace. Mezi nejdůležitější elementy tohoto souboru patří: uses-permission – pomocí těchto elementů nastavujeme práva, které budou aplikace ke správnému chodu potřebovat. Je zde možné nastavit přístup k internetu, vyhledávání polohy, možnost vytáčení čísla, odeslání sms a mnoho dalších funkcí, o jejichž používání by měl být uživatel informován. Není dobré zbytečně udělovat oprávnění k prostředkům, které se v aplikaci nevyužívají, protože při samotné instalaci aplikace bude nutné, aby uživatel tento seznam oprávnění potvrdil. Bylo by tedy dosti podezřelé, pokud by se například aplikace určená k převodu z dekadické soustavy do binární dožadovala přístupu k prostředkům určujícím lokaci. 19
uses-sdk - tyto elementy deklarují, pro kterou verzi SDK byla aplikace přeložena. Můžeme také s jeho pomocí nastavit minimální potřebnou verzi systému Android, ve které je aplikace ještě spustitelná. uses-library – nastavují připojení některých elementů jako jsou služby pro správu knihoven map a podobně. Aplication - do tohoto tagu zapisujeme všechny aktivity (kapitola 4.1), které jsou v aplikaci spouštěny. Je zde také definována aktivita, která je spuštěna jako první po startu programu.
4.1 Aktivity a intenty Aktivita je nejčastěji využívána pro zobrazení uživatelského prostředí a nastavení veškerých funkcionalit, které má daná obrazovka umožňovat. Aplikace se většinou skládá z více aktivit, které jsou navzájem propojené. Všechny tyto aktivity musejí být deklarovány v souboru AndroidManifest.xml. Aktivita, která se má spustit jako první po spuštění aplikace je označena jako hlavní a v manifestu se vyznačuje těmito komponentami:
Při přechodu z jedné aktivity do druhé je původní aktivita zastavena. Nová aktivity se vloží na vrchol zásobníku aktivit (Activity Stack). Existuje několik možností, jak aktivitu opustit. Pro opuštění aktivity se na mobilním telefonu nejčastěji používá tlačítko „zpět. Při zmáčknutí tohoto tlačítka je aktuální aktivita zničena a odstraněna z vrcholu zásobníku.
20
4.1.1 Teoretické stavy aktivit Pro každou aktivitu vždy platí jeden z následujících teoretických stavů:
Aktivní Aktivita je spuštěna, běží v popředí. Pro uživatele je tedy tato aktivita viditelná a může s ní interagovat. Nachází se v prostoru mezi metodami onResume() a onPause().
Pozastavená V tomto případě je aktivita také spuštěna, ale již neběží v popředí. Aktivita v tomto stavu může být viditelná, ale část její obrazovky překrývá nějaké sdělení. Nejčastěji jde například o dialogové okno, které může být vyvolané samotnou aplikací nebo odněkud zvenčí. Pokud je aktivita pozastavena, nemůže uživatel v této aktivitě interagovat. Tato aktivita se nachází mezi metodami onStart() a onStop(), ale zároveň není aktivní.
Zastavená Aktivita nacházející se v tomto stavu byla spuštěna, ale je překryta nějakými jinými aktivitami, které uživatel spustil přímo v aplikaci nebo byly aktivovány zvenčí. Tato aktivita pro uživatele není viditelná, ale může s ním komunikovat pomocí různých sdělení. Tato aktivita je ve stavu mezi metodami onCreate() a onDestroy(), avšak není aktivní ani pozastavená.
Mrtvá Tuto aktivitu uživatel buď nikdy nespustil, byla dokončena, nebo byla násilně ukončena, například kvůli nedostatku operační paměti. Aktivita v tomto stavu se nachází mimo oblast mezi metodami onCreate() a onDestroy().
4.1.2 Životní cyklus aktivit Vysněný stav vývojáře aplikací pro mobilní zařízení je, že jeho aktivita bude vždy na popředí a nebude nikdy ničím vyrušena. Pokud se ale vrátíme zpět do reality, zjistíme, že jisté aktivity, kterými mobilní telefon disponuje, jsou nejspíše důležitější než právě ta vaše. I když to v dnešní době možná tak nevypadá, mobilní telefon byl původně vyvinut jako zařízení zprostředkující telefonní hovory. Je tedy velice pravděpodobné, že vaši aplikaci přeruší příchozí hovor nebo například zpráva sms. Níže je popsáno, co se v případě přerušení s aplikací děje. 21
Obrázek 9 - Životní cyklus aktivit[3]
Metoda onCreate() je implementována prakticky ve všech podtřídách třídy Activity. Tato metoda slouží zejména k inicializaci uživatelského rozhraní a provádění operací, které je třeba provést pouze jednou. Je zde například prováděno nastavení výsledného layoutu dané aktivity, a to voláním metody setContentView(int) (kapitola 5.8). Volání metody onCreate() může nastat ve třech možných situacích:
Metoda onCreate() je metodou aktivity, která je spuštěna poprvé. V tomto případě je pak tato metoda volána s parametrem null. Znamená to tedy, že veškerý obsah je generován podle základního nastavení této metody.
Pokud již byla aktivita spuštěna a následně ukončena, je metoda onCreate() spuštěna s parametrem instance třídy Bundle, který přenese obsah získaný z metody onSaveInstanceState(). Je tedy vhodné přiřadit instanci třídy Bundle co nejvíce informací, aby bylo možné aktivitu při jejím znovuspuštění vrátit do původního stavu.
22
Třetí situace, kdy je metoda onCreate() volána, nastane v případě, dojde-li ke změně stavu zařízení. Ukázkou této změny stavu je například rotace zařízení.[4]
Metoda onDestroy() je volána za účelem ukončení aktivity. Volání této metody může nastat, pokud aktivita zavolá metodu finish() nebo pokud systém pro nedostatek operační paměti aktivitu násilně ukončí.[4] Metoda onStart() je volána, pokud se daná aktivita dostane do popředí, a to v případech, pokud je aktivita nově spuštěna nebo se dostala do popředí po svém skrytí. Metoda onStop() je volána, pokud se má daná aktivita zastavit. Metoda onRestart() je volána, pokud byla aktivita zastavena a má být znovu spuštěna.[4] Metoda onResume() je volána předtím, než se daná aktivita dostane do popředí (například po zrušení dialogového okna nebo po restartu ze zastavení). Naopak při přesunu dané aktivity do pozadí je volána metoda onPause().[4]
4.1.3 Intent Intent je ve většině případů použit jako prostředník mezi aktivitami. Pokud chceme spustit novou aktivitu, v běžící aktivitě vytvoříme novou instanci třídy Intent, a s její pomocí novou aktivitu spustíme. Zároveň jsou předány informace, jak a co chceme v nové aktivitě provádět. V rámci jedné aplikace je použit takzvaný explicitní Intent. Prvním parametrem je název aktivity, která je právě spuštěna a název třídy, kterou chceme volat. Intent myIntent = new Intent(UvodActivity.this, ListJidlo.class); Bundle bundle = new Bundle(); bundle.putString("hledane_jidlo", form_string); UvodActivity.this.startActivity(myIntent.putExtras(bundle));
Pomocí instance třídy Intent je také možno přenášet data mezi aktivitami. Například využitím třídy Bundle, do jejíž instance vložíme data a jim odpovídající klíče. Intent cameraIntent = new Intent(…); startActivityForResult(Intent, KEY); protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case KEY:
23
break; }
if (resultCode == RESULT_OK){ ... }
Pokud bychom naopak ze spouštěné aktivity potřebovali vrátit nějaký výsledek, vytvoříme si metodu onActivityResult(int,int,Intent). Novou aktivitu pak spustíme metodou startActivityForResult(Intent, KEY).
24
II. PRAKTICKÁ ČÁST
25
5 Aplikace „Kam na jídlo“ Tato aplikace slouží k vyhledávání jídel a restaurací v okolí uživatele. V dalších kapitolách je popsáno, jak tato aplikace funguje.
5.1 Struktura Aplikace Tato aplikace je sestavena ze sedmi aktivit. Každá z těchto aktivit detailně je popsána v následujících kapitolách. Tyto aktivity jsou navzájem propojeny Intenty. Spouštěcí aktivitou je v této aplikaci Uvod Activity. Zde uživatel nastaví a parametry a zadá název jídla/restaurace.
Následně
je
spuštěna
další
aktivity,
která
zobrazí
seznam
restaurací/jídel. Z této aktivity je možné přejít na zobrazení restaurací na mapě nebo přímo na detail jídla/restaurace. V případě že se jedná o jídlo, je má uživatel možnost napsat a odeslat recenzi o tomto jídle. V detailu restaurace je také možnost spustit aktivitu zobrazující jídelní lístek. Celou tuto strukturu ilustruje obrázek 10.
Obrázek 10 - Struktura aplikace
26
5.2 Úvod Activity Tato aktivita je první aktivitou, která se dostane do popředí po spuštění aplikace. Je to také jedna z nejdůležitějších aktivit, která obsahuje největší množství funkcí. Hned po startu aktivity se spouští funkce pro určení polohy zařízení, která je dále podrobněji popsána (kapitola 5.2.2). Při zjištění polohy zařízení aplikace volá metodu getAddressFromLocation(Location, Context, Handler, která pomocí třídy Geocoder nastaví jako text spinneru název města, ve kterém se uživatel nachází. Tato funkce se nachází na samostatném vlákně, aby nebránila plynulému běhu aplikace.
Obrázek 11 - Uvod Activity
Uživatel si ale také může sám zvolit okresní město, ve kterém by chtěl jídlo nebo restauraci vyhledat. Po stisku spinneru se zobrazí dialogové okno se seznamem krajů, a dále při výběru kraje další okno se seznamem okresních měst daného kraje. Pro určení lokace z adresy aplikace volá metodu getLocationFromAddress(), která také pracuje s třídou Geocoder. Nevýhodou manuálního nastavení města je to, že geologická poloha ukazuje vždy na střed města. Tento problém by se dal vyřešit připojením databáze ulic. Uživatel by měl poté možnost výběru ulice v dalším seznamu, čímž by se získaná poloha výrazně zpřesnila. 27
Aby měl uživatel jistotu, že aplikace pracuje, je po dobu určování polohy spuštěn progressbar, který nahrazuje ikonu pro obnovení aktuální polohy. Hlavním smyslem této aplikace je prvotně vyhledávání. Již v úvodní aktivitě si tedy uživatel může vybrat, co a z jakého okruhu potřebuje vyhledat. V této aplikaci má na výběr ze tří možností (odstavec 5.2.1). Po stisku tlačítka Vyhledat aplikace, v závislosti na nastavených parametrech zvolí, která aktivita má být spuštěna. Mohou zde nastat tři možnosti přechodu na další aktivitu. V každém případě jsou ale do další aktivity předány parametry obsahující geologickou polohu zařízení. Pokud uživatel pomocí tlačítka vybral vyhledávání jídel, je spuštěna aktivita ListJidlo s dalším parametrem obsahujícím hledaný řetězec. Pokud bylo vybráno vyhledávání restaurací nebo nejbližší místa, je spuštěna aktivita ListRestaurace. Zde se potom liší pouze předávané parametry. Pro vyhledání restaurace je přidán parametr hledaný řetězec a parametr nejblizsi s hodnotou false. Pro nejbližší místa je to pouze parametr nejblizsi s hodnotou true. Tímto nastavením parametrům určíme, jak se bude následující aktivita po spuštění chovat.
5.2.1 Vyhledávání Aplikace umožňuje vyhledávat podle názvu, buď z databáze jídel nebo restaurací. Název je vkládán do komponenty AutoCompleteTextView. Tato komponenta vypadá jako klasické formulářové pole, které je navíc rozšířeno o našeptávač (kapitola 5.2.3). Volba databáze je zprostředkována tlačítky nad tímto formulářem. Další možností, která je uživateli nabídnuta, je vyhledat nejbližší restaurace v jeho okolí. Zde již není potřeba zadávat jméno. V tomto případě je proto formulářové pole odstraněno.
5.2.2 Určení polohy zařízení O získání polohy zařízení se v této aplikaci stará třída MyLocation. Tato třída obsahuje systém podmínek určující, který zdroj polohy je dostupný. V této aplikaci jsou k dispozici následující zdroje polohy:
28
GPS provider Jde o systém družic vyvinutý Ministerstvem obrany USA. Pomocí tohoto systému lze zjistit přesný čas a polohu, kdekoliv na zemi nebo nad zemí s přesností do deseti metrů. Tato služba je s omezenou přesností volně nabídnuta veřejnosti. Protože jde o nejpřesnější určení polohy, tato aplikace jako první zjišťuje, zda zařízení disponuje GPS modulem a zda je tento modul zapnut. Pokud je zapnut, aplikace se přikloní právě k tomuto poskytovateli polohy. Jednou z nevýhod určování polohy podle GPS je obtížné získání satelitního signálu v prostorách budov nebo jiných zastřešených objektech. V android manifestu vyžaduje povolit oprávnění ACCESS_FINE_LOCATION.
Network provider Pokud je modul GPS vypnut nebo ho zařízení neobsahuje, výsledná poloha je určena podle polohy přístupového bodu WIFI nebo podle polohy vysílačů poskytující telefonní signál. Je zde opět upřednostňováno přesnější zjištění polohy. V případě připojení k WIFI síti se přesnost pohybuje v řádu desítek metrů. V případě získání polohy podle signálu telefonních vysílačů může jít o chybu až několik kilometrů, v závislosti na vzdálenosti zařízení od této věže. V android manifestu je vyžadováno oprávnění ACCESS_COARSE_LOCATION nebo ACCESS_FINE_LOCATION.
Passive provider Tento zdroj vrací polohu, kterou získá od ostatních poskytovatelů nebo služeb. Je využíván pouze v případě, že ani jeden z předchozích zdrojů není dostupný, k čemuž prakticky nikdy nedochází.
Výsledkem tohoto všeho je, že tato aplikace dokáže prakticky na jakémkoliv místě na Zemi získat s různou chybou (která však v naprosté většině případů nepřesáhne řádově stovky metrů) polohu zařízení.
5.2.3 Našeptávač Jak již bylo zmíněno, našeptávač je v této aplikace realizován komponentou AutoCompleteTextView. Této komponentě je navíc přiřazen „posluchač“ změny textu TextChangeListener. Při každé změně textu ve formuláři je potom volána metoda porovnej(), jejíž funkcionalita je popsána v dalším odstavci. 29
Pokud uživatel zadal právě tři znaky, je vytvořeno nové vlákno, ve kterém je odeslán dotaz k databázi. Tím, že je vytvořeno nové vlákno, nemusí uživatel čekat na dokončení operace a může dále pracovat v uživatelském prostředí (například zadávat další znaky). Návratovou hodnotou je následně pole řetězců, kde každý řetězec v tomto poli začíná zadanými třemi znaky. Pokud je pole staženo a uživatel zadá další znak, zobrazí se nad formulářovým polem list řetězců začínajících hledaným výrazem. Zde již nedochází k připojení k databázi, ale zobrazené řetězce jsou filtrovány ze staženého pole. Tím je při zadávání dalších znaků zajištěno mnohem plynulejší zobrazování řetězců v listu našeptávače. Pokud se uživatel dostane opět pod tři znaky, je tažené pole řetězců smazáno a celá operace dále pokračuje tak, jak již bylo popsáno.
5.2.4 Ošetření připojení zařízení k síti Internet Jelikož tato aplikace stahuje data z databáze umístěné na webu, je důležité, aby zařízení bylo v případě potřeby připojeno k síti Internet. Tato aplikace tedy obsahuje metodu s názvem isOnline(), která navrací hodnotu typu boolean. Pro zjištění stavu připojení jsou v této metodě využity třídy ConnectivityManager a NetworkInfo, s jejichž pomocí aplikace získá systémové informace o internetovém připojení zařízení. Metoda isOnline je volána při samotném spuštění aktivity a při každé uživatelské činnosti závislé na připojení. Pokud je zařízení připojeno k síti Internet, je návratová hodnota metody isOnline() true a aplikace přejde k požadované činnosti. Pokud tomu tak není, metoda navrací hodnotu false a vzápětí je volána metoda runWirelessDialog(), jejíž funkcionalita je popsána v dalším odstavci. Po zavolání metody runWirelessDialog() je v uživatelském rozhraní spuštěno dialogové okno, které uživatele aplikace upozorní, že jeho zařízení není připojené k síti Internet. Toto dialogové okno také kromě této informace obsahuje dvě tlačítka. První z tlačítek nese název nastavení a po jeho stisku je vytvořen instance třídy Intent s parametrem Settings.ACTION_WIRELESS_SETTINGS. Následně je spuštěna nová aktivita právě s tímto indentem. Výsledkem toho se uživateli zobrazí systémové nastavení bezdrátových sítí jeho mobilního zařízení, ve kterém si následně pohodlně zvolí typ
30
připojení k síti Internet. Během této činnosti je aplikace pozastavena a při návratu zpět pokračuje od místa zastavení. Aby byla uživateli poskytnuta možnost volby, obsahuje dialogové okno také tlačítko storno. Po jeho stisknutí se dialogové okno zavře a uživatel se ocitne zpět v uživatelském prostředí aplikace. Tím se mu nabídne například možnost aplikaci opustit.
5.3 List Activities Aktivity ListJidloActivity a ListRestaurace aktivity mají téměř stejnou funkcionalitu. Odlišuje je pouze práce s jinými daty (kapitola 5.3.1 a kapitola 5.3.2). Uživatelské prostředí této aktivity je tvořeno tlačítkem, pomocí kterého je spouštěna aktivita MapActivity(kapitola 5.4). Dále je zde také komponenta listview, jejíž každý řádek reprezentuje vyhledanou restauraci nebo jídlo.
Obrázek 12 - ListJidlo Activity
5.3.1 ListJidlo Activity Hlavním smyslem této aktivity je výpis jídel do listu, v závislosti na parametrech získaných v předchozí aktivitě UvodActivity. Konkrétně se jedná o parametr obsahující řetězec s názvem hledaného jídla a parametry určující geografickou polohu, v jejímž okolí má být restaurace vyhledána. Na základě těchto hodnot je následně vytvořen dotaz na webovou databázi a stáhnuta požadovaná data. Tyto data obsahují pro každé 31
vyhledané jídlo řetězce hodnot a tyto jim příslušející klíče:
fid – identifikační číslo jídla
food – název jídla
post_title – název restaurace
price – cena jídla
price_ID – měna, ve které je cena vyjádřena
distance – vzdálenost mezi zařízením a restaurací
lat – zeměpisná šířka restaurace
lng – zeměpisná délka restaurace
rate – hodnocení jídla
rid – identifikační číslo restaurace
Řetězce s klíči food, post_title, price, distance a rate jsou použity pro výpis položek v komponentě ListView, jak je možné vidět na obrázku 12. Řetězec fid je použit jako parametr při spuštění aktivity DetailActivity. Řetězce rid, lat, lng a post_title jsou předávány při spuštění aktivity MapActivity.
5.3.2 ListRestaurace Activity Tato aktivita se stará o výpis restaurací. Po startu této aktivity je předáno několik parametrů z aktivity předchozí. Podle parametru typu boolean s názvem nejblizsi se určí, jaký dotaz na databázi má být vytvořen. Pokud proměnná nejblizsi nabývá hodnoty true, je vytvořen dotaz, který má navrátit informace o restauracích v okolí požadovaného místa. Pokud nabývá hodnoty false, je vytvořen dotaz, který hledá restauraci podle řetězce zadaného v předchozí aktivitě. V obou případech jsou ale pro každou nalezenou restauraci navráceny data, které obsahují řetězce hodnot s těmito klíči:
ID – identifikační číslo restaurace
name – název restaurace
city – město, ve kterém se restaurace nachází
address – adresa restaurace
distance – vzdálenost mezi zařízením a restaurací
lat – zeměpisná šířka restaurace
lng – zeměpisná délka restaurace 32
Řetězce označené klíči name, city, address a distance jsou využity pro zobrazení restaurací v komponentě ListView. Řetězec s klíčem ID je pak použit jako parametr při spouštění aktiviti DetailActivity. Řetězce s klíči ID, lat, lng a name jsou pak použity jako parametry při spuštění aktivity MapActivity.
5.4 Map Activity Přes celou obrazovku této aktivity je roztažen prvek MapOverlay. Aby bylo vůbec možné tento prvek používat, musí být projekt vytvořen s SDK knihovnami společnosti Google Inc. V samotném xml návrhu pak této komponentě musíte přidělit klíč, který si necháte vygenerovat na stránkách společnosti Google. Klíč je generován z MD5 otisku vašeho počítače. Společnost Google podle tohoto klíče limituje přístup k mapám na 25 000 přístupů denně. Do tohoto počtu je služba společnosti Google zdarma. Pokud by toto číslo nebylo pro aplikaci dostačující, je možné již za poplatek počet povolených přístupů navýšit. V této aplikaci jsou povoleny pouze funkce pro zoom funkce pro rolování. Metodami třídy MapController je pak možné nastavit parametry zobrazení mapy. Metoda setZoom(int) například nastaví přiblížení mapy při prvním zobrazení a metoda setCenter(GeoPoint) nastavuje bod, podle kterého se mapa vycentruje. Nad komponentou MapOverlay lze vytvářet další vrstvy, které mohou obsahovat například markery.
Obrázek 13 - Map Activity
Aktivita MapActivity z předchozích aktivit přijímá několik parametrů. Konkrétně jde o zeměpisnou polohu restaurací, názvy restaurací a id jídla nebo restaurace. Tyto hodnoty jsou následně použity při vytvoření nové vrstvy nad mapou. Vrstvy jsou v této aplikaci použity k zobrazení takzvaných markerů. Na obrázku 13 je můžete vidět jako oranžové 33
ukazatele postavené na ploše mapy. Dá se jim ale samozřejmě nastavit jakýkoliv jiný vzhled. V aplikaci jsou využity dva styly markerů. Jeden typ pro zobrazení polohy zařízení a další typ pro zobrazení vyhledaných restaurací. Na každý z těchto markerů je možné kliknout a otevřít tak dialogové okno. V případě markeru zobrazujícího polohu zařízení je nastaven pouze titulek obsahující řetězec „moje poloha“. V případě markerů restaurací zobrazuje dialogový titulek název dané restaurace a v těle dialogového okna jsou umístěna dvě tlačítka. Prvním tlačítkem je možné spustit aktivitu DetailActivity, která zobrazí detail této restaurace, nebo detail jídla. Druhé tlačítko zavírá toto dialogové okno.
5.5 Detail Activity Tato aktivita je spuštěna výběrem konkrétní restaurace nebo konkrétního jídla v aktivitách ListRestauraceActivity, ListJidloActivity, nebo MapActivity. Z těchto aktivit je předána informace, zda se bude zobrazovat detail jídla nebo detail restaurace. Podle těchto informací je pak získáno identifikační číslo jídla nebo identifikační číslo restaurace. Dále jsou předány údaje o zeměpisné poloze zařízení.
Obrázek 14 - Detail Activity
Z těchto dat je pak možné vytvořit připojení k databázi a stáhnout hodnoty s těmito klíči. Pokud se má zobrazit detail jídla, jsou staženy všechny hodnoty pod tímto odstavcem. U detailu restaurace jsou staženy pouze hodnoty, jejichž klíče začínají řetězcem restaurant. 34
food_ID – identifikační číslo jídla
food_name – název jídla
food_description – popis jídla
food_quantity – hodnota a měrná jednotka
food_price – cena jídla
food_type – typ jídla
food_rated – hodnocení jídla
review_title – titulek recenze
review_content – obsah recenze
restaurant_ID – identifikační číslo restaurace
restaurant_name – název restaurace
restaurant_description – popis restaurace
restaurant_address – adresa restaurace
restaurant_img – url odkaz na obrázek restaurace
restaurant_distance – vzdálenost restaurace od aktuální pozice
restaurant_phone – telefonní číslo restaurace
restaurant_lat – GPS souřadnice latitude
restaurant_lng – GPS souřadnice longitude
5.5.1 Detail Restaurace Pokud má být zobrazen pouze detail restaurace, na obrazovku zařízení se vykreslí pouze vrchní část s logem a část pod nadpisem detail podniku (obrázek 14). Ostatní části jsou uživateli skryty. Aktivita také pomocí třídy ImageLoader stáhne obrázek z dodané url adresy. Kromě informací o restauraci a obrázku jsou uživateli k dispozici také tři tlačítka. Tlačítko Navigovat spustí aplikaci Navigovat. Tuto aplikaci obsahuje v základu každé zařízení s operačním systémem Android. Jedná se bezplatnou navigaci firmy Google. Před spuštěním jsou této aplikaci předány údaje o zeměpisné poloze hledané restaurace. Po ukončení navigace se uživatel vrátí zpět do aplikace Kam na jídlo. Dalším tlačítkem je tlačítko s názvem Jídelní lístek. Po kliknutí na něj, je spuštěna aktivita JidelniListek Activity (kapitola 5.7). Této aktivitě je předán parametr identifikačního čísla restaurace. 35
Posledním z trojice tlačítek je tlačítko s názvem Zavolat. Po stisku tohoto tlačítka je spuštěna aktivita, pomocí které je voláno telefonní číslo předané parametrem.
5.5.2 Detail Jídla Pokud je aktivita spuštěna s informací, že má být zobrazen detail jídla, je Detail restaurace rozšířen o informace o konkrétním jídle. Zde je uživateli nabídnut název jídla, hodnocení jídla, popis jídla a další informace o jídle. Navíc je zde zobrazeno pět posledních recenzí tohoto jídla. Po kliknutí na nadpis recenze se pod ním zobrazí obsah této recenze. Dále zde uživatel nalezne dvě tlačítka. První z tlačítek slouží pro doporučení jídla na sociálních sítích. Druhé z tlačítek spouští aktivitu OdeslatRecenzi Activity (kapitola 5.6) s parametry, obsahujícím identifikační číslo jídla, název restaurace a název jídla.
36
5.6 OdeslatRecenzi Activity Pomocí této aktivity uživatel může hodnotit konkrétní jídlo. Pro toto hodnocení má k dispozici takzvaný rating bar složený z pěti hvězd. Uživatel tak kliknutím do určitého místa rating baru určí, kolik hvězd jídlu přidělí. Dále jsou v grafickém prostředí umístěna tři formulářová okna. Zde uživatel vyplní své uživatelské jméno, nadpis recenze a text recenze. Všechny tyto položky jsou povinné a uživatel bez nich recenzi nemůže odeslat. Nepovinou položkou je vytvoření nebo nalezení fotografie jídla (kapitola 5.6.1).
Obrázek 15 - OdeslatRecenzi Activity
37
5.6.1 Získání fotografie jídla Pro vytvoření nebo nalezení fotografie jídla jsou uživateli poskytnuta dvě tlačítka v grafickém prostředí této aktivity. Prvním z tlačítek je tlačítko s názvem Vyfotit jídlo. Po stisku tohoto tlačítka je pak spuštěna nová aktivita, která spustí fotoaparát zařízení. Druhým z tlačítek je tlačítko nesoucí název Najít fotografii a po jeho stisku je spuštěna galerie obrázků v používaném zařízení. Návratovou hodnotou těchto aktivit je obrázkový soubor. Ten je následně převeden do bitmapy. Rozměry bitmapy jsou zmenšeny, aby bylo možné tento obrázek odeslat společně s recenzí. Vzhledem k tomu, že upload mobilních připojení nepatří k těm nejrychlejším, je důležité, aby velikost výsledného obrázku byla maximálně v řádu stovek kB.
5.6.2 Odeslání recenze Na odesílání samotné recenze nic složitého není. Na webovou stránku propojenou s databází se pouze odešlou data, která uživatel v této aktivitě vyplnil. Náročnější ale bylo nalézt řešení, jak pohodlně a bezpečně odeslat připojený obrázek. Nakonec jsem do této aplikace implementoval třídu Base64. Fotografie je pomocí metod této třídy převedena do řetězce. Tento řetězec je pak odeslán jako parametr spolu s ostatními parametry. Na stránkách PHP, kde je řetězec přijat, je opět pomocí metod třídy Base64 z tohoto řetězce sestaven obrázkový soubor.
5.7 JidelniListek Activity Po spuštění této aktivity je vytvořeno připojení k databázi odeslán parametr obsahující identifikační číslo restaurace. Z databáze poté aktivita stáhne množinu následujících klíčů a jim přidělených hodnot:
food_id – identifikační číslo jídla
food_name – název jídla
food_quantity – hodnota a měrná jednotka
food_price – cena jídla
38
Obrázek 16 - JidelniListek Activity
Tato data jsou následně vypsána do komponenty List View. Na každý z řádků v List View je možné kliknout, čímž se spustí aktivita DetailActivity, která se postará o zobrazení detailu tohoto jídla.
5.8 Design Aplikace Grafické zobrazení aplikace je načítáno z xml souborů. Při vytváření každé aktivity je metodou setContentView(int) podle identifikačního čísla vybrán xml soubor, z jehož obsahu se vytvoří uživatelské prostředí.
Obrázek 17 - Design Aplikace
SDK knihovny nabízejí mnoho grafických prvků, které je možné při tvorbě grafického prostředí použít. Jsou to například tlačítka, formulářové pole, textové pole, radio tlačítka, rating bary, progress bary a mnoho dalších. Každému grafickému prvku, který navrhované uživatelské prostředí obsahuje, je možné přidělit unikátní identifikátor. Pomocí identifikátoru poté můžeme v kódu aplikace k tomuto prvku přistupovat. //xml android:id="@+id/tlacitko"
39
//java Button tlacitko=(Button)findViewById(R.id.tlacitko);
Aby každá aplikace nevypadala úplně stejně, lze každému grafickému prvku přiřadit grafický styl. Například můžeme měnit jeho pozadí, rozměry umístění, nebo jeho chování. Následující část kódu ukazuje, jak lze tlačítku nastavit změnu pozadí po jeho stlačení: <selector xmlns:android="http://schemas.android.com/apk/res/android">
Změnou parametrů každého prvku potom můžeme dosáhnout toho, že výsledný vzhled aplikace odpovídá grafickým návrhům.
5.9 Připojení k databázi Přímé připojení na webovou MySQL databázi by bylo příliš složité, proto aplikace k této databázi přistupuje prostřednictvím PHP stránky. Aplikace se na tuto stránku připojí a následně odešle parametry uložené v proměnné nameValuePairs. Tato proměnná obsahuje list párů sestavených z klíče a hodnoty pro tento klíč. Název klíče musí odpovídat názvu parametru metody POST na stránkách PHP. Pokud tedy například zasíláme pár s názvem klíče ID, kterému náleží nějaká hodnota, PHP stránka potom pro úspěšné přijetí parametru musí obsahovat metodu $_POST[“ID”]. Příklad připojení ke stránce PHP: HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8")); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); InputSteream is = entity.getContent();
Po odeslání na http požadavku je vytvořen vstupní proud tak, aby bylo možno číst výstup na stránce.
40
Příklad kódu na stránce PHP:
Na PHP stránce je vytvořeno připojení k databázi MySQL. Následně je vytvořen dotaz na tuto databázi, ve kterém je použit parametr odeslaný aplikací. Výsledek dotazu je uložen do pole a dále převeden do jazyka JSON. Jazyk JSON je ideálním prostředkem pro předávání různých hodnot mezi různými programovacími jazyky i platformami. Tím vznikne řetězec, který obsahuje páry klíčů a hodnot. Ten je následně vytisknut na stránku. Příklad vytištěného řetězce: [{"ID":"1","name":"Hor\u00e1ck\u00e1 rychta","adresa":"Bene\u0161ova 55, Jihlava","hodnoceni":"3.5","latitude":"49.398588","longitude":"15.582626"}, {"id_restaurace":"2","nazev":"Radnicni","adresa":"Masarikovo n\u00e1m\u011bst\u00ed 3,Jihlava","hodnoceni":"4.5,"latitude":"49.396207", "longitude":"15.590876"}]
Začátek a konec tohoto řetězce ohraničují hranaté závorky. Každý vyhledaný řádek databáze potom ohraničují závorky kulaté. Uvnitř těchto závorek se nacházejí páry klíčů a hodnot oddělených čárkou. Samotný klíč a hodnotu potom odděluje dvojtečka. Po vytisknutí na stránku je tento řetězec pomocí vytvořeného vstupního proudu aplikací přečten a uložen do instance třídy JSONArray. Následně je toto pole řetězců rozparsováno. Příklad parsování pole JSONArray: JSONObject json_data = jArray.getJSONObject(position); returnString = json_data.getString(key);
Metoda getJSONObject() třídy JSONArray vyjme z pole podle parametru position objekt, v našem případě se jedná o jeden řádek databáze. Ten je následně uložen do instance třídy JSONObject. Jeho metoda getString() s parametrem key potom již navrací řetězec odpovídající požadovanému klíči key.
41
6 Závěr Cílem mé bakalářské práce bylo vytvořit aplikaci pro mobilní zařízení s operačním systémem Android. Tato aplikace měla umožňovat podle vyhledávání restaurací nebo jídel v okolí zařízení a následně o nich zobrazit uživateli zobrazovat detailní informace. Aplikace také měla umožnit uživateli hodnotit vyhledaná jídla.
Jelikož se zabývám vývojem aplikací pro Android teprve půl roku, většinu času jsem strávil samotným vývojem aplikace. Podařilo se mi splnit všechny požadované funkcionality a nastavit grafický design tak, aby odpovídal zadání. Aplikace v této chvíli pracuje pouze se zkušební databází a chybí jen krůček k jejímu připojení na databázi ostrou.
V teoretické části jsem se věnoval popisu platformy Android a nástrojů, které jsou při vývoji aplikace pro tuto platformu nepostradatelné. Velký díl teoretické části jsem také věnoval struktuře projektu a aktivitám.
Jelikož jsem na této bakalářské práci spolupracoval s firmou zabývající se informačními technologiemi, získal jsem mnoho cenných zkušeností. Novinkou pro mě byla například spolupráce s grafikem nebo webovým vývojářem.
Budoucí vývoj této aplikace bude směřován k opravám drobných nedostatků a připojení aplikace na ostrou databázi. Po těchto úpravách bude aplikace plně funkční a připravena na uvolnění široké veřejnosti.
42
7 Seznam použité literatury [1] Android version history. In: En.wikipedia.org [online]. 2008, 30. dubna 2012 [cit. 2012-05-12]. Dostupné z: http://en.wikipedia.org/wiki/Android_version_history [2] Android Architecture. elinux.org [online]. 2011, 13. června 2011 [cit. 2012-05-17]. Dostupné z: http://elinux.org/Android_Architecture [3] Activity. developer.android.com [online]. 2008, 24. dubna 2012 [cit. 2012-05-18]. Dostupné z: http://developer.android.com/reference/android/app/Activity.html [4] Android 2. Brno: Computer Press, a.s., 2011. ISBN 978-80-251-3194-7.
43
8 Seznam obrázků Obrázek 1- Historie verzí Androidu................................................................................ 10 Obrázek 2 - Architektura Android[2].............................................................................. 12 Obrázek 3 - DDMS -Emulator Control........................................................................... 13 Obrázek 4 - Emulator...................................................................................................... 15 Obrázek 5 - Příklad 9patch obrázku ............................................................................... 15 Obrázek 6 - Eclipse......................................................................................................... 16 Obrázek 7- Struktura projektu ........................................................................................ 17 Obrázek 8 - Příklad rozdílného rozlišení ........................................................................ 19 Obrázek 9 - Životní cyklus aktivit[3] ............................................................................. 22 Obrázek 10 - Struktura aplikace ..................................................................................... 26 Obrázek 11 - Uvod Activity............................................................................................ 27 Obrázek 12 - ListJidlo Activity....................................................................................... 31 Obrázek 13 - Map Activity ............................................................................................. 33 Obrázek 14 - Detail Activity........................................................................................... 34 Obrázek 15 - OdeslatRecenzi Activity............................................................................ 37 Obrázek 16 - JidelniListek Activity ................................................................................ 39 Obrázek 17 - Design Aplikace ........................................................................................ 39
44
9 Seznam zkratek
PHP - Hypertext Preprocessor – skriptovací jazyk pro tvorbu webových aplikací
SDK - software development kit - Nástroje pro vývoj aplikací pro platformu Android
JSON - JavaScript Object Notation - odlehčený formát pro výměnu dat
WiFi - Wireless Ethernet Compatibility Aliance – typ bezdrátové sítě
HTML - HyperText Markup Language - značkovací jazyk pro hypertext
ADT - Android Development Tools – plugin vývojového prostředí Eclipse
GPS - Global Positioning System - globální družicový polohový systém
45