bakalářská práce - Unicorn Universe
Transkript
bakalářská práce - Unicorn Universe
BAKALÁŘSKÁ PRÁCE Vývoj aplikací na platformě Android Application development for the Android platform Vojtěch Sázel Un ico rn Co lle g e © 2 01 0 Un ico rn Co lle g e, V Ka pslo vně 2 76 7/ 2 , P ra ha 3, 13 0 0 0 Ná ze v p rá ce v ČJ: Ná ze v p rá ce v A J: V ývo j ap lika cí n a p lat f o rmě A nd ro id A pp lica t ion d eve lop me n t f o r t he An d ro id p lat f o rm A ut o r: V o jtě ch S á ze l A kad e mický ro k: 2 00 9/ 2 01 0 K on ta kt : E -ma il: vo jte ch @ sa ze l. cz Te l. : (+4 2 0 ) 72 3 6 35 73 8 UCL Bachelor's Thesis Coordinator UCL Zadání závěrečné bakalářské práce Bachelor Thesis – Sázel Vojtěch 2009.10.14 - 17:56 - Sázel Vojtěch - Zadání BP - Vývoj aplikací na platformě Google Android (ZBP/20091014_003) Artefakt Zadavatel DIT Zadání závěrečné bakalářské práce Student (Sázel Vojtěch) ZADÁNÍ ZÁVĚREČNÉ BAKALÁŘSKÉ PRÁCE (ZBP) Název ZBP v češtině Název ZBP v angličtině Studijní obor Akademický rok Vedoucí závěrečné práce Vývoj aplikací na platformě Google Android Application development for the Google Android platform ICT Project Management 2009/2010 Petr Maneth Termín odevzdání Zadání ZBP 16.10.2009 Termín odevzdání práce ZBP 07.05.2010 Cíl závěrečné bakalářské práce CZ: Cílem práce je popsat mobilní platformu Android, její architekturu a API (Aplikační programové rozhraní) Posoudit výhody a nevýhody virtuálního stroje Dalvik pro jeho využití na mobilních zařízeních. Součástí práce je vzorová aplikace včetně zdrojových kódů. EN: The goal is to describe Android mobile platform, its architecture and API (Application programming interface). Consider advantages and disadvantages of virtual machine Dalvik and its usage on mobile devices. This work contains also example application with source codes. Klíčová slova: Google, Android, Java, Dalvik, Linux Základní literatura Ableson, F.,Collins, C., Robi, S.: Unlocking Android: A Developer's Guide, , Manning Publications, 2009 Rogers R., Lombardo, J., Mednieks, Z., Blake, M.: Android Application Development: Programming with the Google SDK, 1st edition, O'Reilly Media, 2009 Burnette, E.: Hello, Android: Introducing Google's Mobile Development Platform, 2nd edition, Pragmatic Bookshelf, 2009 © 2010 Unicorn College s.r.o. Prohlá²ení Prohla²uji, ºe svou bakalá°skou práci na téma Vývoj aplikací na platform¥ Android jsem vypracoval samostatn¥ pod vedením vedoucího bakalá°ské práce a s pouºitím odborné literatury a dal²ích informa£ních zdroj·, které jsou v práci citovány a jsou téº uvedeny v seznamu literatury a pouºitých zdroj·. Jako autor uvedené bakalá°ské práce dále prohla²uji, ºe v souvislosti s vytvo°ením této bakalá°ské práce jsem neporu²il autorská práva t°etích osob, zejména jsem nezasáhl nedovoleným zp·sobem do cizích autorských práv osobnostních a jsem si pln¥ v¥dom následk· poru²ení ustanovení 11 a následujících autorského zákona £. 121/2000 Sb. V Praze dne ...................................................... Jméno iv P°íjmení Abstrakt Cílem práce je popsat mobilní platformu Android, její architekturu a API (Aplika£ní programové rozhraní). Posoudit výhody a nevýhody virtuálního stroje Dalvik pro jeho vyuºití na mobilních za°ízeních. Významnou £ástí je popis vývojového prost°edí, základních princip· vývoje aplikací pro Android a tvorby grackého uºivatelského rozhraní. V poslední £ásti práce jsou popsány r·zné moºnosti aplika£ního frameworku. Díky virtuálnímu stroji Dalvik je zaru£ena nezávislost aplikací na platform¥. Se systémem intent· m·ºe vývojá° snadno nahradit dodávané aplikace svými vlastními alternativami. Spolu se zdrojovými kódy vypracovaných p°íklad· p°iná²í £tená°i práce základní znalosti nutné k tomu, aby za£al s vývojem na této mobilní platform¥. Klí£ová slova Google, Android, Java, Dalvik, aktivita, intent, poskytovatel obsahu, Linux Abstract The goal is to describe Android mobile platform, its architecture and API (Application programming interface). Consider advantages and disadvantages of virtual machine Dalvik and its usage on mobile devices. The important part is description of development environment, key principles of application develoment for Androd and design of graphical user interface. Many interetsting capabilities of the application framework are described in the last part of the work. Due to the use of Dalvik virtual machine hardware independence is assured. Developer can also easily replace any supplied application with his own with use of intent system. The work brings the basic know-how of software developent on this mobile platform. Keywords Google, Android, Java, Dalvik, activity, intent, content provider, Linux v Pod¥kování D¥kuji vedoucímu bakalá°ské práce Petrovi Manethovi za ú£innou metodickou, pedagogickou a odbornou pomoc a dal²í cenné rady p°i zpracování mé bakalá°ské práce. Týmu integrace a validace terminál· z útvaru Správy T-Mobile Czech Republic a.s. za zap·j£ení mobilního telefonu Také d¥kuji koleg·m z sluºeb spole£nosti HTC Desire s opera£ním systémem Android pro ú£ely této práce. vi Obsah Úvod 1 1 Platforma Android 2 1.1 Architektura platformy . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Virtuální stroj Dalvik a p°eklada£ bytecode 4 . . . . . . . . . . . . . . 2 Základ pro tvorbu aplikací 7 2.1 Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Vývojové prost°edí Eclipse 8 2.3 . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Tvorba nového projektu . . . . . . . . . . . . . . . . . . . . 8 2.2.2 Lad¥ní aplikace . . . . . . . . . . . . . . . . . . . . . . . . . 9 Základní prvky prost°edí . . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.1 Aplikace, aktivita, sluºba a p°ijíma£ (Application, Activity, Service and BroadcastReceiver) . . . . . . . . . . . . . . . . . . 12 2.3.2 Intenty a intentové ltry (Intent) 14 2.3.3 Poskytovatel obsahu (Content Provider) . . . . . . . . . . . 18 2.3.4 Manifest a bezpe£nostní omezení aplikací . . . . . . . . . . . 21 2.4 Nasazení aplikace a Android Market . . . . . . . . . . . . . . . . . . 22 2.5 Specika vývoje mobilních aplikací . . . . . . . . . . . . . . . . . . . 23 . . . . . . . . . . . . . . . 3 Návrh grackého uºivatelského rozhraní (GUI) 25 3.1 Zdroje (Resources) a jejich pouºití v kódu . . . . . . . . . . . . . . . 25 3.2 Rozvrºení (Layout) . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3 Prvky GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3.1 Text (TextView) a textové pole (EditText) . . . . . . . . . . 30 3.3.2 Tla£ítko (Button) a listenery . . . . . . . . . . . . . . . . . 31 3.3.3 Adaptérové prvky a adaptéry . . . . . . . . . . . . . . . . . 32 3.3.4 Toust (Toast) . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.3.5 Notikace . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 vii 3.3.6 Tvorba nabídek . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3.7 Dialogy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.3.8 Dal²í prvky . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4 Moºnosti aplika£ního frameworku 38 4.1 Funkce telefonního p°ístroje . . . . . . . . . . . . . . . . . . . . . . 38 4.2 Sí´ové sluºby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.3 Multimediální funkce . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.4 Loka£ní sluºby, senzory a roz²í°ená realita . . . . . . . . . . . . . . . 38 4.5 SQLite 40 4.6 OpenGL ES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 4.7 Android Native Development Kit (Android NDK) . . . . . . . . . . . 40 4.8 WebKit, HTML5 a tvorba mobilních webových aplikací . . . . . . . . 41 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Záv¥r 42 Conclusion 43 Seznam literatury a zdroj· 44 Slovník pojm· a zkratek 47 Slovník pojm· a zkratek 47 Seznam obrázk· 52 Seznam tabulek 53 A P°íloha - CD 54 B P°íloha - P°íklad souboru manifestu 54 viii 1 Úvod Opera£ní systém Android je mladou platformou ur£enou zejména pro provoz na mobilních za°ízeních. Android není jen opera£ním systémem, ale celou platformou pro vývoj mobilních aplikací. Uºivateli nabízí velkou míru svobody ve tvorb¥ aplikací a p°ístupu k funkcím za°ízení p°es standardizované aplika£ní programové rozhraní (API). Tato práce je zam¥°ena na vývoj aplikací na této platform¥ a popis architektury systému. Proberu zde odli²nosti návrhu aplikací pro mobilní za°ízení od vývoje na klasickém osobním po£íta£i. Sou£ástí práce jsou i krátké p°íklady pro ilustraci r·zných vlastností systému. ást práce je zam¥°ena také na unikátní virtuální stroj Dalvik, který zaji²´uje b¥h aplikací na platform¥ Android. Práce je svým rozsahem a zam¥°ením ur£ena hlavn¥ k orientaci v platform¥ Android a v jednotlivých oblastech nezachází do velkých detail·. Od £tená°e se o£ekává základní orientace v problematice vývoje software, ov²em p°ípadné neznámé pojmy jsou vysv¥tleny ve slovníku pojm· a zkratek, který je sou£ástí práce. 1 PLATFORMA ANDROID 2 1 Platforma Android Systém Android vznikl ve spole£nosti Android, Inc., která byla v roce 2005 p°evzata spole£ností Google, Inc. Google se nadále podílel na vývoji a v roce 2007 byla zaloºena Open Handset Alliance (OHA), sdruºující Google, r·zné mobilní operátory, výrobce hardwaru a dal²í rmy, které nadále tento systém v sou£asnosti vyvíjí. Android jako takový je pod open-source licencemi, coº umoº¬uje jednotlivým spole£nostem i jednotlivc·m snadné úpravy v systému, bez nutnosti dokupování dal²ích licencí £i patent·. Jinak je také Android ozna£ován jako Android Open Source Project (AOSP) [1]. První komer£n¥ dostupný telefon pro tuto platformu byl v roce 2008 spole£ností T-Mobile uveden telefon T-Mobile G1 1 [2], vlastní telefon byl vyrobený spole£ností HTC. Tento a dal²í podobné telefony uvedené v roce 2009 jsou ozna£ovány za první generaci za°ízení Android. Na t¥chto za°ízeních je moºné se setkat zejména s Androidem ve verzích 1.x. Po£et za°ízení na této platform¥ se za£al rychle roz²i°ovat a v roce 2010 nastoupila druhá generace za°ízení s verzemi Android 2.x a výkonnými ARMovými procesory Qualcomm architektury Snapdragon taktovanými minimáln¥ na 1GHz. Android lze nalézt nejen v mobilních telefonech, ale také v tabletech, netboocích, £te£kách elektronických knih a dal²ích za°ízeních [3]. 1.1 Architektura platformy Základem Androidu je jádro Linuxu, které je dnes nej£ast¥ji pouºívaným open-source jádrem opera£ního systému. Obsahuje ovlada£e nutné ke komunikaci s hardwarem za°ízení. Jádro je navíc upraveno a obohaceno o specické v¥ci jako je mezi-procesová komunikace speciální sdílená pam¥´ ashmem, low-memory killer, binder, specický power management a dal²í [4]. Tyto prvky jsou pro Android specické a pot°ebné pro provoz na za°ízeních s omezenou opera£ní pam¥tí a mén¥ výkonnými procesory (CPU). Na obrázku 1 je vyzna£ena tato £ást jako Linux Kernel. Druhou vrstvou jsou systémové knihovny. Mezi n¥ pat°í klasické dynamicky 2 linkované knihovny 1 téº 3 p°eloºené v nativním kódu daného CPU, které implementují znám jako HTC Dream se o známé soubory koncovkou .so 3 nativní = vlastní pro danou platformu, specický pro daný systém a procesor 2 jedná 1 PLATFORMA ANDROID 3 Obrázek 1: High-level pohled na architekturu Androidu [1] aplika£ní rozhraní nad voláními linuxového jádra. Zejména sem pat°í standardní knihovny jazyka C (libc), gracké knihovny (SGL, OpenGL ES, Surface Manager), knihovny pro práci s multimédii (kodeky a Media Framework), knihovny pro práci s databází (SQLite), knihovna pro vykreslování TrueType font· (FreeType), jádro webového prohlíºe£e (WebKit) a knihovna pro ²ifrovanou sí´ovou komunikaci (SSL). Tato £ást je na obrázku 1 ozna£ena jako Libraries. Dal²í £ástí je vlastní b¥hové prost°edí Androidu a tím je virtuální stroj Dalvik. Virtualizace zaji²´uje nezávislost b¥ºících aplikací na hardwaru. Na obrázku 1 je ozna£eno jako Android Runtime a podrobn¥ji ho proberu v kapitole 1.2. Nad Dalvikem a systémovými knihovnami je aplika£ní framework Androidu Application Framework ). ( Obsahuje pot°ebné t°ídy a rozhraní pro stavbu aplikací na vy²²í úrovni, která je platformn¥ nezávislá. N¥které £ásti aplika£ního frameworku jsou p°ímo jen obalením volání systémových knihoven pomocí nativních volání 4 . Vlastní aplika£ní framework je napsaný v programovacím jazyce Java, p°eloºený do kódu virtuálního stroje Dalvik a je uloºený p°ímo na daném za°ízení. Jednotlivé aplikace se pak jiº p°ímo pí²í v aplika£ním frameworku. Jsou v n¥m napsány i v²echny aplikace, které jsou standardn¥ se systémem dodávány. Na obrázku 1 se jedná o £ást Applications. Je d·leºité si uv¥domit, ºe Android nelze povaºovat za klasickou linuxovou dis4 JNI - Java Native Interface 1 PLATFORMA ANDROID 4 tribuci, b¥ºným zp·sobem na n¥m nelze spou²t¥t linuxové programy a p°istupovat p°ímo k nízkoúrov¬ovým funkcím systému. Gracký systém není kompatibilní s linux- user-space ) ovým X serverem. P°ístup do systému je omezen na uºivatelský p°ístup ( a to p°es aplika£ní framework, p°ípadn¥ JNI volání, která ov²em podléhají omezení v uºivatelském p°ístupu. Na v¥t²in¥ za°ízení je v²ak moºno získat superuºivatelské oprávn¥ní (tzv. root ) a díky n¥mu je moºné pln¥ vyuºít moºností, které poskytuje linuxový systém. Tato moºnost v²ak není v¥t²inou podporována výrobci hardware. 1.2 Virtuální stroj Dalvik a p°eklada£ bytecode Jedním ze základních princip· Androidu je nezávislost aplikací na hardware, zejména pak na instruk£ní sad¥ pouºitého procesoru. Díky tomu je moºné nap°íklad provozovat stejné aplikace pro Android na procesoru ARM, tak na architektu°e x86. Samoz°ejm¥ to platí pokud v aplikaci není pouºito nativních knihoven, které by se musely p°ekládat pro kaºdou architekturu zvlá²´. Toho je docíleno pomocí virtuálního stroje Dalvik, na 5 kterém b¥ºí v²echny aplikace . 6 Virtuální stroj je v podstat¥ softwarovou simulací procesoru s vlastní instruk£ní sadou. Tak jak jsou programy p°ekládány p°eklada£em ze zdrojového kódu ve vy²²ím machine programovacím jazyce do instrukcí strojového kódu fyzického procesoru ( code , nap°. ARM nebo x86), jsou p°ekládány programy do instrukcí kódu virtuál- ního stroje, tyto instrukce jsou ozna£ovány jako bytecode. Bytecode je pak p°i b¥hu programu interpretován virtuálním strojem. Pouºitím virtuálního stroje se Android zna£n¥ odli²uje od n¥kterých jiných mobilních opera£ních systém· jako Symbian nebo iPhone OS, které vyuºívají p°ímé kompilace aplikací do strojového kódu daného procesoru [5] [6]. Naopak se více podobá zab¥hlému Java ME , pouºívanému na velké £ásti jednoduchých mobilních telefon·, který také pouºívá virtuálního stroje. Oproti n¥mu je v²ak komplexn¥j²í a poskytuje daleko více moºností. V p°ípad¥ Androidu se pro vývoj aplikací pouºívá programovacího jazyka Java. 7 Aplika£ní framework není kompatibilní s Java ME , ale pokrývá £ást Java SE pouºívanou na b¥ºných po£íta£ích. Zdrojový kód se p°ekládá standardním p°eklada£em dodávaným s Java SE SDK, vzniklý bytecode je pro virtuální stroj Java VM, není v²ak kompatibilní s Dalvikem [9]. Dalvik vyuºívá vlastní sadu instrukcí a kód je uloºen 5 výjimkou jsou pouze systémové a podp·rné procesy Linuxu, které b¥ºí mimo Dalvik ani neexistuje jeho skute£ná fyzická (hardwarová) implementace 7 portování (p°enos) Java ME aplikací nebo jejich spou²t¥ní v Androidu lze dosáhnout mnoha zp·soby, nap°. p°es Micro Emulator nebo Android J2ME Runner [7][8] 6 £asto 1 PLATFORMA ANDROID 5 ve specickém DEX formátu, do kterého je konvertován nástrojem dx, který je sou£ástí Android SDK (více v kapitole 2.1) [10]. Instruk£ní sada Dalviku je registrov¥ orientovaná, data jsou mapována do v¥t²ího mnoºství registr· a instrukce pak p°i svém vykonávání pracuje s obsahem t¥chto registr· [10]. Tím se li²í od zásobníkov¥ orientovaného principu pouºitého v Java VM [11], kde se data postupn¥ ukládají na zásobník, instrukce pak nemají ºádné operandy (parametry instrukcí). Registrov¥ orientovaný p°ístup je úsporn¥j²í na po£et 8 instrukcí , instrukce jsou v²ak del²í protoºe obsahují také specikace registr·. Pro dokreslení tohoto rozdílu jsem napsal krátkou t°ídu s jedinou metodou, která se£te £ísla od 1 do £ísla zadaného parametrem. public static int sectiDo(int i) { int k=0; //line 10 for(int j=1;j<=i;j++) { //line 11 k+=j; //line 12 } return k; //line 14 } Za pomocí nástroje ClassleAnalyzer [12] pro Java VM a nástroje dedexer [13] pro Dalvik je moºné bytecode p°evést do pro £lov¥ka £itelné podoby a dále ho analy- 9 zovat . Na obrázku 2 je vid¥t rozdíl v po£tu instrukcí a také zásobníkový a registrový model obou virtuálních stroj·. DEX formát zahrnuje také mnohé optimalizace. Ve²keré t°ídy jsou slou£eny do 10 jediného DEX souboru . P°i nahrání do virtuálního stroje je bytecode optimalizovaný, uloºený do cache a sdílený mezi v²emi procesy ve virtuálním stroji. Programy v DEX formátu jsou velice kompaktní a úsporné na pam¥´, aplikace v telefonu pak zabírají z°ídkakdy více neº jednotky megabajt·. Dal²ím zajímavým aspektem je just-in-time (JIT) kompilace instrukcí virtuál- ního stroje do nativních instrukcí fyzického procesoru daného za°ízení, tato kompilace probíhá postupn¥ p°ímo za b¥hu programu, p°iná²í pak zna£né zrychlení provád¥ní programu. JIT je zabudovaný aº v Dalviku ve verzi Android 2.0, jen v²ak v experimentální podob¥ pro CPU ARMv7. První testy vypadají slibn¥ a p°iná²í aº trojnásobný nár·st výkonu [14]. 8 dle [9] aº o 30% nástroje jsou ozna£ovány £asto jako disassemblery 10 na rozdíl od Java VM, kde jsou samostatn¥ pro kaºdou t°ídu 9 tyto 1 PLATFORMA ANDROID Obrázek 2: P°íklad instrukcí Java VM vs. Dalvik VM 6 2 ZÁKLAD PRO TVORBU APLIKACÍ 7 2 Základ pro tvorbu aplikací Pro Android je dodávaný soubor vývojových nástroj· vývojové prost°edí Eclipse Android SDK [15] a roz²í°ení pro [16]. Tyto nástroje zna£n¥ zjednodu²ují a urychlují vývoj aplikací. 2.1 Android SDK Sou£ástí SDK je emulátor pro v²echny aktuáln¥ dostupné verze aplika£ního frameworku, knihovny a dokumentace aplika£ního frameworku a nástroje pro kompilaci. Obrázek 3: Emulátor Androidu Emulátor telefonu je kompletní prost°edí Androidu, je zaloºené na virtualiza£ní technologii QEMU [17] [15]. Pomocí emulátoru je moºné simulovat r·zné kongurace prost°edí. Mezi n¥ pat°í r·zná rozli²ení obrazovky, r·zné velikosti opera£ní pam¥ti i hardwarová za°ízení jako je GPS. Emulátor je schopný vyvolávat i n¥které akce, které by vznikaly za b¥hu v normálním provozu, nap°íklad p°íchod SMS nebo p°íchozí volání. Díky emulátoru je moºné vyvíjet a ladit aplikace zcela bez nutnosti vlastnit fyzické za°ízení s Androidem (viz. obrázek 3). Pokud je k dispozici i fyzické za°ízení, lze aplikace ladit pomocí propojení s telefonem p°es USB kabel (více v kapitole 2.2.2). 2 ZÁKLAD PRO TVORBU APLIKACÍ 8 2.2 Vývojové prost°edí Eclipse Android SDK. V moºnostech projekt· nám p°ibude Android Project a Android Test Project. V této práci se budu zabývat pouze Android Project, druhý typ projektu slouºí k sestavování unit test· 11 pomocí testovacího frameworku zaloºeného na JUnit [15] [18]. Po instalaci roz²í°ení do Eclipse je nutné nejprve nastavit cestu k Obrázek 4: Vývojové prost°edí Eclipse Vlastní prost°edí Eclipse je rozd¥leno do r·zných tzv. perspektiv (viz. obrázek 4), jsou zvlá²´ pro r·zné programovací jazyky, zvlá²´ pro vývoj a lad¥ní. Pro vlastní vývoj se pouºívá standardní Java Perspective a pro lad¥ní Debug Perspective (kapitola 2.2.2). Pokro£ilej²í lad¥ní na za°ízení nebo na emulátoru umoº¬uje speciální perspektiva DDMS (Dalvik Debug Monitor Server). 2.2.1 Tvorba nového projektu Nový projekt se vytvá°í jako Android Project. To je velmi d·leºité a zajistí to správné nastavení projektu a p°ed-generování adresá°ové struktury (viz. tabulka 1). Kaºdý 11 testy jednotlivých t°íd (jednotek) p°ímo na úrovni programovacího jazyka 2 ZÁKLAD PRO TVORBU APLIKACÍ 9 nový projekt za£íná zadáním názvu projektu, verzí pouºitého aplika£ního frameworku, 12 názvem aplikace a balí£ku . Po vytvo°ení projektu je zaloºena základní adresá°ová struktura projektu [9]. Soubor / Adresá° AndroidManifest.xml Popis Povinný Popisný soubor celé aplikace. Ano Denuje aktivity, sluºby, poskytovatele a intenty. Obsahuje také nastavení práv aplikace k p°ístupu k zabezpe£eným £ástem frameworku. (kapitola 2.3.4) src assets Zdrojové kódy aplikace. Ano Dal²í p°ídavné soubory, které Ne mohou obsahovat data p°ibalená k aplikaci. res Soubory zdroj· (kapitola bin P°eloºené binární soubory Ano 3.1) - (není vid¥t v projektu) gen Automaticky generované - zdrojové kódy Tabulka 1: Adresá°ová struktura Android projektu 2.2.2 Lad¥ní aplikace Hotová aplikace se ladí za pomocí perspektivy Eclipse automaticky po spu²t¥ní Debug Debug. Do perspektivy se p°epne reºimu. Ladící reºim lze vytvo°it kliknutím na ²ipku u ikony a výb¥rem Debug Congurations..., kongurace se vytvá°í jako Android Application (viz. obrázek 5). V záloºce Target lze nastavit za°ízení, na kterém se bude aplikace ladit. Výb¥r se provádí p°es aplikaci AVD Manager, která je sou£ástí Android SDK. V AVD je moºné vybrat vlastní fyzické za°ízení p°ipojené p°es USB nebo vytvo°it £i pouºít za°ízení emulované. Emulovaná za°ízení lze kongurovat na r·zné hardwarové parametry, mezi které pat°í zejména rozli²ení p°ístroje a p°ipojený obraz simulující pam¥´ovou kartu. P°i lad¥ní se aplikace automaticky nainstaluje na za°ízení a spojí se s ladícím programem. Stejn¥ jako p°i lad¥ní b¥ºné Javové aplikace je moºné krokovat program, 13 nastavit body p°eru²ení a sledovat prom¥nné 12 Java package, nap°. cz.sazel.android anglické termíny pro tyto pojmy jsou step, 13 b¥ºné . breakpoints a watches 2 ZÁKLAD PRO TVORBU APLIKACÍ 10 Obrázek 5: Debug kongurace Lad¥ní na fyzickém za°ízení vyºaduje instalaci USB ovlada£e za°ízení, které je sou£ástí Android SDK [15]. K tomu je nutné zapnout podporu lad¥ní v telefonu, kde v £eské verzi systému to je Nastavení > Aplikace > Vývoj > Lad¥ní USB. Dal²ím nutným krokem, ale pouze pro lad¥ní na fyzickém za°ízení, je povolení lad¥ní v mani- 2.3.4) parametrem Application > Debuggable application atribut android:debuggable=true). festu (podrobn¥ji v kapitole tagu V p°ípad¥ lad¥ní na emulátoru sta£í vybrat v AVD Manageru na true (v p°íslu²né za°ízení emulátoru. Ve speciální perspektiv¥ DDMS lze monitorovat za°ízení z hlediska b¥ºících proces·, vláken a monitorování alokace pam¥ti. V okn¥ LogCat se vypisují v²echny d·leºité události, které v systému probíhají. U emulátoru lze p°es tuto perspektivu simulovat p°íchod SMS nebo volání, p°ípadn¥ nastavovat simulovanou pozici GPS. V neposlední °ad¥ lze k r·zným ladícím ú£el·m vyuºít nástroje adb, který je . sou£ástí Android SDK [15] Dovoluje p°ístup k souborovému systému za°ízení a obsahuje jednoduchý p°íkazový °ádek, který podporuje základní p°íkazy unixového p°íkazového °ádku. Vhodný je nap°íklad pro sledování systémových log· za°ízení. Do emulátoru m·ºeme pomocí p°íkazu adb pull adb push kopírovat ze za°ízení. kopírovat soubory nebo je naopak pomocí 2 ZÁKLAD PRO TVORBU APLIKACÍ 11 2.3 Základní prvky prost°edí Systém Android byl navrºen tak, aby umoºnil uºivateli v maximální mí°e upravovat prost°edí systému. Uºivatel m·ºe nahrazovat dodávané aplikace vlastními, které mu 14 vyhovují a tyto aplikace jsou dokonale propojeny se stávajícím systémem Vlastní aplikace jsou totiº rozd¥leny do odd¥lených £ástí tzv. kaºdé aktivit¥ je p°i°azen zpravidla jediný pohled, . aktivit. Ke který je v podstat¥ samostatnou obrazovkou grackého uºivatelského rozhraní. Mezi aktivitami se postupn¥ p°echází p°edáním informací jiné aktivit¥ ve form¥ zprávy - tzv. intentu. N¥které aktivity jsou vyvolány na základ¥ typu intentu, voláním z jiné aplikace nebo p°ímo vznikem n¥jaké události v systému. Intent v podstat¥ °íká, co chceme ud¥lat a systém se nám sám p°izp·sobí volbou správné akce a spu²t¥ním správné aktivity. Není v²ak aplikací pokud není dat, které by zpracovávaly. Data nejsou v systému organizována svým umíst¥ním v adresá°ové struktu°e souborového systému 15 , ale svým ú£elem. Mohou být r·zných typ· - obrázky, video, text, webová stránka. Soubory na souborovém systému mají zpravidla sv·j ú£el i formát ur£en £ástí svého názvu (p°íponou souboru). Jelikoº data nemusí být uloºena jen v souborech, ale mohou to být t°eba i zdroje z internetu, byly práv¥ z protokol· pouºívaných na internetu MIME nebo také Conent typy . Jsou specise typ/podtyp. Typ ur£uje ú£el daných dat, do v¥t²iny dne²ních systém· p°evzaty kovány typem a podtypem, zapisují podtyp pak jejich konkrétní formát. Pro ilustraci máme nap°íklad MIME typy obrázk· image/gif, image/jpeg, zvuk· audio/ogg, audio/vnd.wave, textu text /html, text/javascript. Kaºdá aplikace m·ºe specikovat, které MIME typy dokáºe obsluhovat. Stejn¥ tak je tomu u Androidu. K dat·m a jiným prost°edk·m (zejména k poskytovatel·m obsahu) v systému je moºné p°istupovat pomocí URI (Uniform Resource Identier). URI m·ºe být ve tvaru URL nebo URN, p°ípadn¥ kombinací obou. URL (Uniform Resource Locator) je cesta ur£ující umíst¥ní prost°edku a URN (Uniform Resource Name) je jméno, které jednozna£n¥ identikuje prost°edek. S URL se nej£ast¥ji setkáme na webu a to ve form¥ webové adresy, nap°. http://www.unicorncollege.cz. V Androidu m·ºe být URL poskytovatele prost°edku (viz. kapitola 2.3.3), nap°. specikace umíst¥ní obrázku na pam¥´ové kart¥ content://media/external/images/media/3. na Androidu t°eba pro telefonní £íslo 14 záleºí tel:603404367. URN m·ºe být ást URI p°ed dvojte£kou samoz°ejm¥ na vývojá°i konkrétní aplikace, jak dokáºe t¥chto moºností vyuºít data jsou uloºena ve form¥ soubor· v souborovém systému, ale z hlediska uºivatele je tato struktura skrytá 15 pochopiteln¥ 2 ZÁKLAD PRO TVORBU APLIKACÍ 12 se nazývá URI schéma a specikuje zp·sob p°ístupu k danému prost°edku nebo typ prost°edku. 2.3.1 Aplikace, aktivita, sluºba a p°ijíma£ (Application, Activity, Service and BroadcastReceiver) Aplikace je soubor komponent - aktivit, sluºeb a p°ijíma£· a m·ºe být realizována jako vlastní t°ída zd¥d¥ná podle android.app.Application. Jednotlivé komponenty aplikace jsou pak denovány v manifestu (kapitola 2.3.4). Aktivity jsou samostatné £ásti aplikace °e²ící vlastní funk£ní logiku aplikace. Aktivity jsou d¥d¥né z t°ídy android.app.Activity. Procesy b¥ºící ve virtuál- ním stroji pak mají p°i°azené jednotlivé aktivity aplikace. Kaºdá aktivita v systému se ukládá na zásobník aktivit (Acitivity Stack). Aktuální aktivita na pop°edí je na vr- cholu tohoto zásobníku, naopak stisknutí klávesy Zp¥t na telefonu odebere sou£asnou aktivitu z vrcholu zásobníku. Systém si zcela sám °ídí b¥h proces·, ty jsou v rámci úspory pam¥ti v p°ípad¥ nejvy²²í nouze násiln¥ ukon£eny (zabity, pomocí killer low-memory - viz. kapitola 1.1). Prioritizace zabíjení proces· je taková, ºe nejprve jsou zabity procesy, které mají aktivity na pozadí (nejsou na vrcholu zásobníku), aº poté jdou na °adu dal²í procesy (pokud je dostatek pam¥ti, tak k tomu dochází jen minimáln¥). V Androidu není garantován b¥h ºádného procesu. Kaºdá aktivita má sv·j ºivotní cyklus (viz. obrázek 6), který prochází jednotlivými stavy a volá podle toho p°íslu²né události [19]: onCreate(Bundle) - Volá se jednou, kdyº je aktivita poprvé spu²t¥na. Je vhodné zde inicializovat aktivitu, nastavit pohled a zaregistrovat obsluhy událostí onStart() - Volá se vºdy p°ed zobrazením aktivity uºivateli. onResume() - Volá se tehdy, kdy je aktivita p°ipravena reagovat na vstupy od uºivatele. onPause() - Volá se kdyº je aktivita p°esunuta do pozadí. Je to vhodné a také poslední místo k uloºení r·zných perzistentních dat. Po této události je jiº proces, jehoº je aktivita sou£ástí moºné zabít a v p°ípad¥, ºe nebudou tato data uloºena, tak budou ztracena. Pro uloºení dat do speciálního objektu je moºno pouºít událost obnovení onSaveInstanceState(Bundle), onRestoreInstance(Bundle) Bundle podobn¥ pak k 2 ZÁKLAD PRO TVORBU APLIKACÍ Obrázek 6: ivotní cyklus aktivity [1] 13 2 ZÁKLAD PRO TVORBU APLIKACÍ onStop() 14 - Volá se v p°ípad¥, ºe aplikace není uº vid¥t v p°epína£i úloh. onRestart() onDestroy() - Volá se tehdy, kdyº se aktivita uºivateli má znovu zobrazit. - Volá se v p°ípad¥, ºe je aktivita zru²ena Aktivity v²ak nejsou ur£eny k dlouhodobým operacím a výpo£t·m, protoºe jakékoli volání blokuje uºivatelské rozhraní. Pokud chceme vytvo°it aplikaci, která na pozadí vykonává n¥jakou £innost (nap°. pravidelné stahování po²ty) musíme sáhnout po pouºití vláken. Zp·sob je tém¥° stejný jako v klasické Jav¥, vyuºívá se t°ídy java.lang.Thread java.lang.Runnable. a rozhraní Jediný rozdíl je v tom, ºe zevnit° jiného vlákna nesmíme p°ímo p°istupovat ke grackému rozhraní, které není vláknov¥ bezpe£né. K tomu lze pouºít t°ídy objekt s rozhraním spu²t¥ním metody java.lang.Runnable run(). PrikladVlakna(viz. android.os.Handler a zaslat do hlavního vlákna a tam se kód vykoná Pro ilustraci pouºití vláken jsem vytvo°il vzorovou aktivitu p°íloha A). Pokud chceme provád¥t na pozadí n¥jakou trvalej²í £innost (nap°. stahování souboru nebo p°ehrávání hudby), m·ºeme vyuºít sluºeb. Sluºby jsou d¥d¥ny z android.app.Service. Sluºba nemá p°i°azené gracké uºivatelské rozhraní, m·ºe aktivovat pouze systém notikací. Pravd¥podobnost, ºe bude zabit proces obsahující sluºbu je podstatn¥ men²í neº v p°ípad¥ aktivity na pozadí. S okolím sluºby komunikují zpravidla pomocí mezi-procesové komunikace (IPC), která je v Androidu realizována speciálním ovlada£em binder V aplika£ním frameworku se vyuºívá rozhraní Speciální komponentou je v linuxovém jádru (viz. kapitola 1.1). android.os.IBinder. p°ijíma£, který je odvozený od t°ídy android.app.BroadcastReceiver a slouºí k jednorázové reakci na n¥které události, které vznikají v systému. Pod takovými událostmi si m·ºeme p°edstavit p°íchozí SMS nebo telefonní hovor. Proces zpracovávající p°ijíma£ je platný jen po dobu vykonávání metody onReceive(), proto nesmíme v této metod¥ vytvá°et ºádné v¥ci týkající se daného procesu, hlavn¥ ne vlákna, která b¥ºí na pozadí. Zpravidla se pouºívá pouze k vytvo°ení systémové notikace nebo spu²t¥ní sluºby. 2.3.2 Intenty a intentové ltry (Intent) Jak uº je zmín¥no v úvodu kapitoly 2 jsou aplikace rozd¥leny na jednotlivé komponenty - aktivity, sluºby a p°ijíma£e, mezi kterými se p°echází pomocí p°edávání zprávy tzv. intentu. Uºivatelsky °e£eno z jedné aktivity vyvoláváme intent, ve kterém °íkáme co 2 ZÁKLAD PRO TVORBU APLIKACÍ Obrázek 7: Vztahy aktivit a intent· 15 2 ZÁKLAD PRO TVORBU APLIKACÍ 16 chceme d¥lat a p°ípadn¥ jak to chceme ud¥lat. Vztahy intent· a komponent dob°e vystihuje obrázek 7. V²e nyní ukáºi pouze na aktivitách, v p°ípad¥ jiných komponent je situace jen mírn¥ odli²ná. V rámci jedné aplikace m·ºeme vyvolávat aktivity pomocí tzv. itního intentu, explic- ten je specikován komponentou, která ho volá a t°ídou komponenty, kterou chceme volat. íkáme p°esn¥, jak chceme danou £innost ud¥lat. //explicitní intent Intent doDruheIntent=new Intent(PrikladIntenty.this, DruhaAktivita.class); startActivityForResult(doDruheIntent, REQUEST_ZE_DRUHE); V tomto p°ípad¥ je o£ekávaný návrat n¥jakého výsledku z dané aktivity (velmi £astý poºadavek). Pokud je poté pot°eba v aktivit¥ reagovat na návrat z volané aktivity pouºíváme události onActivityResult(): protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_ZE_DRUHE && resultCode==RESULT_OK ) { //do something } } Mnohem zajímav¥j²í je pouºití implicitních intent·, kde nespecikujeme jak danou £innost ud¥lat, ale necháváme to rozhodnout systém. Implicitní intenty nejsou specikovány t°ídou aktivity, ale dodate£nými parametry, mezi které pat°í [1]: akce ( action) Intent - Jednotlivé akce jsou denovány svými konstantami na t°íd¥ a ur£ují co má intent vyvolat za akci. Mezi £asto pouºívané akce pat°í: ACTION_VIEW - ukaº uºivateli data specikovaná v URI ACTION_EDIT - umoºni upravit data specikovaná v URI ACTION_PICK - nabídni výb¥r z dat uloºených na dané URI ACTION_DIAL - chci vytá£et £íslo uloºené v URI MIME typ atd. ur£uje typ poºadovaných dat, nap°. image/png, text/plain, 2 ZÁKLAD PRO TVORBU APLIKACÍ URI schéma - 17 specikuje zp·sob p°ístupu k danému prost°edku nebo typ prost°edku kategorie (category) - dodate£ná informace o tom, jak mají být data nebo prost°edky zpracovány, má op¥t denované konstanty, nap°.: CATEGORY_BROWSABLE - aktivita m·ºe zpracovávat odkazy (nap°. na webové adresy nebo mailové adresy) CATEGORY_GADGET - aktivita m·ºe být pouºita jako gadget (speciální forma aktivity zobrazující se na pracovní plo²e) CATEGORY_PREFERENCE - aktivita slouºí k nastavení p°edvoleb pro- gramu (preferencí) Parametry implicitních intent· lze denovat v aplikaci zcela vlastní, ale pro vzájemnou kompatibilitu aplikací je doporu£ené pouºít ty, co jsou uº v aplika£ním frameworku p°ipravené. Aby aktivita mohla reagovat na pomocí intentových ltr·. implicitní intenty je pot°eba je zaregistrovat Intentový ltr pro aktivitu specikujeme v manifestu (více v kapitole 2.3.4). Pokud chceme zjistit, jak fungují jednotlivé aplikace z hlediska posílání intent·, dob°e nám k tomu poslouºí perspektiva V okn¥ LogC at DDMS v Eclipse (viz. kapitola 2.2.2). se v²echny intenty p°ehledn¥ vypisují: Starting activity: Intent { act=android.intent.action.MAIN cat =[android.intent.category.HOME] flg=0x10200000 cmp=com. android.launcher/.Launcher } Starting activity: Intent { act=android.intent.action.MAIN cat =[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com. android.contacts/.DialtactsContactsEntryActivity } Starting activity: Intent { act=android.intent.action.INSERT dat=content://contacts/people cmp=com.android.contacts/. EditContactActivity } Starting activity: Intent { act=android.intent.action.SENDTO dat=sms:255 cmp=com.android.mms/.ui.ComposeMessageActivity } V tomto p°íkladu jsem spustil aplikaci na správu kontakt·, vytvo°il nový kontakt a pak spustil odesílání SMS na tento kontakt. M·ºete si v²imnout pouºitého URI content://contacts/people, seznamu kontakt· a sms:255, které ur£uje umíst¥ní poskytovatele obsahu které je pouºito k vyvolání aplikace na odeslání SMS. 2 ZÁKLAD PRO TVORBU APLIKACÍ 18 Pro názorn¥j²í vyuºití intentových ltr· jsem zpracoval v PrikladIntenty která naslouchá na intenty prohlíºení webových odkaz· p°es protokol aktivitu, http://. Jde o takový malý jednoduchý webový prohlíºe£. V manifestu je ltr popsán takto: <activity android:name=".TretiAktivita"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" / > <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http"/> </intent-filter> </activity> ili pokud v n¥jaké libovolné aplikaci volám p°íslu²ný implicitní intent, m·ºe být systémem vyhodnoceno, ºe více neº jedna z aplikací je schopna zpracovávat daný intent. V tomto p°ípad¥ b¥ºn¥ dodávaný webový prohlíºe£ a m·j mini-prohlíºe£ z PrikladIntenty. Na obrázku 8 je vid¥t, ºe pokud systém sám neví jak dále pokra£ovat a jelikoº existuje více moºností vyhovujících intentu, zeptá se uºivatele dialogem. Uºivatel má moºnost zapamatovat si asociaci do budoucna. Poté se uº systém ptát nebude, dokud toto nastavení nezru²íme Nastavení > Aplikace > Správa aplikací > /daná aplikace/ výchozí nastavení. v a tla£ítkem Vymazat Pokud má v¥t²ina aplikací správn¥ denované intentové ltry a vyvolává implicitní intenty místo explicitních, je zp·sob nahrazení libovolné aplikace vlastní alternativou otázkou n¥kolika °ádek v manifestu. Pokud budete vyvíjet vlastní aplikace, je vhodné v dokumentaci uvád¥t jaké intentové ltry aplikace pouºívá. 2.3.3 Poskytovatel obsahu (Content Provider) Poskytovatel obsahu je datové rozhraní pro získávání a zaznamenávání dat dostupné libovolným aplikacím v systému. Funguje podobným zp·sobem jako klasická databáze, jelikoº je to £asto jen mezivrstva, která propojuje poskytovatele obsahu s SQLite databází. P°ístup k tomuto problému se velmi podobá webovým sluºbám a RESTu [9]. K obsahu poskytovanému poskytovatelem obsahu se m·ºeme dostat p°es známé URI se schématem content://, které je zpravidla ve tvaru poskytovatele>/<cesta ke zdroji>, 16 nesmíme nap°. content://<jméno content://sms/inbox16 , zapomenout na moºná omezení p°ístupovými právy pro 2 ZÁKLAD PRO TVORBU APLIKACÍ 19 Obrázek 8: Vyvolání implicitního intentu pro prohlíºení celou tabulku (v²echny SMS ve sloºce Inbox) a http:// odkazu content://sms/inbox/1 uº odkazuje na konkrétní SMS s id=1. URI lze stav¥t p°ímo p°es metody na t°íd¥ android.net.Uri: Uri smsInbox=Uri.parse("content://sms/inbox"); Uri smsMessage1=Uri.withAppendedId(smsInbox,1); V aktivit¥ m·ºeme p°istupovat k dat·m poskytovatele obsahu p°es objekt t°ídy android.content.ContentResolver. metody getContentResolver(). Na aktivit¥ ho získáme snadno zavoláním Na n¥m uº m·ºeme spou²t¥t metody pro za- loºení, £tení, aktualizaci a smazání (CRUD), jsou to () a delete(). teme android.content.Cursor. sloupc· - getCount() názv· sloupc· a p°es objekty insert(), query(), update zvané kurzory s rozhraním Ty mají denované metody pro zji²t¥ní po£tu °ádk· a getColumnCount(), getColumnNames(). pak také metody pro zji²t¥ní pole A i samotné metody pro získání dat z ur£itého 2 ZÁKLAD PRO TVORBU APLIKACÍ sloupce ur£eného svým po°adím, nap°. 20 getString(int). Uri smsURI=Uri.withAppendedPath(Uri.parse("content://sms"), " inbox"); Cursor c=activity.getContentResolver().query(smsURI, null, null, null, null); //nejprve se kurzor musí "převinout" if (c.moveToFirst()!=false) ( while(c.moveToNext()) String value=c.getString[1]; //.... } } Jako druhý parametr metody query() , lze omezit sloupce, které budou ve výb¥ru. Pokud zadáme do n¥jakého parametru null, tak to znamená, ºe se daná podmínka neuplat¬uje. Jako t°etí parametr lze zadat WHERE podmínku (SQL), jako £tvrtý pak pole parametr·, které se po popo°ad¥ mapují do této podmínky (místa kam se mapují jsou ozna£ena otazníkem). Jako poslední parametr se zadává ORDER. P°íklad, jak m·ºe takový dotaz vypadat: Cursor c=getContentResolver().query(smsURI, null, "address LIKE ?", new String[]{"%mBank%"},"_id DESC"); Na aktivit¥ existuje p°ímo metoda jako query() na objektu typu managedQuery() ContentResolver, se stejnými parametry ale tato metoda zajistí auto- matickou aktualizaci dat p°i obnovení aktivity z pozastavených stav· a tak zna£n¥ zjednodu²uje implementaci. Ukládání dat ukáºi jen na metod¥ insert(), protoºe update() se chová podobn¥ jen má navíc parametry pro WHERE podmínku. Nejprve je nutné vytvo°it objekt t°ídy a do n¥j vloºit p°íslu²né dvojice android.content.ContentValues jméno sloupce a hodnota, pak je uº moºné zavolat insert(). ContentValues vals=new ContentValues(); vals.put("address","Neznámá ctitelka"); vals.put("body","Miluji tě!"); Uri newItem=activity.getContentResolver().insert(smsURI,vals); Vrácené URI pak bude ukazovat na novou poloºku, ve tvaru content://< jméno poskytovatele>/<cesta ke zdroji>/<nové id>. Na CD (p°íloha A) je k poskytovatel·m obsahu vytvo°en p°íklad Provideru s aktivitou, která zobrazí v²echny p°ijaté SMS v prvku Priklad- ListView. 2 ZÁKLAD PRO TVORBU APLIKACÍ 21 Obrázek 9: Povolení p°ístupových práv p°i instalaci Systém poskytuje mnoºství vlastních poskytovatel· a ty jsou dostupné z balí£ku android.providers.*. Poskytovatele konkrétních aplikací m·ºeme op¥t najít v manifestu, pro inspiraci op¥t doporu£uji nahlédnout do exportu manifest· uloºených na CD (p°íloha A). Konkrétn¥ v p°ípad¥ SMS a MMS úloºi²t¥ není denovaný ºádný p°esný zdroj, ale v¥t²ina aplikací spoléhá na úloºi²t¥ SMS aplikace dodávané v rámci AOSP, v p°ípad¥ ºe nebude tato aplikace v systému dostupná, nebude dostupný ani tento poskytovatel obsahu. V rámci vlastních aplikací m·ºete vytvo°it vlastního poskytovatele obsahu, roz²í°ením abstraktní t°ídy android.content.ContentProvider a implementací p°íslu²ných metod. Vytvo°ený poskytovatel obsahu musí být op¥t zapsán do manifestu, aby o n¥m v¥d¥l celý systém. 2.3.4 Manifest a bezpe£nostní omezení aplikací Manifest je popisný soubor aplikace ve formátu XML. Obsahuje základní informace o aplikaci jako název, verze nebo ikona. Je v n¥m také zaznamenáno ze kterých komponent se aplikace skládá, jaké jsou jejich intentové ltry. V p°íloze B se m·ºete seznámit s ukázkou manifestu aplikace Mapy Google dodávané v rámci AOSP. Jelikoº má Android systém oprávn¥ní, která omezují p°ístup k n¥kterým funkcím telefonu pouze autorizovaným aplikacím, obsahuje manifest seznam pouºitých oprávn¥ní. 2 ZÁKLAD PRO TVORBU APLIKACÍ 22 P°i instalaci aplikace se p°e£tou tato oprávn¥ní a jsou zobrazena uºivateli (viz. obrázek 9), který je musí schválit, jinak se aplikace nenainstaluje. Tento systém chrání uºivatele p°ed potenciáln¥ nebezpe£nou aplikací. Lze si totiº p°edstavit aplikaci, která kaºdou sekundu odesílá SMSku a tak uºivateli p°ichystá nep°íjemné p°ekvapení v podob¥ obrovských £ástek na faktu°e. Systémem oprávn¥ní jsou chrán¥ny v²echny takto kritické £ásti telefonu jako odesílání zpráv, p°ístup k internetu, p°ístup ke kontakt·m, sledování polohy p°es GPS, apod. Pokud ve vlastní aplikaci zapomenete uvést oprávn¥ní v manifestu, tak v p°ípad¥ ºe se aplikace pokusí pouºít chrán¥ného p°ístupu, tak skon£í vyhozením výjimky java.lang.SecurityException. V man- ifestu je také moºné denovat vlastní oprávn¥ní, která bude va²e aplikace pouºívat vzhledem k aplikacím ostatním. Sou£ástí vývojového prost°edí pro Android v Eclipse je p°ehledné gracké rozhraní pro editaci manifestu. Na p°iloºeném CD (p°íloha A) naleznete exporty v²ech XML pouºitých v AOSP aplikacích, tedy i manifest·. Pouºitý nástroj Axml2xml [20] je také sou£ástí CD. Manifesty jsou zejména uºite£né pro zji²t¥ní intent ltr· pouºívaných v aplikacích a pro inspiraci tvorby vlastních. 2.4 Nasazení aplikace a Android Market Hotovou a odlad¥nou aplikaci je moºné p°eloºit do instalovatelného balí£ku s p°íponou 17 *.apk . Ve vývojovém prost°edí pro Android v Eclipse, tak m·ºeme u£init z kontex- tové nabídky na projektu volbou age... Android Tools > Export Signed Application Pack- V prvním kroku vyplníme jen název balí£ku. Ve druhém kroku musíme zadat úloºi²t¥ klí£·, kde bude vygenerován unikátní klí£ autora, který funguje podobn¥ jako elektronický podpis. Díky tomu v²echny dal²í vytvo°ené aplikace budou podepsány va²ím klí£em a bude jasn¥ deklarováno, kdo aplikaci vytvo°il. Proto je nezbytné bezpe£n¥ klí£ uchovat a opat°it ho silným heslem. Aplikace je moºné distribuovat p°ímo ve form¥ *.apk balí£ku. Android v²ak nabízí mnohem zajímav¥j²í zp·sob distribuce a to je distribuce p°es Android Market. Toto centralizované úloºi²t¥ aplikací provozuje spole£nost Google. Je moºno zde distribuovat aplikace zdarma nebo placené, nicmén¥ v dob¥ psaní této práce není moºno v eské republice placené aplikace prodávat, ba dokonce ani nakupovat. 17 jde o ZIP soubor, který obsahuje strukturu zkompilované aplikace spolu s manifestem 2 ZÁKLAD PRO TVORBU APLIKACÍ 23 2.5 Specika vývoje mobilních aplikací A£koliv je mobilní platforma Android kompatibilní z hlediska vývoje s °e²ením Java SE na osobních po£íta£ích, je pot°ebné do vyvíjených aplikací promítnout omezení dané mobilním hardware. Proto n¥které best practices 18 z klasické Javy zde není vhodné pouºívat a oproti tomu je doporu£ené pouºívat jiné, které zde popí²i [1]. V kapitole 2.3.1 jsem uº zmínil doporu£ení nepouºívat hlavní vlákno aktivity k £asov¥ náro£ným výpo£t·m. Nedodrºení tohoto pravidla povede k zablokování uºivatelského rozhraní a zobrazení dialogu s výstrahou, ºe daná aplikace neodpovídá. Pro aktivity je tato doba 5 sekund a pro p°ijíma£e je tato doba 10 sekund. Pro rozsáhlej²í výpo£ty tedy vºdy pouºívejte vlákna. Aplikaci vºdy rozd¥lujeme na aktivity, tak aby jeden pohled (obrazovka) odpovídal jedné aktivit¥. Není doporu£ené m¥nit pohledy v rámci jedné aktivity. V aktivitách nesmíme zapomínat onSaveInstanceState(Bundle). na ukládání stavu aktivity pomocí Pokud neuloºíme stav p°i p°esunu jiné aktiv- ity na pop°edí, riskujeme zabití procesu dané aktivity a ztráty zadaných dat. Musíme si uv¥domit, ºe taková aktivace na pop°edí m·ºe prob¥hnout nap°íklad kdykoli p°i p°íchozím hovoru. Uºivatelské rozhraní je vhodné p°izp·sobit tak, aby mohlo být ovládané bez hardwarové klávesnice, ba dokonce bez dotykového displeje. V p°ípad¥ sí´ových aplikací je nutné po£ítat s velkým zpoºd¥ním v GSM síti p°i p°ipojení p°es GPRS (aº jednotky sekund) a EDGE (obvykle 150-500ms), ani v 3G sítích není situace výrazn¥ lep²í oproti klasickému pevnému p°ipojení realizovanému nap°. p°es wi-, p°ipojenou ke poskytovateli internetu p°es optické £i kabelové sít¥. Datová p°ipojení jsou také velmi náro£ná na spot°ebu, proto by jejich pouºití m¥la p°edcházet úvaha, zda a jak £asto je nutné je vyuºívat. Dal²í doporu£ení se týkají vlastní platformy z hlediska výkonu. Není dobré naduºívat vytvá°ení nových objekt·, je vhodné znovu-pouºívat objekt· stávajících uº jednou alokovaných, p°ípadn¥ ve velké mí°e pouºívat singleton· 19 . V maximální mí°e je vhodné pouºívat jednoduchých datových typ·, nikoli t¥ch objektových (£ili více mén¥ Integer). int, Uvnit° t°ídy není vhodné pouºívat getter· a setter· (metod k nas- tavení instan£ních prom¥nných), ale naopak pouºívat p°ímo p°ístupu k jednotlivým prom¥nným. Je vhodné maximáln¥ specikovat datové typy a minimáln¥ pouºívat rozhraní a t°íd p°edk·, pokud denujeme datový typ, výrazn¥ tak sniºujeme reºii spo18 doporu£ené 19 t°ída, postupy ke které lze vytvo°it pouze jedinou instanci v celé aplikaci 2 ZÁKLAD PRO TVORBU APLIKACÍ 24 jenou s vyhodnocením virtuálních metod na objektu (to jde p°ímo proti princip·m, na které jsme zvyklí z klasického vývoje). Není vhodné pouºívat vý£tového typu, protoºe p°i jeho vytvo°ení alokujeme daleko více pam¥ti, místo n¥j je vhodné pouºít konstant. Konstanty vºdy deklarujeme jako static a final, op¥t tak dosáhneme zvý²ení výkonu. Z hlediska výkonu je také problematický datový typ float a pokud netvo°íme matematicky orientované aplikace, je vhodné se mu vyhnout a pouºívat pouze celá £ísla. 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 25 3 Návrh grackého uºivatelského rozhraní (GUI) Gracké uºivatelské rozhraní Androidu je od po£átku navrºené pro mobilní za°ízení. Umoº¬uje uºivateli efektivn¥ ovládat za°ízení pomocí dotykového displeje. V Androidu 20 není pouºita ºádná stávající Javová implementace uºivatelského rozhraní jako AWT nebo Swing, framework nabízí zcela vlastní pojetí. Je jednoduché a snadno pochopitelné. GUI lze vytvo°it zcela ru£n¥ pomocí kódu nebo lze vyuºít XML soubor· rozvrºení (layout·). Ve²kerá nastavení a parametry grackého uºivatelského rozhraní bývají uloºeny ve zdrojích (resources). Základním prvkem GUI je pohled (View), který je reprezentovaný t°ídou android.view.View a od n¥j jsou odvozeny ve²keré prvky grackého uºivatel- ského rozhraní. Existuje jako v²echny gracké prvky v n¥jakém kontextu, kterým je ve v¥t²in¥ p°ípad· n¥jaká aktivita. Bu¤ jde uº o vlastní prvky nebo skupiny prvk·, které jsou charakteristické tím, ºe do nich lze vkládat dal²í prvky a díky tomu má celé uºivatelské rozhraní strukturovanou podobu. 3.1 Zdroje (Resources) a jejich pouºití v kódu Zdroje jsou data p°ibalená k aplikaci, ur£ená pouze pro £tení a jsou d·leºitá pro provoz aplikace. V projektu Eclipse jsou uloºena v adresá°i res. Typy zdroj· m·ºete vid¥t v tabulce 2. Zdroje se p°eváºn¥ ukládají ve formátu XML. Tato XML se, kv·li zvý²ení výkonu a zmen²ení velikosti, p°ekládají p°ímo do binární podoby [9]. Op¥t zd·raz¬uji, ºe Android se snaºí být maximáln¥ p°ístupný a modikovatelný. Proto v Androidu existuje n¥co jako alternativní zdroje [1]. Adresá°e lze opat°it p°ípon- ami, které specikují pouºití jiných zdroj· neº t¥ch výchozích, v ur£itých situacích jako je zm¥na hardwarové kongurace p°ístroje nebo zm¥na jazyka. Typicky se toho vyuºívá u °et¥zc·, ale je moºné toho vyuºít u libovolných zdroj·. Gracké rozhraní v Eclipse umoº¬uje pom¥rn¥ rychle vytvá°et takové alternativní zdroje P°íklady ukazuje tabulka 3. V XML souborech lze odkazovat na hodnoty jiného zdroje pomocí formátu @[balíček:]typ/jméno. V Javovém kódu je pro zdroje v daném balí£ku vytvo°ena automaticky vývojovým prost°edím t°ída jednotlivých 20 existuje zdroj·. K R, která obsahuje konstanty s identikátory identikátor·m lze pak nezávislá implementace AWT pro Android na http://code.google.com/p/awt-android-compat/ p°istupovat p°es 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) Typ zdroje 26 Popis zdroje Umíst¥ní Hierarchická reprezentace umíst¥ní grackých prvk· Rozvrºení (Layout) /res/layout/*.xml uvnit° jednotlivých rozvrºení a kontejner·, dostupné jako R.layout.* Id /res/values/*.xml Nabídky (Menu) /res/menu/*.xml Barvy (Color) /res/values/*.xml Identikátory prvk· GUI, dostupná jako R.id.* Denice nabídek, dostupné pak z R.menu.* Reprezentace barev, dostupné jako R.color.* Texty a p°eklady GUI do et¥zce (String) /res/values/*.xml r·zných jazyk·, dostupné jako Rozm¥ry (Dimension) /res/values/*.xml Obrázky /res/drawable/* Volitelné XML soubory /res/xml/*.xml R.string.* Rozm¥ry prvk·, dostupné jako R.dimen.* Ikony a obrázky, dostupné jako R.drawable.* R·zné vlastní XML soubory, dostupné jako R.xml.* R·zné vlastní libovolné Volitelné jiné soubory soubory, dostupné jako /res/raw/* R.raw.* Dal²í soubory, lze je £íst p°es Dal²í soubory /assets/* android.content.res. AssetManager Tabulka 2: Typy zdroj· balíček.R.typ.jméno. K získání vlastního zdroje slouºí metody na t°íd¥ android.content.res.Resources, jejíº instance se na aktivit¥ získá p°es metodu getResources(). Zdroje rozvrºení a zdroje id proberu detailn¥ v kapitole 3.2. et¥zcové zdroje reprezentují v·bec ve²keré texty, které v aplikaci pouºíváme. Je pravda, ºe m·ºeme zapsat text p°ímo natvrdo v rozvrºení nebo v kódu, ale p°i²li bychom o moºnost pouºít alternativních zdroj· pro jiné jazyky. Proto by v²echny texty m¥ly být zapsány v °et¥zcových zdrojích: <resources> <string name="hello">Ahoj světe!</string> </resources> 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) Cesta values-fr 27 Alternativní zdroj Hodnoty pro systém kde je nastavený francouzský jazyk Rozvrºení pro telefon layout-land oto£ený v reºimu krajina (del²í hranou dol·) Obrázky pro systém s nastaveným jazykem drawable-zh-rTW taiwanská £ín²tina Nabídky pro telefony s menu-mcc231-keysexposed vysunutou klávesnicí a p°ihlá²ené do sít¥ operátora na Slovensku Tabulka 3: P°íklady alternativních zdroj· et¥zec ze zdroje pak získáme takto: String textik = (String)activity.getString(R.string.hello); S dal²ími zdroji se v kódu pracuje velice podobn¥, pro ilustraci n¥kolik p°íklad·: //Barvy int cervena=activity.getResources().getColor(R.color.red); //Rozměry float delka=activity.getResources().getDimension(R.dimen. my_width). //Obrázky BitmapDrawable d=activity.getResources().getDrawable(R. drawable.my_image); 3.2 Rozvrºení (Layout) Rozvrºení (layout) specikuje vlastní umíst¥ní grackých prvk· na obrazovce, v XML souboru jsou specikovány jednotlivými tagy jednotlivé pohledy (View), £ili gracké prvky odvozené od t°ídy android.view.View. Pro návrh rozvrºení je ve vývojovém prost°edí Androidu pro Eclipse k dispozici gracký návrhá°. Rozvrºení lze ve form¥ zdroje specikovat XML souborem: <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width=" fill_parent" 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 28 android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string /hello" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/ butOk" android:text="@string/tlacitkoOk"></Button> </LinearLayout> V rozvrºení m·ºe být libovolný prvek GUI identikován jednozna£ným identikátorem a to je jeho android:id. Pokud není denováno p°edem ve zdroji, tak je moºné ho nechat automaticky generovat referencí ve tvaru @+id/jméno. K prvku lze pak p°istupovat v aktivit¥ jednoduchým zp·sobem, nap°íklad takto pro tla£ítko: Button myButton = (Button)activity.findViewById(R.id.butOk); Dále mají pochopiteln¥ gracké prvky spoustu r·zných vlastností, které ur£ují jak se bude prvek chovat. V dal²ím textu jim budu °íkat pouze V²echna rozvrºení jsou odvozena od vlastnosti. t°ídy skupiny prvk· android.view.ViewGroup, která umoº¬uje do sebe rozvrºení a dal²í prvky zano°ovat. Pro prvky do n¥j vloºené a chování jejich rozm¥r· a umíst¥ní se °e²í p°es tzv. vlastnosti rozvrºení, ty jsou typické svojí p°edponou layout_ a kaºdý prvek uloºený v rozvrºení má svou sadu t¥chto vlastností. Mezi klí£ové vlastnosti rozvrºení ur£ující rozm¥ry prvku pat°í android:layout_width android:layout_height wrap_content, pro vý²ku prvku. Ty pro mohou ²í°ku prvku nabývat a hodnot kdy se prvek chová tak, ºe se snaºí svými rozm¥ry maximáln¥ obe- mknout sv·j obsah nebo fill_parent, který naopak roztahuje prvek na velikost své nad°azené skupiny prvk·. Pokud bychom cht¥li pevnou ²í°ku, £i vý²ku, tak je moºné toto nastavit p°es vlastnosti android:width a android:height, ale doporu£uji se tomu pokud moºno vyhnout, protoºe to sniºuje pouºitelnost na za°ízeních s rozdílnými rozli²eními displeje. Pro správné nastavení velikosti jednotlivých prvk· je d·leºité se je²t¥ seznámit s jednotkami pouºitými k specikování rozm¥r· [1]: px (pixely) - odpovídají p°esn¥ bod·m na obrazovce, jejich maximální po£et je dán rozli²ením, nezávisí na fyzické velikosti obrazovky in (palce) - anglosaská jednotka délky, odpovídá 2,54cm, rozm¥ry se po£ítají vzhledem k fyzické velikosti obrazovky 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) mm (milimetry) pt (body) 29 - rozm¥ry se po£ítají vzhledem k fyzické velikosti obrazovky - typogracká jednotka, 1/72 palce, vzhledem k fyzické velikosti obrazovky dp (pixely nezávislé na hustot¥ bod·) - abstraktní jednotka zaloºená na hustot¥ bod· na obrazovce, relativn¥ k 160dpi (body na palec) obrazovce sp (pom¥rov¥ nezávislé pixely) - podobné jako dp, ale m¥ní se s velikostí font· nastavených uºivatelem, vhodné ke specikaci velikosti písma Rozm¥ry prvk· je vhodné denovat ve zdrojích typu rozm¥ry. <resources> <dimen name="one_pixel">1px</dimen> <dimen name="double_density">2dp</dimen> <dimen name="sixteen_sp">16sp</dimen> </resources> Existuje celkem p¥t r·zných typ· rozvrºení, popí²u postupn¥ kaºdé z nich (uvádím v²echny plným názvem Javové t°ídy, ve zdroji sta£í zápis jednoduchý). android.widget.LinearLayout - Prvky vloºené do tohoto rozvrºení se skládají vedle sebe vertikáln¥ nebo horizontáln¥ na základ¥ hodnoty vlastnosti android:orientation. Pro prvky je moºné pouºít vlastnosti rozvrºení android:layout_gravity, které ur£uje zarovnání prvku v rozvrºení, vhodné je ho pouºít nap°íklad k vycentrování prvku. Není radno zam¥¬ovat tuto vlastnost rozvrºení s vlastností android:gravity, ta se týká samotného obsahu prvku a naopak zarovnává nap°íklad text v tla£ítku. Dal²í vlastností rozvrºení je android:layout_weight, která m·ºe nabývat 0 nebo 1. Pokud je u n¥k- terého prvku v rozvrºení 1 a u ostatních 0, tak má tento prvek rozhodující právo se roztáhnout na zbytek rozvrºení, zatímco ty s 0 z·stanou stejn¥ velké. android.widget.TableLayout - Je roz²í°enou variantou p°edchozího rozvrºení a chová se jako tabulka, android.widget.TableRow m·ºeme do n¥j vkládat °ádky pomocí a tak rozd¥lovat prostor vertikáln¥ a do °ádk· pak umis´ujeme jednotlivé prvky, které tvo°í sloupce. Mezi °ádky je vazba na rozm¥ry jednotlivých sloupc·, takºe prvky ve stejném sloupci mají stejnou ²í°ku ve v²ech °ádcích. Prvky nereagují na hodnotu tavenou na tahovat wrap_content. v p°ípad¥ android:layout_width nas- Aby rozvrºení v¥d¥lo, které sloupce je moºno roz- pot°eby, m·ºeme tak specikovat pomocí 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 30 android:stretchColumns £ísla sloupc· odd¥lená £árkou (za£ínající 0), naopak pomocí android:shrinkColumns ty které je moºné zmen²ovat. android.widget.RelativeLayout - Prvky se zde umís´ují tak, aby byly umíst¥ny na ur£itém míst¥ vzhledem k jinému prvku k rozvrºení nebo vzhledem k rozvrºení samotnému. android.widget.AbsoluteLayout s ohledem na pozice - Prvky se umis´ují na p°esné pozice android:layout_x a android:layout_y relativn¥ vzhledem k umíst¥ní rozvrºení. Toto rozvrºení je doporu£uji pouºívat jen ve specických p°ípadech, jako v t¥ch, kdy pozice a rozm¥ry prvk· po£ítáme sami ru£n¥, jinak se vystavujete riziku toho, ºe vám rozvrºení bude vystupovat mimo obrazovku nebo se budou prvky nep°irozen¥ p°ekrývat. android.widget.FrameLayout - Je optimalizován na aktuální zobrazení jediného prvku. V²echny vloºené prvky se umís´ují vzhledem k rozloºení, takºe se budou p°ekrývat. Vhodným pouºitím tohoto layoutu je p°ípad, kdy máme n¥kolik prvk· v tomto jednom rozli²ení a chceme aby byl vid¥t jen jeden z prvk·. 3.3 Prvky GUI V této kapitole proberu v²echny základní prvky grackého uºivatelského rozhraní, které jsou v Androidu k dispozici. U t¥ch nejd·leºit¥j²ích i v p°íkladech p°iblíºím r·zné zp·soby pouºití. 3.3.1 Text (TextView) a textové pole (EditText) Text je jednoduchý prvek, který je t°ídy android.widget.TextView textový popisek. Tento popisek je uloºen ve vlastnosti a slouºí jako android:text a lze mu hodnot, t°ída nastavit mj. barvu, velikost a font. Textové pole slouºí ke vstupu textových jeho je android.widget.EditText. D·leºitou vlastností je android:intputType, který specikuje jaké znaky je moºné do polí£ka psát, p°ípadn¥ zda má být pouºito automatické dopl¬ování a dal²í. Oba prvky je moºné vid¥t na obrázku 10. Zadaný text z pole dostaneme takto: String text=editText.getText().toString(); 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 31 Obrázek 10: Text a textové pole 3.3.2 Tla£ítko (Button) a listenery Tla£ítko je základní prvek, android.widget.Button. který vykonává n¥jakou akci, jeho t°ída je Hlavní reakce na tla£ítku je klik (zpravidla dotyk na dotykové obrazovce nebo stisknutí trackballu/p°íslu²ného potvrzovacího tla£ítka). Podobn¥ jako v jiných GUI Javových frameworcích se zde pouºívá listener·. Zaregistrujeme p°íslu²ný listener, který pouºívá dané rozhraní: Button tlacitko = (Button)activity.findViewById(R.id.tlacitko) ; tlacitko.setOnClickListener(new View.OnClickListener() { // tady vzniká anonymní vnitřní třída public void onClick(View v) { //tady něco udělej } }); Tento listener lze zaregistrovat na v¥t²in¥ prvk·. Není v²ak jediným svého druhu, máme dal²í typy listener·, které pouºíváme v následujících p°ípadech: View.OnLongClickListener - pokud stiskneme dotykovou obrazovku a drºíme jí del²í dobu, nebo na del²í stisk trackballu View.OnFocusChangeListener tuální zam¥°ení 21 - pokud se zm¥ní (získá nebo ztratí) ak- polí£ka View.OnKeyListener - pokud stiskneme klávesu View.OnTouchListener - pokud je proveden dotyk nebo se naopak dotýkat p°estaneme View.OnContextMenuListener více k nabídkám v kapitole 3.3.6 - pokud se má otev°ít kontextová nabídka, 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 32 Obrázek 11: Varianty tla£ítek Dal²ími variantami tla£ítek jsou tla£ítka ukázána na obrázku 11.: android.widget.ImageButton - obrázková tla£ítka android.widget.ToggleButton android.widget.CheckBox - zatrhávátka android.widget.RadioButton 3.3.3 - p°epínací tla£ítka za²krtávátka - radiobuttony Adaptérové prvky a adaptéry Mnoho prvk· v Androidu zobrazuje n¥jaká data, £asto p°ímo z n¥kterého poskytovatele obsahu (viz. kapitola 2.3.3). Zobrazují tak seznamy t¥chto dat. Propojení mezi daty a prvkem GUI zaji²´uje objekt, který se nazývá adaptér. Je n¥kolik druh· adaptér· a m·ºeme od nich odvozovat své vlastní adaptéry: android.widget.ArrayAdapter<T> - tento adaptér mapuje jeden datový sloupe£ek uloºený v poli na jeden prvek v rozvrºení android.widget.CursorAdapter - tento adaptér mapuje jeden datový sloupe£ek uloºený v kurzoru na jeden prvek v rozvrºení android.widget.SimpleAdapter ArrayListu - tento adaptér mapuje data uloºená v na p°íslu²né prvky v rozloºení, m·ºe mapovat na více prvk· android.widget.ResourceCursorAdapter - tento adaptér mapuje jeden datový sloupe£ek uloºený v kurzoru na jeden prvek v rozvrºení android.widget.SimpleCursorAdapter kurzoru na prvky v rozvrºení - tento adaptér mapuje data z 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) Obrázek 12: ListView v Jedním z prvk· vyuºívající adaptéry je 33 PrikladProvideru android.widget.ListView, slouºí k zobrazení posuvného seznamu (viz. obrázek 12 a p°íklad který PrikladProvideru na CD v p°íloze A). Dal²í £asto pouºívané prvky, které pouºívají adaptéry jsou: android.widget.GridView - který prvky zarovnává na rozdíl od ListView do m°íºky android.widget.Spinner - prvek, který je z klasických GUI znám pod po- jmem combobox (vyskakovací roletové menu) 3.3.4 Toust (Toast) Tousty jsou krátké texty, které se zobrazí na obrazovce po dobu zpravidla n¥kolika sekund: Toast.makeText(getApplicationContext(), "Ahoj světe!", 1).show (); Slouºí k okamºitému upozorn¥ní uºivatele. Pouºity jsou také v PrikladIntenty (viz. CD - p°íloha A). 21 k zam¥°ení polí£ka dochází pokud na n¥j klikneme, pokud klikneme jinam zam¥°ení se ztrácí 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 3.3.5 34 Notikace Android disponuje systémem notikací, které upozor¬ují uºivatele na v²echny d·leºité události, ke kterým do²lo nebo které probíhají. Notikace jsou v grackém rozhraní na dotykovém displeji dostupné tahem za horní li²tu sm¥rem dol· (viz. obrázek 13). Obsahují typicky informace o do²lých SMS, zme²kaných hovorech, apod. Také zp·sobují blikání signaliza£ní diody, spu²t¥ní zvuku a vibraci telefonu. Obrázek 13: Systém notikací v Androidu K systému notikací m·ºeme p°istupovat metodou Context.NOTIFICATION_SERVICE), která android.app.NotificationManager. denovány objektem typu .PendingIntent, vrátí objekt typu Na n¥m lze spou²t¥t notikace, které jsou android.app.Notification, notikace - ikonu a textový popis a tzv. getSystemService( odloºený intent, kde lze denovat vzhled ten je typu android.app vytvá°í se za pomocí b¥ºného intentu a zp·sobí pak vyvolání p°íslu²ného intentu p°i klepnutí na notikaci. P°íklad na notikaci je 3.3.6 v PrikladVlakna (viz. CD - p°íloha A). Tvorba nabídek Jako v kaºdém grackém uºivatelském rozhraní, tak ani na Androidu, nesmí chyb¥t nabídky (menu). V p°ípad¥ Androidu jsou omezeny na t°i typy nabídek: 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 35 nabídka voleb (options menu) - nabídka, která se na aktivit¥ zobrazí po stisknutí Menu, obsahuje aº ²est poloºek, které mají ikony, pokud máme více neº poloºek, je moºné dal²í roz²í°enou nabídku zobrazit pomocí volby Více tla£ítka ²est kontextová nabídka (context menu) - textová nabídka zobrazující se na dlouhý stisk (podrºení) na p°íslu²ném prvku GUI, se kterým je svázána podnabídka (submenu) - podnabídku denujeme, jako sou£ást p°edchozích dvou typ· nabídek, je textová a není moºné do ní zano°ovat dal²í podnabídky Nabídky je moºné denovat v XML zdrojích typu nabídky (viz. kapitola 3.1) nebo p°ímo v kódu. Ve vývojovém prost°edí Eclipse je op¥t dostupný p°ehledný gracký editor t¥chto soubor·. Nabídky generujeme pomocí metod na aktivit¥ pro nabídky voleb a onCreateContextMenu() onCreateOptionsMenu() pro kontextové nabídky. Kontextové nabídky je nutné je²t¥ registrovat na prvek a to je moºné provád¥t p°ímo v metod¥ onCreate() na aktivit¥ pomocí metody registerForContextMenu(): public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); registerForContextMenu(findViewById(R.id.EditText01)); } public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu1, menu); return true; } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); if (v.getId()==R.id.EditText01) menu.add("Testovací položka"); } P°íklad na nabídky je nazvaný 3.3.7 PrikladMenu (viz. CD - p°íloha A). Dialogy V kapitole 3.3.4 jsem vám p°edstavil tousty jako zp·sob okamºitého upozorn¥ní uºivatele. Pokud chceme po uºivateli potvrdit n¥jakou akci nebo informovat o probíhající £innosti na aktivit¥, je vhodné pouºít komplexn¥j²í systém dialog· (viz. obrázek 15). Dialogy je moºné rozd¥lit na tyto typy: 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 36 Obrázek 14: Nabídka voleb a podnabídka dialogy upozorn¥ní (android.app.AlertDialog) - slouºí k zobrazení zprávy, která obsahuje maximáln¥ t°i tla£ítka dialogy pr·b¥hu (android.app.ProgressDialog) - slouºí k zobrazení pr·b¥hu n¥jaké £innosti, £innost je pak provád¥na v separátním vlákn¥ a aktualizaci dialogu provádí zprávami do hlavního vlákna p°es android.os.Handler. dialogy výb¥ru data a £asu (android.app.DatePickerDialog a android.app.TimePickerDialog) uºivatelské dialogy - dialogy, které mají asociované rozvrºení (kapitola 3.2) a díky tomu mohou obsahovat libovolné prvky P°íklad na dialogy je sou£ástí 3.3.8 PrikladMenu (viz. CD - p°íloha A). Dal²í prvky Android obsahuje mnoho dal²ích prvk· GUI. D¥d¥ním od p°íslu²ných t°íd t¥chto prvk· m·ºeme vytvá°et dal²í vlastní prvky. D·leºité je zmínit n¥kolik dal²ích prvk·, které se £asto v aplikacích pouºívají: android.widget.ImageView - prvek zobrazující obrázek 3 NÁVRH GRAFICKÉHO UIVATELSKÉHO ROZHRANÍ (GUI) 37 Obrázek 15: R·zné typy dialog· android.widget.TabWidget,android.widget.TabHost - zobrazení rozvrºení po p°epínatelných panelech android.webkit.WebView - prvek slouºící k zobrazení webové stránky, vykresluje stránku pomocí jádra prohlíºe£e WebKit, m·ºeme ho vyuºít pro integraci aplikací Androidu z webem com.google.android.maps.MapView - prvek Google Mapy, pro zobrazení mapových podklad·, £asto je pouºíván v aplikacích, které vyuºívají zji²´ování polohy p°ístroje Mnoho p°íklad· na pouºití t¥chto prvk· najdeme na stránkách Android Developers [1]. 4 MONOSTI APLIKANÍHO FRAMEWORKU 38 4 Moºnosti aplika£ního frameworku V p°edchozích kapitolách jsem popsal st¥ºejní principy, které je nutné v¥d¥t pro vývoj aplikací pro Android. V této kapitole vám p°iblíºím moºnosti, které Android nabízí pro tvorbu ²iroké ²kály aplikací. 4.1 Funkce telefonního p°ístroje Mezi základní funkce mobilního telefonního p°ístroje (mobilu), na kterém se dnes Android nej£ast¥ji pouºívá, jsou hlasové sluºby a MMS/SMS. Pomocí t°íd v balí£ku android.telephony m·ºeme zejména odesílat SMS zprávy a zji²´ovat stav sít¥. tení zpráv probíhá p°es content providery pro oba typy zvlá²´ content://sms a content://mms-sms, content://mms. p°ípadn¥ Toto rozhraní zatím není standardizované a je dostupné jen díky p°ítomnosti aplikace pro SMS/MMS zprávy (com.android.mms) dodávané s AOSP. tení zpráv je zpracováno v Provideru Priklad- (viz. CD - p°íloha A). 4.2 Sí´ové sluºby P°ístroje s Androidem jsou zam¥°ené na komunikaci p°es internet, je nutné aby aplika£ní framework obsahoval podporu pro sí´ové sluºby. Android obsahuje podporu 22 pro protokoly IPv4 a i nastupujícího IPv6 . Sí´ové funkce jsou pln¥ kompatibilní s Java SE a v²echny známé t°ídy naleznete v balí£ku v android.net. java.net. Dal²í t°ídy naleznete D·leºitou sou£ástí je HTTP knihovna, kterou m·ºete pouºít ke ko- munikaci s r·znými zdroji p°es HTTP, od Apache v balí£cích org.apache.http.*. 4.3 Multimediální funkce V balí£ku android.media nalezneme t°ídy, které je moºné pouºít k p°ehrávání a záznam multimediálního obsahu ve form¥ zvuku a videa. Android podporuje celou °adu audio a video formát· (viz. tabulka .4). 4.4 Loka£ní sluºby, senzory a roz²í°ená realita Moderní mobilní telefon je vybaven celou °adou hardwarových senzor·, které umoº¬ují zjistit stav telefonu vzhledem k prost°edí. Telefony vy²²í t°ídy osazované Androidem 22 ve verzi Android 2.1 není je²t¥ pln¥ podporován v uºivatelském rozhraní 4 MONOSTI APLIKANÍHO FRAMEWORKU 39 Médium Formát P°ehrávání / záznam Typ souboru Zvuk AAC LC/LTP p°ehrávání HE-AACv1 (AAC+) p°ehrávání HE-AACv2 p°ehrávání AMR-NB p°ehrávání i záznam *.3gp AMR-WB p°ehrávání *.3gp MP3 p°ehrávání *.3gp, *.mp4, *.mp4a *.3gp, *.mp4, *.mp4a *.3gp, *.mp4, *.mp4a *.mp3 *.mid, *.xmf, MIDI *.mxmf, *.rtttl, p°ehrávání *.rtx, *.ota, *.imy Obrázek Video Ogg Vorbis p°ehrávání *.ogg PCM/WAVE p°ehrávání *.wav JPEG p°ehrávání i záznam *.jpg GIF p°ehrávání *.gif PNG p°ehrávání *.png BMP p°ehrávání *.bmp H.263 p°ehrávání i záznam *.3gp, *.mp4 H.264 AVC p°ehrávání *.3gp, *.mp4 MPEG-4 SP p°ehrávání *.3gp, *.mp4 Tabulka 4: Multimediální formáty podporované Androidem [1] 23 obsahují ve své výbav¥ GPS, k ur£ení velmi p°esné polohy telefonu kdekoli na plan- et¥. V p°ípad¥, ºe není GPS dostupné, zapnuté nebo nemá signál je poloha ur£ována z 24 poloh vysíla£· mobilní sít¥ , p°ípadn¥ z registrovaných bod· wi- sít¥ nebo na základ¥ IP adresy. Dal²ím senzorem je elektronický kompas, díky kterému je moºné ur£it nato£ení telefonu vzhledem k magnetickým pól·m planety a v neposlední °ad¥ obsahují akcelerometr (m¥°í zrychlení p°i pohybu p°ístroje a jeho nato£ení v prostoru). Android podporuje i dal²í senzory jako m¥°i£e tlaku, teploty a vzdálenosti od p°ekáºky, ale jsou mén¥ vyuºívané a nejsou £asto v za°ízeních dostupné. API senzor· je moºné najít v balí£ku android.hardware, loka£ní sluºby pak v balí£ku android.location. Jelikoº dokáºeme ur£it polohu telefonu a jeho nato£ení v prostoru, tak ve spolupráci s kamerou na telefonu je moºné ur£it, kterým sm¥rem je nato£ená kamera. Pokud máme zapnutý displej s obrazem kamery, je moºné ur£it, kterým sm¥rem se p°es telefon díváme. Spolu s tím, ºe z internetových sluºeb víme, kde jsou umíst¥né v okolí r·zné objekty (restaurace, hotely, obchody, turistické atrakce, apod.), m·ºeme 23 typicky 5-20m, viz. nap°. test p°esnosti GPS v [21] z GSM lze získat aº 100m v závislosti na hustot¥ pokrytí vysíla£i [22] 24 p°esnost 4 MONOSTI APLIKANÍHO FRAMEWORKU 40 tak p°esn¥ ur£it i sm¥r k takovému objektu a jeho pozici p°ímo promítnout na displej telefonu sou£asn¥ s obrazem kamery a díky tomu vidíme skute£né objekty spolu s t¥mi virtuálními. Tento princip se nazývá roz²í°enou realitou (augmented reality ). 4.5 SQLite SQLite [23] je v poslední dob¥ stále populárn¥j²í open-source souborová databáze. V Androidu ji pouºívá v¥t²ina aplikací a pouºívá se také k realizaci poskytovatel· obsahu (viz. kapitola 2.3.3). Na databázi se pouºívá dotazovací jazyk SQL, který je z velké £ásti kompatibilní se standardem SQL92. K databázi p°istupujeme p°es t°ídy balí£ku android.database.sqlite. Nástroje pro práci s touto databází jsou sou£ástí Android SDK dostupné p°es adb, m¥ samotnému se v²ak osv¥d£il nástroj SQLite Spy [24], který má uºivatelské rozhraní. ladící nástroj p°ív¥tivé 4.6 OpenGL ES Hardware mobilních telefon· dne²ka je dostate£n¥ výkonný pro provozování náro£ných multimediálních a grackých systém·. ipy v telefonech jsou dnes b¥ºn¥ schopné akcelerovat 3D graku. Na mobilní za°ízení byla vytvo°ena vlastní verze grackého standardu OpenGL, nazvaná OpenGL ES (for Embedded Systems). Ve verzích od Androidu 1.6 po 2.1 je nyní podporována verze OpenGL ES 1.0, která se p°ekrývá s moºnostmi klasické OpenGL 1.3 [1]. Tato vlastnost je zajímavá zejména pro herní vývojá°e a s ním spojený rozvíjející se trh mobilních her. Na Androidu nalezneme OpenGL ES v balí£ku android.opengl. 4.7 Android Native Development Kit (Android NDK) Výkon virtuálního stroje Dalvik m·ºe být v mnoha ohledech omezující. V p°ípad¥, ºe pot°ebujeme vytvá°et aplikace, které jsou kritické na výkon, tak je moºné p°evedení £ásti výpo£etní logiky aplikace do nativního kódu, který je psán v jazyce C nebo C++ a p°eloºen p°ímo do kódu p°íslu²ného procesoru. Ztrácíme výhodu snadné p°enositelnosti aplikace, ale získáme podstatn¥ vy²²í výkon. Prost°edí Android NDK získáme op¥t ze stránek Android Developers [1]. V dob¥ psaní této práce jsou v Android NDK podporovány pouze procesory ARM. Prost°edí obsahuje hlavi£ky základních knihoven pro jazyk C/C++, hlavi£ky dal²ích knihoven, hlavi£ky OpenGL ES 1.x a 2.0 a sadu p°eklada£·. Sou£ástí je i n¥kolik vzorových aplikací. 4 MONOSTI APLIKANÍHO FRAMEWORKU 41 4.8 WebKit, HTML5 a tvorba mobilních webových aplikací Jádro Webkit integrované v Androidu je velmi moderní s podporou nejnov¥j²ích webových technologií. Stejné jádro se pouºívá nap°íklad v prohlíºe£ích Chrome a Safari na osobních po£íta£ích a v prohlíºe£i Safari v za°ízeních s opera£ním systémem iPhone OS a nelezneme jej i v za°ízeních se systémem Symbian. Podporuje v²echny podstatné d·leºité funk£nosti jako je JavaScript a CSS. Je v nasnad¥, ºe díky tomu m·ºeme vytvo°it webovou aplikaci, která bude kompatibilní se za°ízeními se zcela odli²nými opera£ními systémy, jak s mobily tak s osobním po£íta£em. Velký rozvoj aplikací zaloºených na JavaScriptu a AJAXu v dne²ní dob¥ zvy²uje ²ance, ºe by webové prohlíºe£e jednoho dne mohly zcela nahradit opera£ní systém. Bohuºel zde do stále existuje omezení na nutné a trvalé p°ipojení do internetu, provoz lokálních webových aplikací zatím závisí na pokra£ující implementaci nového webového standardu HTML5 [25]. Ve kterém jsou nov¥ specikány d·leºité funkce jako je rozhraní pro ur£ování polohy za°ízení, práce s lokální databází a podpora pro lokální oine aplikace. N¥které funk£nosti jsou jiº prohlíºe£em v Androidu podporovány, jiné lze realizovat p°es rozhraní Google Gears [26], které by m¥lo být do budoucna zcela nahrazeno HTML5. V dob¥ psaní této práce není standard HTML5 stále dokon£en a r·zné prohlíºe£e implementují jen £ásti z tohoto standardu. Pokud budeme chtít vyvíjet webové aplikace orientované p°ímo pro prost°edí Android, je pro programátora dostupný webový pohled t°ídy (viz. také PrikladIntenty android.webkit.WebView na CD - p°íloha A). Díky n¥mu je moºné webové aplikace integrovat p°ímo do Androidích aplikací. Zajímavý zp·sob se pak nabízí s vyuºitím metody addJavascriptInterface(), kde je moºné Javový objekt v aplikaci ex- portovat do JavaScriptu a volat na n¥m p°íslu²né metody p°ímo z JavaScriptu. Moºnosti tohoto zp·sobu jsou velmi zajímavé a je tak moºné vyuºívat funk£ností Androidu p°ímo z JavaScriptu. 42 Záv¥r Android je bezpochyby zajímavým po£inem na poli mobilních opera£ních systém·. Je systémem s otev°eným zdrojovým kódem, díky tomu p°iná²í výrobc·m mobilního hardware a software vysokou exibilitu p°i vývoji svých produkt·. V první kapitole jsem p°iblíºil výhody a nevýhody prost°edí pro b¥h aplikací zaloºeném na virtuálním stroji Dalvik, jeho souvislosti a rozdíly s prost°edím a virtuálním strojem Javy pouºívaným na osobních po£íta£ích. Tento rozdíl spo£ívá v odli²né instruk£ní sad¥ virtuálního stroje a jeho optimalizaci pro provoz na mobilních za°ízeních. Zárove¬ v²ak není tak výrazn¥ omezený jako virtuální stroje Javy ME. V druhé kapitole jsem shrnul základní principy pouºité p°i vývoji aplikací. Zejména pak rozd¥lení aplikace na aktivity, sluºby a p°ijíma£e vysílání. Dal²í významnou £ástí této kapitoly je popis systému intent·, univerzálních zpráv p°edávaných mezi aktivitami, které ur£ují, jaká data a jak je má aktivita zpracovávat. Systém intent· p°iná²í moºnost nahradit jednotlivé aplikace systému aplikacemi zcela vlastními, vlastnost v jiných systémech zcela nevídaná nebo dokonce neºádoucí. P°ehledný popis grackého uºivatelského rozhraní s ohledem na pouºití jednotlivých prvk· GUI byl obsahem t°etí kapitoly. V poslední kapitole jsem popsal moºnosti aplika£ního frameworku, jeho vyuºití ke tvorb¥ interaktivních aplikací roz²í°ené reality, aplikací s 3D grakou a webových aplikací. Nastínil jsem zde d·leºité moºnosti platformy jako takové, tato £ást je ur£ena zejména pro orientaci v této problematice, protoºe není popsána do detail· implementace jako ostatní kapitoly. Sada p°íklad· dodaných na CD v p°íloze A obsahuje zdrojové kódy, které názorn¥ ukazují pouºití základních princip· Androidu, které jsou obsahem prvních t°í kapitol. 43 Conclusion Android is doubtless very interesting mobile operating system. Its open-source nature brings great exibility to the software and hardware manufacturers. In the rst chapter I described advantages and disadvantages of Dalvik virtual machine and its simmilarities and dissimilarities with Java virtual machine that is commonly used on desktop computers. This dierence lies in dierent instruction set of the Dalvik virtual machine and its optimization for mobile devices. However Dalvik is not so limited as Java ME virtual machines. In the second chapter I brought together basic principles that are used in application development on Android, especially activities, services and broadcast receivers. Another important part of this chapter is description of the system of intents, messages passed on between activities that specied what data and how the data is processed. The intent system brings capability of replacing any system application with your own. This capability is very uncommon or unwanted in other mobile operating systems. The third chapter contained transparent overview of graphical user interface on Android and usage of each one of the GUI components. In the last chapter I described capabilities of application framework and its usage to developing of interactive applications with augmented reality, 3D applications and web applications. This part was intended to be a guideline for orientation in this issue. The set of exapmples in Appendix A contains source codes that illustrate use of key Android principles. SEZNAM LITERATURY A ZDROJ 44 Seznam literatury a zdroj· Android Open Source Project. <http://developer.android.com/> [1] Open Handset Alliance: URL Kv¥ten 2010. HTC Dream. <http://en.wikipedia.org/wiki/HTC_Dream> [2] Wikipedia: URL List of Android devices. <http://en.wikipedia.org/wiki/HTC_Dream> [3] Wikipedia: URL [4] [5] [6] [7] [8] Embedded Linux Wiki. Leden 2010. URL <http://elinux.org/Android_Kernel_Features> iPhone OS Overview. 2009. URL <http://developer.apple.com/iphone/library/ referencelibrary/GettingStarted/URL_iPhone_OS_ Overview> S60 5th Edition C++ Developer's Library v2.1. 2009. URL <http://library.forum.nokia.com/topic/ S60_5th_Edition_Cpp_Developers_Library/ GUID-07F7CEA3-DC49-40E1-B313-5AAC1A5A3F8D_cover.html> MicroEmulator 2.0.4 [software]. Leden 2010. URL <http://www.microemu.org/> J2ME Runner [Android aplikace]. URL <http://www.netmite.com/android/> [9] Sayed Y. Hashimi, S. K.: [10] Pro Android. Apress, 2009. Dalvik Virtual Machine. 2007. URL <http://www.netmite.com/android/mydroid/dalvik/ docs> [11] Tim Lindholm, F. Y.: The Java Virtual Machine Specication. Druhé vydání, 1999. URL <http://java.sun.com/docs/books/jvms/> ClassFileAnalyzer 0.7.0 [software]. Kv¥ten 2010. <http://classfileanalyzer.javaseiten.de/> [12] Roeder, H.: URL SEZNAM LITERATURY A ZDROJ [13] [14] 45 Dedexer 1.11 [software]. URL <http://dedexer.sourceforge.net/> Android's Dalvik to be JIT boosted. Listopad 2009. URL <http://www.h-online.com/open/news/item/ Android-s-Dalvik-to-be-JIT-boosted-861870.html> Android SDK [software]. <http://developer.android.com/sdk/index.html> [15] Open Handset Alliance: URL Eclipse [software]. <http://www.eclipse.org/> [16] The Eclipse Foundation: URL [17] [18] 2010. QEMU [software]. URL <http://wiki.qemu.org/Main_Page> JUnit [testovací framework]. URL <http://www.junit.org/> [19] Burnette, E.: form. Hello, Android: Introducing Google's Mobile Development Plat- Pragmatic Bookshelf, 2009. [20] Guilfoyle, J.: Axml2xml, Tool to read Android binary XML les [software]. B°ezen 2008. <http://devtcg.blogspot.com/2008/03/ tool-to-read-android-binary-xml-files.html> URL GPS accuracy and Layar usability testing. Únor 2010. URL <http://stedelijk.medialab.hva.nl/files/2010/02/ GPS-test-15-03-2010.pdf> [21] MediaLAB Amsterdam: [22] Christopher Drane, M. M.; Scott, C.: Positioning GSM Telephones. munications Magazine, [23] [24] IEEE Com- Duben 1998. SQLite 3.x [software]. 2010. URL <http://www.sqlite.org/> SQLite Spy [software]. Prosinec 2009. URL <http://www.yunqa.de/delphi/doku.php/products/ sqlitespy/index> HTML5 W3C Working Draft. Kv¥ten 2010. <http://www.w3.org/TR/html5/> [25] World Wide Web Consortium (W3C): URL SEZNAM LITERATURY A ZDROJ 46 Google Gears [API]. 2010. <http://gears.google.com/> [26] Google, Inc.: URL N¥které obrázky v této práci jsou p°evzaty z práce vytvo°ené a sdílené v Android Open Source Project [1] a uºité ve smyslu podmínek Creative Commons 2.5 Attribution License. SLOVNÍK POJM A ZKRATEK 47 Slovník pojm· a zkratek 3G - sít¥ t°etí generace, jinak také International Mobile Telecommunications-2000, nové mobilní telekomunika£ní standardy °e²ící zvy²ující se poºadavky na rychlosti datových sluºeb AJAX - asynchronous JavaScript and XML, v podstat¥ se jedná o asynchroní komu- nikaci z JavaScriptu se serverem p°es HTTP protokol aktivita API - samostatná £ást aplikace °e²ící vlastní funk£ní logiku aplikace Application Programming Interface (Aplika£ní programové rozhraní) aplika£ní framework - soubor knihoven ur£ených k vývoji aplikací, s p°esn¥ deno- vanými rozhraním a t°ídami, které zna£n¥ urychlují vývoj ARM - Advanced RISC Machine, architektura procesor· pouºívaná zejména v mo- bilních za°ízeních. Stejnojmenná spole£nost pak vlastní práva na návrhy t¥chto procesor·. AVD - Android Virtual Device, emulované za°ízení s Androidem, lze nastavit na r·zné parametry, zejména r·zná rozli²ení displeje bytecode CPU - soubor instrukcí vykonávaných virtuáním strojem (nap°. Java VM, Dalvik,...) Central Processing Unit, základní jednotka po£íta£e, vykonává vlastní instrukce programu CRUD - create, read, update,delete - základní operace pro práci s daty v databázi nebo jiném úloºi²ti Dalvik DDMS - virtuální stroj, ve kterém b¥ºí na Androidu ve²keré aplikace Dalvik Debug Monitor Server, ladící nástroj v prost°edí Eclipse, slouºící k monitorování Androidu a jeho virtuálního stroje Dalvik distribuce opera£ního systému - opera£ní systém (jeho jádro) v£etn¥ dodávaných aplikací, zejména se s tímto pojmem setkáváme u Linuxu EDGE - Enhanced Data rates for GSM Evolution, vylep²ená forma datové sluºby nad GSM sítí FreeType - otev°ená knihovna pro vykreslování TrueType font· SLOVNÍK POJM A ZKRATEK gadget - 48 speciální v¥t²inou jednoú£elové aplikace, zobraující se na pracovní plo²e, je moºné je r·zn¥ po plo²e posouvat getter, setter - sady metod na t°íd¥ slouºících ke £tení a zápisu prom¥nných svázaných s objektem Google - americká spole£nost stojící zejména za stejnojmeným internetovým vyh- ledáva£em, v poslední dob¥ se orientuje na mnohé jiné produkty, zejména pak vývoj opera£ního systému Android, £len OHA GPRS GPS - General Packet Radio Service , datová sluºba postavená nad sítí GSM Global Positioning System, americký satelitní naviga£ní systém, dokáºe ur£it polohu za°ízení s p°esností aº 5m GUI - Graphical User Interface, gracké uºivatelské rozhraní HTC - £ínský výrobce mobilních telefon·, £len OHA, specializující se na platformy Windows Mobile a Android instruk£ní sada - soubor p°íkaz· (instrukcí) zpracovávaných procesorem, zejména se jedná o aritmetické instrukce, instrukce pro práci s pam¥tí a komunikaci s okolím procesoru intent - zpráva p°edávaná v Androidu mezi aktivitami, v podstat¥ °íká, co chceme ud¥lat a systém se nám sám p°izp·sobí volbou správné akce a spu²t¥ním správné aktivity. iPhone OS Java - mobilní opera£ní systém pouºívaný rmou Apple objektov¥ orientovaný programovací jazyk, se silným statickým typováním Java ME - Java Microedition, platforma pro b¥h aplikací na n¥kterých mobilních telefonech Java package - logické seskupení t°íd a rozhraní v jazyce Java do jednoho celku, slouºí primárn¥ k zp°ehledn¥ní a organizaci kódu JavaScript - programovací jazyk pouºívaný zejména ve webovém prohlíºe£i pro funkcionalitu webových aplikací na stran¥ klienta JIT kompilace - Just-in-time kompilace p°ekládá p°ímo za b¥hu programu instrukce virtuálního stroje na instrukce fyzického procesoru daného za°ízení SLOVNÍK POJM A ZKRATEK JNI 49 - Java Native Interface, rozhraní, které umoº¬uje p°ímé volání funkcí napsaných v nativním kódu z kódu b¥ºícího ve virtuálním stroji jádro opera£ního systému (kernel) - základní £ást OS starající se mj. o alokaci pam¥ti, p°ístup k hardware, °ízení proces· a práci se souborovým systémem libc - GNU C knihovna, obsahuje v²echny pot°ebné základní funkce pro aplikace Linux - open-source unix-like opera£ní systém, snaºí se být kompatibilní s unixovými systémy listener - na n¥jakou událost, nap°íklad kliknutí my²i zaregistruji na grackém prvku t°ídu, která má metody, které obslouºí danou událost machine code - strojový kód, soubor instrukcí vykonávaných fyzickým procesorem (nap°. ARM, x86,...) manifest - XML soubor popisující konguraci aplikace vzhledem k za°ízení Media Framework - knihovny pro práci se zvukem, obrázky a videem + kodeky (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) MIME a Content typy OHA - - specikují ú£el a typ p°ená²ených dat Open Handset Alliance open-source - Pod open-source se ozna£ují zpravidla softwarové produkty, které jsou ²í°eny spolu se zdrojovým kódem (£asto zdarma), podmínky modikace kódu a tvorba dal²ího software zaloºených na otev°eném kódu pak ur£uje opensource licence. Zpravidla je to dovoleno, n¥kdy pod podmínkou, ºe musí být zachována stejná licence, tedy nutnost stejn¥ otev°ít i kód va²eho software. OpenGL ES proces - knihovna pro nízkoúrov¬ovou 2D a 3D graku proces je instance po£íta£ového programu v pam¥ti, b¥ºn¥ v opera£ním sys- tému b¥ºí více proces· sou£asn¥ (multiprocessing) a m·ºe mezi nimi p°epínat (multitasking) QEMU - virtualiza£ní nástroj simulující kompletní po£íta£ Qualcomm - americký výrobce £ip· a procesor·, £len OHA, vyrábí ARM procesory architektury Snapdragon RESTu - Representational State Transfer, architektura p°ístupu k webovým zdroj·m s plným vyuºitím HTTP metod a specikací prost°edku pomocí URL SLOVNÍK POJM A ZKRATEK SDK - 50 Software development kit, sada nástroj· slouºících k vývoji software SGL - knihovna pro 2D graku singleton SMS - t°ída ke které m·ºe být vytvo°ená pouze jedinná instance objektu Short Message Service, komunika£ní sluºba postavená nad sítí GSM, pouºívá se k p°enosu krátkých textových zpráv mezi mobilními za°ízeními souborová databáze - databáze, kde jsou data uloºena v jedinném souboru, výhodou je tak moºnost rychle celou databázi p°enést z jednoho místa na druhé pouhým kopírováním souboru SQL - Structured Query Language, dotazovací jazyk pouºívaný k získávání dat z databáze a také k jejich úprav¥ SQLite - knihovna pro práci s databází ve form¥ souboru, p°ístup k ní je zaji²t¥n p°es jazyk SQL SSL - Secure Sockets Layer, forma zabezpe£ené ²ifrované komunikace po síti Surface Manager - knihovna starající se o správné zobrazení 2D a 3D vrstev z r·zných aplikací Symbian - mobilní opera£ní systém pouºívaný zejména rmou Nokia T-Mobile - mobilní operátor p·sobící v mnoha zemích, majoritním vlastníkem je Deutsche Telekom AG, jeden z £len· OHA, pod jeho zna£kou byl vydán první komer£ní telefon s Androidem, T-Mobile G1 tag - je jednotka struktury v textové reprezentaci XML, nap°. <b>test</b> unit testy - druh automatických test· na úrovni kódu programu, který testuje jed- notlivé t°ídy nebo knihovny (jednotky - units), které jsou v programu pouºívány UNIX, unix-like - UNIX je registrovaná obchodní známka pro n¥které opera£ní sys- témy vycházející z p·vodního UNICS systému vyvinutého v Bellových laborato°ích v roce 1969, unix-like systémy jako je Linux se snaºí být maximáln¥ kompatibilní s ostatními UNIXy a unix-like systémy URI - Uniform resource identier, textový °et¥zec identikující n¥jaký prost°edek, jak v internetu, tak v n¥jakém lokálním umíst¥ní, nap°. http://www.seznam.cz URL - Uniform Resource Locator, je URI, která ur£uje umíst¥ní prost°edku, nej£ast¥ji se s ní setkáme na webu ve form¥ webové adresy SLOVNÍK POJM A ZKRATEK URN - 51 Uniform Resource Name, je forma URI, která jednozna£n¥ identikuje pomocí jména n¥jaký prost°edek USB - Universal Serial Bus, sériové rozhraní pro p°ipojování periferií k po£íta£i userspace access - uºivatelský p°ístup, prostor pro b¥h aplikací v unixových sys- témech, kde je aplikace zna£né omezena ve svém p°ístupu k systému virtuální metoda - metoda, jejíº chování je ur£eno na základ¥ typu objektu aº p°i b¥hu programu virtuální stroj (virtual machine, VM) - softwarová simulace jiného procesoru s vlastní instruk£ní sadou vlákno - £ást programu ur£ená pro soub¥ºný (paralelní) b¥h, sdílí s programem pam¥´, proto je t°eba dbát o kontrolu p°ístupu ke sdíleným zdroj·m WebKit - jádro webového prohlºe£e, které je standardní sou£ástí Androidu webová sluºba - aplika£ní programové rozhraní (API) zp°ístupn¥né p°es webový protokol HTTP X server - protokol pro vykreslování grackého uºivatelského systému pouºívaný na UNIXech a unixových systémech x86 - architektura procesor· vycházející z p·vodního návrhu procesoru Intel 8086, pouºívaného v po£íta£ích IBM PC XML ZIP - Extensible Markup Language, jazyk pro strukturovanou reprezentaci dat známý kompresní formát, pouºívá se jak pro JAR balí£ky, tak pro APK balí£ky SEZNAM OBRÁZK 52 Seznam obrázk· 1 High-level pohled na architekturu Androidu [1] . . . . . . . . . . . . 3 2 P°íklad instrukcí Java VM vs. Dalvik VM . . . . . . . . . . . . . . . 6 3 Emulátor Androidu . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4 Vývojové prost°edí Eclipse . . . . . . . . . . . . . . . . . . . . . . . 8 5 Debug kongurace . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6 ivotní cyklus aktivity [1] . . . . . . . . . . . . . . . . . . . . . . . 13 7 Vztahy aktivit a intent· . . . . . . . . . . . . . . . . . . . . . . . . 15 8 Vyvolání implicitního intentu pro prohlíºení odkazu . . . . 19 9 Povolení p°ístupových práv p°i instalaci . . . . . . . . . . . . . . . . 21 10 Text a textové pole . . . . . . . . . . . . . . . . . . . . . . . . . . 31 11 Varianty tla£ítek . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 12 ListView v 13 Systém notikací v Androidu PrikladProvideru http:// . . . . . . . . . . . . . . . . . . . . . . 33 . . . . . . . . . . . . . . . . . . . . . 34 14 Nabídka voleb a podnabídka . . . . . . . . . . . . . . . . . . . . . . 36 15 R·zné typy dialog· . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 SEZNAM TABULEK 53 Seznam tabulek 1 Adresá°ová struktura Android projektu . . . . . . . . . . . . . . . . 9 2 Typy zdroj· . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3 P°íklady alternativních zdroj· . . . . . . . . . . . . . . . . . . . . . 27 4 Multimediální formáty podporované Androidem [1] . . . . . . . . . . 39 A PÍLOHA - CD 54 A P°íloha - CD Sou£ástí práce je CD s následujícím obsahem: /android-1.6-src - adresá° obsahující zdrojové kódy AOSP verze 1.6, vhodné pro studijní ú£ely /android-xmldump - adresá° obsahující XML zdroj· a manifesty AOSP + skript Axml2xml [20], vhodné pro studijní ú£ely /bakalarka-src - zdrojové kódy této práce v LYXu, soubory BibTex a obrázky pouºité v této práci /bakalarka-ucla111.pdf /priklady /tools - bakalá°ská práce v PDF formátu - *.apk zkompilované verze p°íklad· - Android SDK a Eclipse /workspace/PrikladIntenty /workspace/PrikladMenu - p°íklad na intenty - p°íklad na nabídky a dialogy /workspace/PrikladProvideru /workspace/PrikladVlakna - p°íklad na £tení poskytovatele obsahu - p°íklad na vlákna a notikace B P°íloha - P°íklad souboru manifestu <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="com.google.android.core" android:signature ="com.google" package="com.google.android.maps"> <permission android:label="@string/read_perm_label" android:name=" com.google.android.maps.permission.READ_MY_MAPS" android:description="@string/read_perm_desc" /> <permission android:label="@string/write_perm_label" android:name= "com.google.android.maps.permission.WRITE_MY_MAPS" android:description="@string/write_perm_desc" /> <uses-permission android:name="android.permission.READ_CONTACTS" / > <uses-permission android:name="com.google.android.maps.permission. READ_MY_MAPS" /> B PÍLOHA - PÍKLAD SOUBORU MANIFESTU 55 <uses-permission android:name="com.google.android.maps.permission. WRITE_MY_MAPS" /> <uses-permission android:name="android.permission.ACCESS_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission. ACCESS_ASSISTED_GPS" /> <uses-permission android:name="android.permission.ACCESS_CELL_ID" /> <application android:theme="@android:style/Theme.Dark" android:icon="@drawable/ic_launcher_maps" android:taskAffinity= "com.google.android.maps"> <activity android:label="@string/maps_label" android:name="Maps" android:launchMode="singleTop"> <intent-filter android:label="@string/maps_label"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:label="@string/maps_label"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/postaladdress" /> </intent-filter> <intent-filter android:label="@string/google_maps_label"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" / > <data android:scheme="geo" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" / > <data android:scheme="http" android:host="maps.google.com" android:path="" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" / > B PÍLOHA - PÍKLAD SOUBORU MANIFESTU 56 <data android:scheme="http" android:host="maps.google.com" android:path="/maps" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <activity android:label="@string/my_maps_label" android:name=" MyMapsActivity" /> <provider android:name=".provider.MapsProvider" android:readPermission="com.google.android.maps.permission. READ_MY_MAPS" android:writePermission="com.google.android. maps.permission.WRITE_MY_MAPS" android:process="com.google. process.content" android:authorities="maps" android:syncable= "false" /> </application> </manifest>