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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 UšIVATELSKÉ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 MOšNOSTI APLIKAƒNÍ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 MOšNOSTI APLIKAƒNÍ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 MOšNOSTI APLIKAƒNÍ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 MOšNOSTI APLIKAƒNÍ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>