Você está na página 1de 153

UNIVERZITET U BEOGRADU

FAKULTET ORGANIZACIONIH NAUKA


LABORATORIJA ZA ELEKTRONSKO POSLOVANJE

RAZVOJ APLIKACIJA ZA
OPERATIVNI SISTEM ANDROID

Beograd, oktobar 2012.

Sadraj

Razvoj aplikacija za operativni sistem Android

1.

Osnove Android platforme............................................................................... 6


1.1.

Istorija razvoja Android sistema.................................................................7

1.1.1.

Android 1.0/1.1.................................................................................... 8

1.1.2.

Android 1.5 ("Cupcake)......................................................................9

1.1.3.

Android 1.6 (Donut)..........................................................................9

1.1.4.

Android 2.0/2.1 (Eclair)..................................................................10

1.1.5.

Android 2.2 (Froyo).........................................................................12

1.1.6.

Android 2.3 (Gingerbread)..............................................................14

1.1.7.

Android 2.4 (Gingerbread, Ice-Cream?).......................................15

1.1.8.

Dalji razvoj Android sistema..............................................................15

1.1.9.

Android 3.0 (Honeycomb)...............................................................16

1.1.10. Android 3.1........................................................................................ 16


1.1.11. Android 3.2........................................................................................ 16
1.1.12. Android 4 (Ice Cream Sandwich)....................................................17
1.1.13. Android 4.1 (Jelly Bean).....................................................................17
1.2.

Funkcionalnosti Android OS.....................................................................17

1.3.

Arhitektura Android sistema....................................................................19

1.3.1.

Linux jezgro....................................................................................... 20

1.3.2.

Izvorne programske biblioteke...........................................................20

1.3.3.

Radno okruenje Android Runtime (Dalvik Virtual Machine)..............20

1.3.4.

Application Framevork.......................................................................21

1.3.5.

Integrisani pretraiva.......................................................................22

1.3.6.

Optimizovana grafika........................................................................22

1.3.7.

SQLite................................................................................................ 22

1.4.

Razvoj Android aplikacija.........................................................................22

1.4.1.
2.

3.

4.

Komponente aplikacija......................................................................23

Instalacija i postavljanje razvojnog okruenja................................................25


2.1.

Kreiranje nove Android aplikacije.............................................................37

2.2.

Fajl AndroidManifest.xml..........................................................................40

Aktivnosti i klasa Activity............................................................................... 43


3.1.

ivotni ciklus aktivnosti...........................................................................43

3.2.

Kreiranje aktivnosti.................................................................................. 47

Resursi u Android aplikacijama......................................................................52


4.1.

Upravljanje i pristup resursima................................................................53


2

Razvoj aplikacija za operativni sistem Android


4.2.

Tipovi resursa.......................................................................................... 54

4.3.

Rad sa resursima..................................................................................... 55

4.3.1.

Rad sa stringovima............................................................................55

4.3.2.

Rad sa nizom stringova.....................................................................55

4.3.3.

Rad sa Boolean i Integer resursima...................................................56

4.3.4.

Rad sa bojama................................................................................... 57

4.3.5.

Rad sa resursima koji se crtaju..........................................................57

4.3.6.

Rad sa menijima................................................................................ 58

4.3.7.

Rad sa fajlovima................................................................................ 60

4.3.8.

Rad sa rasporedom (Layout).............................................................61

4.3.9.

Rad sa stilovima................................................................................ 62

4.3.10. Rad sa temama................................................................................. 63


4.4.
5.

Referenciranje sistemskih resursa...........................................................64

Elementi korisnikog interfejsa......................................................................65


5.1.

XML layout............................................................................................... 66

5.2.

Layouts.................................................................................................... 68

5.2.1.

LinearLayout...................................................................................... 68

5.2.2.

RelativeLayout................................................................................... 71

5.2.3.

TableLayout....................................................................................... 73

5.2.4.

GridView............................................................................................ 76

5.2.5.

TabLayout.......................................................................................... 79

5.2.6.

ListView............................................................................................. 82

5.3.

Meniji....................................................................................................... 84

5.3.1.

Meni opcija........................................................................................ 85

5.3.2.

Kreiranje kontekstualnih menija........................................................87

5.3.3.

Kreiranje kretajueg kontekstualnog menija.....................................88

5.3.4.

Iskaui meni..................................................................................... 89

5.3.5.

Kreiranje meni grupa.........................................................................89

5.4.

Dogaaji u okviru korisnikog interfejsa..................................................91

5.4.1.
5.5.

Event listeners................................................................................... 92

Rad sa obavetenjima Notifications......................................................96

5.5.1.

Toast notifikacije................................................................................ 97

5.5.2.

Status bar notifikacije........................................................................98

5.5.3.

Dialog notifikacije.............................................................................. 98

5.6.

Dijalozi..................................................................................................... 99
3

Razvoj aplikacija za operativni sistem Android

6.

5.6.1.

Kreiranje AlertDialog-a....................................................................100

5.6.2.

Kreiranje dijaloga sa sopstvenim layout-om....................................100

5.6.3.

Druge vrste dijaloga........................................................................101

Intents.......................................................................................................... 101
6.1.

Vrste Intent-a......................................................................................... 104

6.1.1.

Intent filteri...................................................................................... 105

6.1.2.

Primer belenice.............................................................................. 109

6.2.

7.

Intents primeri....................................................................................... 114

6.2.1.

Slanje podataka novoj aktivnosti.....................................................116

6.2.2.

Vraanje podataka iz aktivnosti.......................................................116

Rad sa servisima Services.........................................................................117


7.1.

ivotni ciklus Servisa............................................................................. 118

7.2.

Kreiranje servisa.................................................................................... 119

7.3.

Implementacija udaljenog interfejsa......................................................123

8.

Skladitenje podataka.................................................................................. 125


8.1.

Zajednika podeavanja........................................................................125

8.2.

Interne memorije................................................................................... 127

8.3.

Skladitenje podataka na spoljanoj memoriji.......................................128

8.4.

Rad sa bazom podataka SQLite.............................................................129

9.

8.4.1.

Kreiranje SQLite baze podataka.......................................................129

8.4.2.

Kreiranje tabela............................................................................... 129

8.4.3.

Unos, promena i brisanje podataka iz tabele...................................130

8.4.4.

Unos podataka insert()..................................................................130

8.4.5.

Promena podataka update().........................................................131

8.4.6.

Brisanje podataka delete()............................................................131

8.4.7.

Rad sa transakcijama......................................................................131

8.4.8.

Upiti SQLite baze podataka.............................................................132

8.4.9.

Brisanje tabela i ostalih SQLite objekata.........................................133

Internet........................................................................................................ 134
9.1.

10.

HttpURLConnection................................................................................ 134
Lokacije i mape......................................................................................... 137

10.1.

Lokacijski servisi................................................................................. 137

10.2.

Google Map eksterna biblioteka.........................................................140

Razvoj aplikacija za operativni sistem Android

1. Osnove Android platforme


Android je mobilni operativni sistem prvobitno razvijen od strane Android
kompanije, koju je kupio Gugl 2005. godine. Nakon kupovine, Gugl je
zatraio stvaranje Open Handset Alliance (OHA) udruenja, koja je sada
angaovana u pruanju podrke i dalji razvoj sistema. Android je zasnovan
na izmenjenoj verziji Linux jezgra. Prema istraivanjima kompanije Gartner
iz prve polovine 2012.god., najvei udeo na tritu imaju: Android,
Symbian OS, iOS, RIM (slika 1).

Slika 1.1. Trino uee mobilnih OS (Gartner, Jul 2012.)


U Avgustu 2012. Android je dostigao trini udeo od 66%. Danas je preko
400 miliona Android mobilnih ureaja aktivno na tritu
Vie od 200 ureaja razliitih proizvoaa koji rade na Android OS : HTC,
Samsung, Motorola, LG, Sonny Ericsson. Android OS se sastoji od 12
miliona linija koda, ukljuujui 3 miliona linija XML koda, 2,8 miliona linija C
koda, 2,1 miliona linija Java koda i 1,75 miliona linija C++ koda..
Android predstavlja softverski stek namenjen mobilnim telefonima koji u
sebi ukljuuje operativni sistem, posredniki softver kao i kljune aplikacije
5

Razvoj aplikacija za operativni sistem Android

za normalno funkcionisanje. Android SDK obezbeuje alatke i API koji su


neophodni za dalji razvoj aplikacija na Android platformi koristei JAVA
programski jezik.
Prvobitno razvijen od strane Android kompanije. Prva zvanina verzija
Android OS, razvijena u saradnji Google i OHA, lansirana je 2007 zajedno
sa osnivanjem Open Handset Alliance, udruenja 78 kompanija posveene
unapreenju otvorenih standarda za mobilne ureaje. Gugl je vei deo
Android koda objavio pod Apache licencom, licencom slobodnog softvera i
licencom otvorenog koda.
Shodno svojoj politici
programskog okruenja:

OHA

istie

sledee

karakteristike

Android

otvorenost - programeru omoguava potpunu slobodu u razvoju


novih i ve postojeih aplikacija, a proizvoau ureaja slobodno
korienje i prilagoavanje platforme bez plaanja autorskih prava;
sve aplikacije su ravnopravne - to znai da ne postoji razlika
izmeu osnovnih jezgarnih aplikacija ureaja i dodatnih aplikacija.
Svim aplikacijama omoguen je ravnopravni pristup resursima
pokretnog ureaja to daje mogunost prilagoavanja ureaja
specifinim potrebama individualnog korisnika;
automatsko upravljanje ivotnim ciklusom aplikacije omoguava nadzor pokretanja i izvravanja aplikacija na sistemskom
nivou optimizovanim korienjem memorije i snage ureaja. Krajnji
korisnik vie ne brine o gaenju odreenih aplikacija pre pokretanja
drugih;
uklanjanje granica "klasinih" aplikacija - mogunost razvoja
novih i inovativnih aplikacija zasnovanih na meusobnoj kolaboraciji
tehnologija;
brz i jednostavan razvoj aplikacija - omoguen je bogatom
bazom korisnih programskih biblioteka (eng. libraries) i alata za
izradu aplikacija;
visokokvalitetni grafiki prikaz i zvuk - podrana 2D
vektorska i 3D OpenGL (engl. Open Graphics Librari) grafika, te
ugraeni kodeci svih esto korienih audio i video formata;
kompatibilnost sa veinom sadanjeg i budueg hardvera ukljuuje prenosivost Androidovih aplikacija na ARM, k86 i ostale
arhitekture, te prilagodljivost sistema ulaznim i izlaznim
komponentama.

Razvoj aplikacija za operativni sistem Android

1.1.Istorija razvoja Android sistema


Jula 2005, Gugl kupuje malu kompaniju Android Inc. sa seditem u
Kaliforniji, SAD. U to vreme, o kompaniji se znalo veoma malo, osim da se
bavi razvojem softvera za mobilne telefone.Ova akvizicija je jasno
ukazivala da Gugl planira da ue na trite mobilnih telefona.
Sve do 5. Novembra 2007. razvoj novog operativnog sistema za mobilne
ureaje od strane Gugl korporacije svodilo se na pekulacije i nagaanja
ta su prave namere Gugl korporacije, mada se sa izvesnom dozom
sigurnosti znalo da Gugl priprema novi operativni sistem za ulazak na
mobilno trite. Tog dana svetu je predstavljena Open Handset Alliance
(OHA) koja je predstavljala konzorcijum vie kompanija koje su
predstavljale znaajne igrae na tritu mobilnih telefona, poput: Texas
Instruments, Broadcom, Google, HTC, Intel, LG, Motorola,
Qualcomm i mnogie druge kompanije. OHA je otkrila svetu svoj prvi
proizvod, Android, mobilnu platformu zasnovanu na Linux kernelu 2.6.
1.1.1.Android 1.0/1.1

Android OS

Prva verzija operativnog sistema Android (1.0)


predstavljena je u Septembru 2008. godine.
Android 1.0 je svoju premijeru doiveo na
telefonu kompanije HTC, koja je u sradnji sa
kompanijom Gugl razvila telefon koji e uspeno
realizovati poetne zadatke koje je nova
platforma imala. Jedini telefon koji je imao
Android verzije 1.0 bio je HTC Dream ili T-Mobile
G1.

Android 1.0 je patio od mnogih dejih bolesti, te je Gugl est meseci


kasnije izbacio novu verziju sistema koja je ispravila par kritinih
problema, podrku za glasovnu pretragu, mogunost plaenih aplikacija u
onlajn prodavnici (Market), ispravljene probleme u vezi sa servisom
Gmail i jo nekoliko sitnih prepravki. Ova aurirana verzija sistema bila je
Android verzije 1.1. Kao i prethodna verzija, ova verzija je bila namenjena
telefonu kompanije HTC, HTC Dream, koji je i dalje predstavljao telefon
namenjen programerima i inenjerima zaduenim za razvoj sistema, a i
korisnikih aplikacija.

Razvoj aplikacija za operativni sistem Android

1.1.2.Android 1.5 ("Cupcake)

Samo tri meseca kasnije, u Maju 2009. Gugl predstavlja novu verziju svog
operativnog sistema za mobilne ureaje, Android 1.5 koji je imao kodni
naziv Cupcake (mala torta).
Od ove verzije Gugl je svakoj novijoj verziji dodeljivao naziv nekog slatkia,
a skoriji dolazak nove verzije bio bi najavljivan
postavljanjem skulpture sledee poslastice
ispred sedita firme.
Nova verzija donela je znaajna poboljanja
sistema u vidu novih mogunosti kao to su:

Android 1.5 Cupcake

snimanje video sadraja


podrka za stereo blutut slualice

podesiva tastatura

prepoznavanje glasa

mogunost koja je pruena programerima da kreiraju sopstvene


aplikacije za poetni ekran (Home Screen), koje se nazivaju Videti
(Widgets).

Nova verzija sistema koja se prvobitno pojavila kao nadogradnja za


postojei HTC Dream, privukla je i druge proizvoae, tako da se u periodu
nakon pojave verzije 1.5 javlja veliki broj novih modela telefona koji su bili
pokretani Android operativnim sistemom.
1.1.3.Android 1.6 (Donut)

Nakon irokog prihvatanja Android operativnog


sistema od strane mnogih proizvoaa mobilnih
ureaja, koje je izazvala pojava verzije 1.5 bilo je
neophodno odrati korak sa konkurencijom koja je
napredovala na svakom polju. Gugl je bio svestan
stanja na tritu mobilnih ureaja i nastavio
strategiju konstantnog poboljanja i uvoenja
novih mogunosti svog sistema.
Android 1.6 (Donut)

Nova verzija nazvana Krofna (Donut), donela


je brojna poboljanja ve iroko prihvaenog operativnog sistema.
Promene u verziji 1.6 predstavljale su jasan znak da je Gugl ceo projekat
shvatio veoma ozbiljno.
Najznaajnija poboljanja u verziji 1.6 su:
8

Razvoj aplikacija za operativni sistem Android

Novi izgled Onlajn Prodavnice (Market) koji je omoguio


korisnicima laki pristup i bru pretragu eljenih aplikacija
Kameru i video kameru integrisanu u Galeriju, koja je sada
omoguavala izbor vie datoteka za istovremeno brisanje

Podrku za nove tehnologije kao to su: CDMA/EVDO, 802.1x i textto-speech

Podrku za navigacione aplikacije

Razna poboljanja po pitanju brzine, pretrage grafikog interfejsa,


itd.

Pored svih pozitivnih strana nove verzije sistema, polako je do izraaja


dolazio problem koji e pratiti Android operativni sistem sve do dananjih
verzija. Kako je Gugl za telefon za razvoj sistema izabrao HTC Dream i
sistem razvijao na osnovu mogunosti koje je taj telefon posedovao, prvi u
redu za auriranje sistema bio je upravo HTC Dream. Meutim, problem se
javio poto je veliki broj saradnika izbacio na trite svoje telefone sa do
tada aktuelnom verzijom sistema 1.5. Kako je svaki proizvoa prilagodio
Android okruenje svojim potrebama, odnosno izmenio okruenje tako da
odgovara mogunostima svojih modela, lako auriranje nije bilo mogue,
jer nova verzija sistema nije mogla da se primeni bez dodatne
manipulacije od strane proizvoaa.
Ovo je dovelo do usporavanja irenja nove verzije sistema, ak su se
pojavljivali novi modeli sa sada starom verzijom sistema. Neki od njih su i
danas ostali bez nadogradnje na novije verzije.
1.1.4.Android 2.0/2.1 (Eclair)

Kako je vreme prolazilo vremeni HTC Dream


je polako zaostajao za konkurencijom po
pitanju tehnikih mogunosti, naime imao je
preslab hardver za vreme koje je dolazilo.
Imajui u vidu dinamiku razvoja trita Gugl u
saradnji sa HTC korporacijom zapoinje razvoj
novog telefona koji e sluiti za razvoj
operativnog sistema i aplikacija.

Android
(Eclair)

Prvi telefon koji u oktobru dobija novu verziju operativnog sistema Android,
2.0/2.1 bio je ureaj kompanije Motorola, koji se nazivao Motorola Droid.
Ovaj telefon pokretala je nova verzija Android sistema 2.0
(Eclair).
Android 2.0 je smatran za prvu veliku nadogradnju sistema, koja je donela
znaajne promene kako po pitanju izgleda grafikog interfejsa, tako i po
pitanju brojnih novih mogunosti koje je nova verzija ukljuivala.

Razvoj aplikacija za operativni sistem Android

Promene koje je nova verzija donela su mnogobrojne, ali kao najbitnije se


mogu istai:
-

Podrka za Microsoft Exchange koji omoguava povezivanje


mobilnog telefona sa serverom koji kroz ovaj protokol omoguava
laku komunikaciju izmeu npr. firme i zaposlenog (mail, calendar,
outlook...)
Podrka za Facebook koja integrie ovu socijalnu mreu u kontakte
telefona

Poboljanja veb pretraivaa

Potpuno nova aplikacija za pretraivanje mapa (Google Maps), po


prvi put ova aplikacija omoguava pregled satelitskis snimaka na
mobilnom telefonu

Novi Jutjub (Youtube) videt koji omoguava brzo postavljanje


svojih snimaka na servere Jutjuba

Novi nain upravljanaj kontaktima koji omoguava znatno laki


pristup opcijama nego do tada...

Motorola Droid koja je imala procesor tek prosene snage, imala je zavidan
grafiki procesor, tako da su znaajne firme na polju 3D igara polako
poele da svoje naslove prilagoavaju sve jaim Android ureajima.

Google Nexus One

I pored predstavljanja novog modela telefona


sa novom verzijom operativnog sistema u
saradnji sa Motorolom, Gugl je nastavio
uporedni razvoj sopstvenog telefona koji e
biti naslednik tada ve legendarnog HTC
Dream telefana. Novi telefon bi trebalo da
omogui razvojnom timu kompanije Gugl, ali i
ostalim programerima da dalje unapreuje
svoj sistem i aplikacije koje su za njega namenjene.

Novi telefon Gugl je ponovo razvio u saradnji sa tajvanskom kompanijom


HTC, novi telefon predstavljao je poslednju generaciju tehnologije, telefon
je imao procesor iji je radni takt bio 1Ghz, imao je 576MB radne
memorije, podravao je microSD kartice veliine do 32GB, a to je
najbitnije, dolazio je sa najnovijom verzijom Android operativnog sistema
Android 2.1. Novi telefon se nazivao Google Nexus One.
Novi operativni sistem koji se pojavio sa pojavom novog Guglovog
telefona, nosio je oznaku 2.1, a kodni naziv je ipak zadran od strane
Gugla, tako da je bio isti kao i za Android 2.0 Eclair.
Android 2.1 je za razliku od prethodne verzije koja se nalazila jedino na
telefonu Motorola Droid, bio osnova za ogroman broj telefona koji su se
10

Razvoj aplikacija za operativni sistem Android

pojavljivali u sledeem periodu. Ova verzija sistema je masovno


prihvaena od svih proizvoaa telefona koji su bili ukljueni u Android
projekat i predstavlja prvu sledeu masovnu verziju nakon verzije 1.5.
I ako mnogi proizvoai nisu vrili nadogradnju 1.5 verzije na 1.6 ili pak 2.0
verziju operativnog sistema Android, ovog puta pripremali su nadogradnju
za ve realizovane mobilne ureaje na verziju 2.1.
Poboljanja koja su razdvajala Andorid 2.0 od verzije 2.1 su sledea:
-

Poboljana ukupna brzina sistema


Podrka za nove veliine ekrana i rezolucije istih

Novi grafiki interfejs web pretraivaa i podrka za HTML5

Podrka za blic za kameru

Digitalni zum

Podrku za registrovanje pokreta vie prstiju od jednom, tzv. Multitouch

Poboljana tastatura

Podrka za blutut verzije 2.1 (blutut transfer datoteka)

Live Wallpapers...

Nakon pojavljivanja Google Nexus One telefona, nastala je prava bujica


novih modela gde je vodeu ulogu imala kompanija HTC.
Ponovo do izraaja dolazi nemogunost centralizovanog auriranja sistema
od strane Gugla, ve je nova verzija ponovo morala da proe proces
prilagoavanaj od strane drugih proizvoaa. Ovaj nedostak uslovio je da i
do danas mnogi modeli nisu doiveli svoju premijeru na novom
operativnom sistemu, koji je sada ciljao mnogo monije telefone nego to
je do tada bio sluaj.
Nova verzija operativnog sistema donela je znaajna poboljanja po
pitanju 3D tehnologije, odnosno aplikacija. Pojavljivanje Android 2.0 koji je
pokrenuo razvoj kompleksnih 3D aplikacija za mobilne ureaje, bio je
dodatno ubrzan pojavom Android 2.1 sistema.
Po prvi put se ispred sedita firme jedna skulptura zadrava due od par
meseci, po prvi put prolo je 7 meseci pre nego to je Gugl predstavio
novu verziju, to je znailo samo jedno veliko poboljanje sistema.

11

Razvoj aplikacija za operativni sistem Android


1.1.5.Android 2.2 (Froyo)

Nakon dueg perioda bez ikakvih vesti o


novoj reviziji operativnog sistema Android,
ispred sedita firme, zvanino je postavljena
skulptura smrznutog jogurta (Froyo) to je
znailo da je nova verzija sistema spremna i
da je Guglov ureaj (Nexus One) bio
spreman da novi sistem pokrene. Mnogi su
novu verziju predstavljali kao apsolutnu
revoluciju sistema koja e Android postaviti
na lidersku poziciju na tritu mobilnih
telefona.
Android 2.2 predstavljen na Gugl samitu u
Maju 2010. godine, sadrao je najveu listu poboljanja koja je neka verzija
sa svojom pojavom donela, ali moda najzaajniju od svih, ono poboljanje
koje
je
Android
distanciralo
od
Android 2.2 (Froyo)
konkurentskih operativnih sistema jese
podrka za fles animacije (Flash animation) koja je implementirana u
saradnji sa kompanijom Adobe.
Poboljanaj koja su ukljuena u novoj verziji su:
-

Veliko poveanje ukupne brzine sistema, optimizacija korienja


memorije
Dodatno poveanje procesiranja aplikacija koja je ostvarena
primenom JIT (Just in Time) skripte

Integracija Chrome V8 JavaScript u veb pretraiva

Poboljana podrka za Microsoft Exchange

Mogunost deljenja internet konekcije sa drugim ureajima putem


USB ili WiFi konekcije (Tethering)

Opcija za brzo iskljuivanje mobilne mree

Nova onlajn prodavnica (Market) sa mogunou automatske


nadogradnje aplikacija

Podrka za upload preko veb pretraivaa

Podrka za instaliranje aplikacija na proirivu memoriju (microSD)

Podrka za Adobe Flash 10.1

Podrka za snimanje i prikazivanje videa u visokoj rezoluciji 720p...

12

Razvoj aplikacija za operativni sistem Android

Kao to je ve navedeno, pojavu nove verzije je svakako oznaila pojava


Adobe Flash playera na mobilnim ureajima, koja je bila pokretana od
strane grafikog procesora. Ova podrka je izazvala burne reakcije od
strane konkurenata, pre svega amerike kompanije Apple, koja nije elela
da u svoje ureaje implementira podrku za flash. Tada je nastao
svojevrsni medijski rati na relaciji Apple-Adobe i Apple-Google.
Proces koji je zapoet verzijom 2.1, nastavljen je proces migracije starih
verzija na aktuelnu. Ovog puta Gugl je imao neto drugaiji pristup, u
saradnji sa ostalim proizvoaima pronaen je nain da se bee vri
nadogradnja postojeih verzija na aktuelnu. Tako da su telefoni koji su
prvobitno lansirani sa verzijom 2.1, ubrzo dobili nadogradnju na 2.2 verziju
operativnog sistema.
Sa ovom verzijom Gugl prekida dalju proizvodnju i prodaju svog telefona
Google Nexus One, kako ne bi ugrozio svoje poslovne partnere i omoguio
prodaju telefona iskljuivo programerima koji su radili na razvoju aplikacija
za njihov operativni sistem.
Konano, Android je bio dovoljno konkurentan operativnom sistemu
kompanije Epl (Apple), tako da je velikom brzinom poeo da grabi trino
uee. Da bi krajem iste godine doao na lidersku poziciju i trenutno
zauzima najvei procenat aktivnih verzija Android mobilne platforme, a
Android lidersku poziciju na tritu mobilnih operativnih sistema uopte.

13

Razvoj aplikacija za operativni sistem Android

1.1.6.Android 2.3 (Gingerbread)

Ponovo se Gugl povlai i primiruje narednih 6


meseci, pre nego to se skulptura izloena
krajem Maja 2010. godine, ne zameni. 6.
Decembra 2010. godine osvanula je nova
maskota ispred prostorija firme, nova verzija
je bila spremna.
Uzmajui u obzir sve vee zahteva mobilnog
trita i dolaska u prvi plan elje korisnika
koje su nekad bile marginalne (poput 3D
igrica), Gugl u saradnji sa juno korejskom
kompanijom Samsung razvija novi telefon u
svrhe
razvoja sistema i aplikacija. Google
Android 2.3 (Gingerbread)
Nexus S je roen.Iako je prethodne verzije
tzv. Gugl telefona razvijao tajvanski HTC, Gugl je ovaj put izabrao Samsung
kako ne bi favorizovao nijednog od postojeih poslovnih partnera koji
uestvuju u konzorcijumu OHA.

Google Nexus S predstavljen je zajedno sa


najnovijom verzijom operativnog sistema
Android 2.3, koji nosi kodni naziv Medenjak
(Gingerbread).
Izneverivi mnoga oekivanja i pekulacije,
Android Gingerbread nije doao sa
oznakom 3.0 kako su mnogi oekivali, ve
2.3. Verzija 3.0 kako e se kasnije saznati
bila je rezervisana za ulazak Androida na novo trite, trote tablet
Google Nexus S
ureaja.
Poboljanaj koja su dola sa novom verzijom, u odnosu na prethodnu su
brojna, najznaajnija su sledea:
-

Redizajniran grafiki interfejs (UI)


Podrka za ekrane rezolucije vee od 800x480
VOIP podrka
Podrka za WebM/VP8 video
Podrka za NFC (Near Field Communication )
Unapreena copy/paste funkcija
Nova multitouch tastatura
Audio, video i grafika unapreenja namenjena za programere i
razvojne timove video igara
Dodata podrka za nove senzore poput iroskopa
14

Razvoj aplikacija za operativni sistem Android

Poboljana kontrola energije i aplikacija


Podrka za vie kamera
Zamena YAFFS EXT4 sistemom datoteka...

Do samita u Barseloni koji je zavren 18. Februara 2011. Google Nexus S,


bio je jedini telefon koji je pogonjen poslednjom verzijom operativnog
sistema. Trenutno aktuelna verzija je 2.3.3 koja je ispravila sistne
nedostatke prvobitne 2.3 verzije.
Ovde se za sada zavrava predstavljanje aktuelnih verzija operativnog
sistema za mobilne ureaje Android, u sledeem poglavlju bie opisane
nove najavljene verzije ovog sistema, kako za mobilne telefone, tako i za
tablet ureaje.
1.1.7.Android 2.4 (Gingerbread, Ice-Cream?)

Android 2.4 ?

Android 2.3 jo nije poteno zaiveo na mobilnim


ureajima (ureaji koji podravaju ovu verziju se
mogu nabrojati na prste jedne ruke), Gugl ve
najavljuje novu verziju svog operativnog sistema
namenjenim za mobilne telefone. Nagaanja govore
da e nova verzija najverovatnije zadrati isti kodni
naziv kao i prethodna, ili da e se nazivati Sladoled
(Ice-Cream), a da e se izmene pre svega odnositi
na podrku aplikacija koje su namenjene za Android
3.0.

Podrka se odnosi na mogunost pokretanja aplikacija koje su namenjene


za procesore sa vie jezgara, da se uspeno izvravaju na procesorima sa
jednim jezgrom, poto trenutna verzija to ne podrava.
Ipak, nova verzija se nee pojaviti do Aprila 2011. godine tako da se sve
informacije svode na pekulacije i nagaanaja.
1.1.8.Dalji razvoj Android sistema

Pojavom novih ureaja na tritu mobilnih ureaja, pre svega tablet


ureaja ija erupcia je nastala pojavom Eplovog (Apple) iPad reenja,
sve vei pritisak na Gugl vrili su poslovni partneri kojima je bilo
neophodno reenje operativnog sistema prilagoenog za rad na znatno
veim ekranima od onih koji su se nalazili na mobilnim telefonima. Neki
partneri nisu ekali na Gulg da prilagodi svoj sistem potrebama tablet
ureaja, ve su samostalno modifikovali do tada aktuelnu verziju Android
operativnog sistema 2.2.
Samsung je tokom 2010. godine predstavio svoj
prvi tablet, Galaxy Tab koji je pokretao Froyo sa
prilagoenim interfejsom posebno za tablet.
15

Razvoj aplikacija za operativni sistem Android

Iako je Gugl tvrdio da dosadanje verzije nisu prilagoene za rad sa tablet


ureajima, Galaxy Tab doivljava veliki trini uspeh, to dodatno pritiska
Gugl da ubrza razvoj novog sistema za te ureaje.
Samsung Galaxy Tab

1.1.9.Android 3.0 (Honeycomb)

26. Januara 2011. Premijerno je prikazan potpuno


novi operativni sistem Android verzije 3.0 koj nosi
kodni naziv Sae (Honeycomb) . Za sada
dostupan samo kao test verzija, ali se ve
pojavljuju ureaji pokretani ovim operativnim
sistemom.
Promene koje donosi novi operativni sistem se odnose pre svega na
prilagoenost veim ekranima i sannijim konfiguracijama
Android 3.0 (Honeycomb)
tablet ureaja:
-

Novi grafiko interfejs namenjen tablet ureajima


Radna povrina u tri dimenzije (3D) sa novim, redizajniranim
videtima
Novi nain simultanog izvravanja aplikacija (Multitasking)
Veb pretraiva napravljen posebno za potrebe tablet ureaja
Podrka za video askanje (Chat) koristei Gugl aplikaciju Google
Chat)
Interfejs koji se izvrava na nivou grafikog procesora (Hardware
Acceleration)
Podrka za proceore sa vie jezfara...

Motorola Xoom

1.1.10.

Prvi ureaj koji koristi novu verziju operativnog


sistema Android, 3.0 Honeycomb je Motorola
Xoom. Ovaj ureaj poseduje procesor sa dva
jezgra, nVidia Tegra2 proceor koji podrava
putanje videa u pravoj HD rezoluciji 1080p.
Ureaj ima i prednju kameru namenjenu za video
razgovore. Sve ovo bi trebalo da predstavi
oigledne prednosti u odnosu na konkurentski
Apple iPad koji ima nedostatak ovih mogunosti.

Android 3.1

Objavljen u Maju 2011., podrava dodatne tipove ulaznih ureaja, USB


host mode direktno sa kamera i drugih ureaja, Google Movies, Books
apps i sl.

16

Razvoj aplikacija za operativni sistem Android


1.1.11.

Android 3.2

Objavljen u Julu 2011. Dodatna optimizcaija za razliite veliine ekrana,


uitavanja media fajlova direktno sa SD kartice, itd.

1.1.12.

Android 4 (Ice Cream Sandwich)

4.0 Ice Cream Sandwich, objavljen u Oktobru 2011.


Nove funkcionalnosti: otkljuavanje telefona na
osnovu lica, upravljanje komunikacijom preko
mree, upravljanje aktivnostima na drustvenim
mreama na jednom mestu, poboljano upravljanje
fotografijama, pretraga mailova offline, app folder,
NFC. Poslednja stabilna verzija je Android 4.0.1.
1.1.13.

Android 4.1 (Jelly Bean)

Verzija Android 4.1 pod nazivom Jelly Bean od jula 2012.

1.2.Funkcionalnosti Android OS
Osnovne funkcionalnosti Android OS:
Prikaz na ureajima OS prilagoava izgled razliitim tipovima
ureaja i kompatibilian je sa 2D, 3D grafikim bibliotekama

Skladitenje podataka SQL lite relaciona baza podataka za


upravljanje podacima

Konektivnost Android podrava konektivnost sa svim standardnim


tehnologijama: GSM/EDGE, IDEN, CDMA, EV-DO, UMTS, Bluetooth,
Wi-Fi, LTE i WiMAX.

Razmena poruka SMS i MMS

Web browser WebKit browser, zasnovan na Chrome-u


17

Razvoj aplikacija za operativni sistem Android

Java support Android aplikacije se piu u Java programskom jeziku,


Dalvik virtuelna maina

Podrka za multimedijalne podatke - WebM, H.263, H.264, MPEG-4


SP, AMR, AMR-WB, AAC, HE-AAC, MP3, MIDI, Ogg Vorbis, WAV, JPEG,
PNG, GIF, BMP.

Streaming media support - RTP/RTSP streaming (3GPP PSS, ISMA),


HTML download (HTML5 <video> tag), Adobe Flash Streaming
(RTMP), HTTP Dynamic Streaming

Dodatna harderska podrka - kamera, touchscreen, GPS,


brzinometar, iroskop, magnetometar, senzori udaljenosti i pritiska,
termometri

Okruenje za razvoj Android Development Plugin

Trite GooglePlay je online katalog aplikacija koje se mogu


preuzeti i instalirati na Android ureaje, bez potrebe za raunarom.

Multi-touch mogunost ureaja da prepozna tri razliite pozicije


ulaznih dodira

Bluetooth

Video poziv

Multitasking multitasking aplikacija

Funkcionalnosti zasnovane na glasu Pozivanje, pretraga, navigacija


pomou glasa

Tethering Android telefon moe da se iskoristi kao wireless hotspot

18

Razvoj aplikacija za operativni sistem Android

1.3.Arhitektura Android sistema


Arhitektura Android sistema bazira se na Linux-u 2,6 jezgru (eng. kernel)
koja se koristi kao sloj apstrakcije hardvera (HAL, eng. Hardvare
Abstraction Laier). Razlog za korienje jezgra operativnog sistema Linux
je dokazana pogonska podrka (eng. driver model), mogunost upravljanja
memorijom i procesima, sigurnosni model, mreni sistem, te dokazana
robusnost, konstantni razvoj i unapreivanje sistema. Slika 1.2 prikazuje
arhitekturu Android sistema.
Sloj aplikacije
Kontakti

Standardne
aplikacije

Aplikacije
proizvoaa

Pretraiva

...

Okvir aplikac.
(Framework)
Upravljanje
aktivnostima

Upravljanje
prozorima

Provajderi
sadraja

Upravljanje
obavetenjima

Upravljanje
paketima

Upravljanje
resursima

Upravljanje
lokacijama

XMPP servis

Android
Runtime

Biblioteke
Surface
Manager

SQLite

FreeType

Biblioteke jezgra

WebKit

SSL

OpenGL|
ES

Dalvik virtuelna
maina

Linux Kernel

Drajveri za
displej

Drajveri za
kameru

Drajveri za
Bluetooth

Drajveri za fle
memoriju

Drajveri za USB

Drajveri za
tastaturu

WiFi drajveri

Audio drajveri

Slika 1.2. Arhitektura Android platforme

19

Razvoj aplikacija za operativni sistem Android

1.3.1.Linux jezgro

Najvaniji elementi jezgra su:


pogonski program za meuprocesnu komunikaciju izmeu aplikacija
i usluga (eng. service) (eng. Binder (IPC) Driver)

upravljanje napajanjem (eng. Pover Management) - komponenta


Androida temeljena na standardnom Linuxovom sistemu upravljanja
napajanjem.

1.3.2.Izvorne programske biblioteke

Izvorne programske biblioteke (eng. native libraries) pisane su u


programskim
jezicima
C i C++ i ine sledei sloj u arhitekturi sistema. Neke od znaajnijih su:
UI - program za upravljanje grafikim interfejsom (eng. Surface
Manager) - biblioteka odgovorna za pravilno iscrtavanje razliitih
aplikacionih komponenti u vremenu i prostoru;
OpenGL ES (eng. OpenGL for Embedded Sistems) - biblioteke koje
se koriste za hardversku 3D akceleraciju (ukoliko je podrana) ili za
3D rasterizaciju;
SGL (eng. Scalable Graphics Librari) - predstavlja 2D biblioteke na
kojima je zasnovana veina aplikacija. Spomenimo jo da se 2D i 3D
elementi mogu kombinovano prikazivati u jednom korisnikom
interfejsu;
Media Framevork - grupa kodeka za snimanje i reprodukciju audio
formata, video formata i nepominih slika. Omoguena je od strane
PacketVidea;
FreeTipe - biblioteka koja slui za vektorsku rasterizaciju oblika
pisma (eng. font);
SSL (eng. Secure Socket Laier) - omoguava rezervnu komunikaciju
preko Interneta;
SKLite - programska biblioteka koja implementira bazu podataka
(eng. database engine);
VebKit - Jezgro pretraivaa koji podrava JavaScript i ostale
standarde na malom ureaju;
Sistem C library - implementacija standardne C-ove sistemske
biblioteke (libc) izvedene iz operativnog sistema BSD.

20

Razvoj aplikacija za operativni sistem Android


1.3.3.Radno okruenje Android Runtime (Dalvik Virtual Machine)

Naredni sloj u arhitekturi Androida je radno okruenje (eng. Android


runtime) kojeg ine virtuelni maina Dalvik (DVM, eng. Dalvik Virtual
Machine)
i
jezgrene
biblioteke
(eng.
core
library).
DVM je registarski bazirana virtuelna maina, dok je klasina Javina
virtuelna maina (JVM, eng. Java Virtual Machine) baziran na steku. Bazne
biblioteke pisane su u programskom Jeziku Java i predstavljaju sve
esencijalne klase kao to su klase za manipulaciju kolekcijama, klase za
komunikaciju sa okolinom i slino. Bitna novost je i to to se Androidom
jezgrene biblioteke razlikuju od biblioteka u Java Standard Edition (J2SE) i
Java 2 Micro Edition (J2ME).
Umesto upotrebe standardnog Java 2 Micro Edition (J2ME) kao mehanizma
za pokretanje Javinih aplikacija na pokretnim ureajima, Google je razvio
sopstvenu virtuelnu maina za Android. DVM Je najverovatnije razvijen
kako bi se zaobila problematika s dozvolama korienjem Sunovog J2ME.
Svaki pokretni ureaj koji u sebi sadri J2ME mora kod Suna licencirati bilo
kakvu promenu izvornog koda J2ME-a.
Virtuelna maina Dalvik dobila je ime po istoimenom Islandskom gradu u
kojem su iveli preci glavnog developera DVM-a Dan Bornstein.
Osnovna razlika izmeu Sun Java virtuelnih maina i DVM-a je u tome to
su prvo spomenuti virtualni ureaju bazirani na steku, dok je DVM
registarski baziran virtuelni maina. Meukod (eng. bitecode) Dalvik
virtuelne maine transformie se pomou alata dk (koji je sastavni deo
Android SDK-a) iz Javinih klasnih datoteka (eng. Java class file) prevedenih
Javinim prevodiocem u novu klasu *.dex (eng. Dalvik Ekecutable) formata.
Meukod koji izvrava DVM nije Javin meukod, nego upravo spomenuti
.dex oblik. Transformacija formata omoguava bolju prilagoenost za rad
na manjim procesorima boljim iskoriavanjem raspoloive memorije i
procesorske snage. Rezultat svega je mogunost viestrukog instanciranja
same virtuelne maine to znai da se svaka Android aplikacija pokree
kao zasebni proces, s vlastitom instancom virtuelne maine Dalvik.
1.3.4.Application Framevork

Sloj aplikativnih okvira (eng. Application Framevork) napisan je u


programskom jeziku Java i sadri proiriv skup programskih komponenti
kojeg koriste sve aplikacije ureaja. Framework podrava mnogobrojne
open source jezike kao to su openssl, sqlite i libc. Takoe podrava i jezik
Android jezgra. Sa gledita sigurnosti, framework se bazira na UNIX file

21

Razvoj aplikacija za operativni sistem Android

system ovlaenjima koja osiguravaju da aplikacije poseduju samo one


mogunosti koje im je vlasnik telefona dao pri instalaciji aplikacije.
Neki od vanijih elemenata su:
upravljanje aktivnostima (eng. Activiti Manager) - upravljanje
ivotnim ciklusom aplikacije,

upravljanje programskim paketima (eng. Package Manager) sadri informaciju o aplikacijama instaliranim na sistemu
upravljanje prozorima (eng. Window Manager) - upravljanje
aplikacionim prozorima,
upravljanje pozivima (eng. Telephone Manager) - sadri API-je koji
se koriste pri izradi aplikacija za upravljanje pozivima,
pruaoci sadraja (eng. Content Providers) - omoguavaju
zajedniko korienje podataka od strane vie aplikacija,
upravljanje resursima (eng. Resource Manager) - slui za
skladitenje delova aplikacije koji nisu kod (npr. slike),
sistem grafikog prikaza (eng. Viev Sistem) - sadri bazu gotovih
grafikih prikaza i alata (eng. vidget),
upravljanje lokacijski zasnovanim uslugama (eng. Location
Manager) i
upravljanje notifikacijama (eng. Notification Manager) - upravljanje
notifikacijama i dogaajima (npr. dospee poruke, nadolazei
sastanak).
Aplikativni sloj je poslednji sloj u arhitekturi sistema Android i ine ga
korisnike aplikacije ureaja. Predstavlja sloj vidljiv krajnjem korisniku.
Ukljuuje neke od standardnih sistemskih aplikaciJa kao to su Veb
pretraiva, lista kontakata, telefon, itd.
1.3.5.Integrisani pretraiva

Google je napravio pravi potez izborom WebKit kao open source web
pretraivaa. Ubacili su dva veoma bitna poboljanja, two pass layout i
frame flattening. Two pass layout otvara stranicu bez ekanja na
blokirajue elemente, kao to su eksterni CSS ili eksterni JavaScript, ali
posle kraeg perioda ponovo otvara stranicu sa svim podacima na strani.
Frame flattening konvertuje postojee okvire stranice u jedan okvir i taj
okvir pokazuje na ekranu. Ova poboljanja pospeuju brzinu i korisnost
surfovanja internetom preko mobilnog telefona.
1.3.6.Optimizovana grafika

Kako Android poseduje 2D grafiku i 3D grafiku zasnovanu an OpenGL ES


1.0, vrlo je mogue da emo videti Google Earth i spektakularne igre kao
22

Razvoj aplikacija za operativni sistem Android

to je Second Life, koje dolaze na Linux sistemima. U ovom trenutku,


legendarna 3D pucaka igra Doom je predstavljena na mobilnim
telefonima koji imaju Android platformu.
1.3.7.SQLite

SQLite je veoma mali (oko 500kb) sistem za upravljanje relacionim bazama


podataka, koji je integrisan u Android. Zasniva se na pozivima funkcija i
jedinstvenih fajlova, gde se uvaju sve definicije, tabele i podaci. Ovaj
jednostavan dizajn je vie nego pogodan za platformu kao to je Android.
Postoji veliki broj karakteristika koje zavise od hardvera, kao to su velika
koliina multimedijalnih fajlova, podrka konekcija, GPS, unapreena
podrka za kameru i jednostavna GSM telefonija.

1.4.Razvoj Android aplikacija


Android aplikacije se mogu pisati u Java ili C programskom jeziku. Android
SDK alati kompajliraju kod, zajedno sa ostalim podacima i resursima
aplikacije u Android package, t.j. fajl sa .apk sufiksom. Kod koji se nalazi u
okviru .apk fajla predstavlja Android aplikaciju. Kada se aplikacija jednom
instalira na ureaj, ona postaje nezavisna celina u okviru sistema:

Android OS je multi-user Linux sistem gde se svaka aplikacija tretira


kao jedinstveni korisnik

Sistem dodeljuje aplikaciji jedinstveni Linux user id. Sistem podeava


dozvole za sve fajlove u okviru aplikacije, tako da samo aplikacija sa
odreenim user id moe da im pristupi

Svaki proces poseduje sopstvenu virtualnu mainu, tako da jedna


aplikacija moe da se izvrava nezavisno od drugih

Svaka aplikacija se izvrava u okviru svog Linux procesa

Aplikacija moe zahtevati pristup podacima na ureaju kao to su:


skladite podataka, korisniki kontakti, SMS poruke, Bluetooth, itd.

1.4.1.Komponente aplikacija

Osnovni elementi svake Android aplikacije su njene komponente, koje


odreuju ponaanje i karakteristike aplikacije. Sistem moe da pristupi i
komunicira sa aplikacijom preko njenih komponenata. Postoji etiri tipa
komponenata aplikacije:

23

Razvoj aplikacija za operativni sistem Android

Aktivnost
Aktivnost predstavlja jedan ekran sa korisnikim interfejsom. Na primer
email aplikacija moe imati jednu aktivnost koja prikazuje listu novih
mejlova, druga aktivnost omoguava pisanje mejla, a trea aktivnost slui
za itanje mejlova. Iako su aktivnosti u okviru jedne aplikacije
komponovane i koordinirane tako da predstavljaju logiku celinu, svaka od
njih je nezavisna. U skladu sa tim, razliite aplikacije mogu da startuju
akitvnosti iz drugih aplikacija. Na primer aplikacija za rad kamere, moe
startovati aktivnost iz email aplikacije kako bi omoguila deljenje
fotografija na drutvenoj mrei. Svaka aktivnost se implementira kao
podklasa klase Activity.
Servisi (Services)
Servis je komponenta koja se izvrava u pozadini kako bi se omoguila
realizacija dugotrajnih operacija, kao i izvravanje udaljenih procesa.
Servis ne prua korisniki interfejs. Na primer, servis moe da puta
muziku u pozadini dok se korisnik nalazi u nekoj drugoj aplikacija.
Aktivnost moe da pokrene servis
Provajderi sadraja (Content providers)
Provajder sadraja upravlja deljenim setom podataka aplikacije. Podaci se
mogu skladititi u fajl sistemu, bazi, na vebu ili bilo kojoj perzistentnoj
lokaciji kojoj aplikacije moe da pristupi. Preko provajdera sadraja
aplikacija moe da vri upit nada podacima. Na primer, Android prua
provajdera sadraja koji upravlja informacijama o imeniku na telefonu.
Svaka aplikacija sa odgovarajuim permisijama, preko provajdera sadraja
moe da pristupi kontaktima u imeniku.
Broadcast receivers
Ova komponenta aplikacije je vezana za prenos sistemskih objava i
notifikacija. Veina broadcast receiver-a potie iz sistema obavetenje
da je baterija slaba, ili da je slika napravljena i sl. Ova komponenta ne
uestvuje u korisnikom interfejsu, ali moe da se pojavi kao notifikacija
lampice i sl.
Jedinstvena karakteristika Android OS je u tome to svaka aplikacija moe
startovati komponente iz neke druge aplikacije.
Komponente aplikacije se aktiviraju preko asinhrone poruke intenta. Sve
komponente jedne aplikacije se definiu u okviru AndroidManifest.xml
fajla. Svaka Android aplikacija osim koda sadri i odgovarajue resurse,
kao to su slike, audio fajlovi, stilovi, itd.

24

Razvoj aplikacija za operativni sistem Android

2. Instalacija i postavljanje razvojnog okruenja


Za razvoj aplikacija za Android operativni sistem potrebno je instalirati
sledee programe navedenim redosledom:

Java SDK
Eclipse IDE
Android SDK
Android Development Tools Plugin za Eclipse
Potrebne verzije Android platformi za Android SDK

Android SDK podrava Windows, Linux i Mac OS operativne sisteme. Za


pisanje Android aplikacija koristi se programski jezik Java. Programer moe
da izabere proizvoljno razvojno okruenje. Potrebno je napomenuti da je
najjednostavnije razvijati Android aplikacije u Eclipse razvojnom okruenju,
poto je Google za njega obezbedio najbolju podrku u vidu dodataka
(plugins). Rad u ostalim okruenjima je komplikovaniji, zato to nisu
integrisana sa Android SDK-om, te je neophodno pokretati odgovarajue
alate iz konzole (komandne linije).
U daljem tekstu bie opisan postupak postavljanja Android razvojnog
okruenja za operativni sistem Windows. Navedeni postupak se neznatno
razlikuje za Linux i MacOS operativne sisteme.
Prvi korak pri postavljanju razvojnog okruenja jeste instalacija Java
Development Kit paketa (JDK). Ukoliko je na raunaru prethodno ve
instaliran Java Runtime Environment paket (JRE), neophodno je instalirati i
JDK, poto on sadri kompajlere i alate za rad sa izvornim kodom, koji nisu
prisutni u JRE paketu. Java Development Kit je mogue besplatno preuzeti
sa
sajta
kompanije
Oracle
(http://www.oracle.com/technetwork/java/javase/downloads/index.html).
Izgled
stranice za preuzimanje JDK paketa prikazan je na slici 2.1.

25

Razvoj aplikacija za operativni sistem Android

Slika 2.1 Strana za preuzimanje JDK

Klikom na taster Download JDK, otvorie se stranica gde je mogue izabrati


platformu za koju se preuzima paket (Slika 2 .2).

Slika 2.2 Izbor platforme


Nakon izbora platforme, potrebno je kliknuti na checkbox I agree i taster
Continue. Sada e se otvoriti strana na kojoj je prikazan naziv fajla za
preuzimanje (Slika 2 .3).

Slika 2.3 Izbor fajla za preuzimanje


Klikom na naziv fajla, zapoee sesa procesom preuzimanja. Po zavretku
preuzimanja i startovanju fajla, krenue proces instalacije JDK-a (Slika 2 .4).
Potrebno je pratiti instrukcije sa ekrana.

26

Razvoj aplikacija za operativni sistem Android

Slika 2.4 Instalacija JDK


Sledei korak jeste instalacija Eclipse Integrated Development Environment-a
(razvojno okruenje). Njega je mogue besplatno preuzeti sa adrese
http://www.eclipse.org/downloads/.
Eclipse
razvojno
okruenje
podrava
Windows, Linux i MacOS X operativne sisteme, kao i itav niz programskih jezika.
Mogue je koristiti bilo koju verziju Eclipse-a koja podrava Java programski jezik.
Poto na sajtu za preuzimanje Eclipse razvojnog okruenja postoji veliki broj
razliitih verzija, odluiemo se za najjednostavniju verziju koja podrava Java
programski jezik. To je Eclipse IDE for Java Developers (Slika 2 .5).

27

Razvoj aplikacija za operativni sistem Android

Slika 2.5 Sajt za preuzimanje Eclipse razvojnog okruenja


Nakon izbora verzije Eclipse-a, treba izabrati i mirror sajt sa koga e se
preuzimanje izviti. Od izabranog naina preuzimanja jedino zavisi brzina samog
download-a, te ovaj izbor nije od presudne vanosti. Moete izabrati prvi
preporueni sajt (Slika 2 .6).

Slika 2.6 Izbor mirror sajta sa koga e se preuzeti Eclipse IDE


Eclipse IDE nema sopstveni program za instalaciju. On se jednostavno nalazi
zapakovan u okviru jedne ZIP arhive. Nakon uspenog preuzimanja, dovoljno je
raspakovati tu arhivu u eljeni folder (npr. C:\, tako da e konana putanja Eclipse
IDE-a biti C:\eclipse), to je prikazano na slici 2.7.

28

Razvoj aplikacija za operativni sistem Android

Slika 2.7 Raspakivanje Eclipse razvojnog okruenja


Poto Eclipse IDE nije instaliran na uobiajeni nain, raspakivanjem nisu
postavljene preice izvrnog fajla na radnu povrinu i u Start meni. To je mogue
uraditi runo. Najpre treba otii u folder C:\eclipse (odnosno u folder gde je
Eclipse raspakovan) i kliknuti na fajl eclipse.exe desnim tasterom mia, a zatim
izabrati opciju Copy. Potom treba kliknuti na prazan deo radne povrine desnim
tasterom mia i izabrati opciju Paste shortcut.
Sledei korak jeste instalacija Android Software Development Kit-a (SDK). Njega
je
mogue
besplatno
preuzeti
sa
sajta
http://developer.android.com/sdk/index.html . Na navedenom sajtu je potrebno
izabrati verziju za eljeni operativni sistem. U sluaju Windows-a, preporuljivo je
preuzeti exe datoteku, poto je to verzija SDK sa ugraenim programom za
instalaciju (Slika 2 .8). Kod drugih operativnih sistema, dovoljno je otpakovati
datoteku u eljeni folder.

Slika 2.8 Izbor verzije Android SDK za preuzimanje


Sada je mogue startovati instalaciju, gde je potrebno pratiti instrukcije sa ekrana
(Slika 2 .9).
29

Razvoj aplikacija za operativni sistem Android

Slika 2.9 Instalacija Android SDK


Po zavretku instalacije, startovae se SDK Manager. Ovde je mogue izabrati
verzije Android API-a koje se mogu preuzeti.

Slika 2.10 SDK Manager


Izbor verzije Android API-a veoma je vaan, zato to od toga direktno zavisi da li
e aplikacija raditi na odreenom mobilnom telefonu ili tablet ureaju. Na primer,
ako se izabere verzija 3.0 API-a, aplikacija svakako nee raditi na starijim Android
telefonima. Nove verzije API-a imaju naravno vie funcionalnosti, ali manju
kompatibilnost sa starijim ureajima.
Izborom opcije Accept All (Slika 2 .10) i klikom na taster Install zapoee se
preuzimanje i instalacija svih verzija API-a, pratee dokumentacije i primera.
Verzija API-a za koju e se kreirati aplikacija bira se naknadno.
30

Razvoj aplikacija za operativni sistem Android


Nakon zavrenog preuzimanja potrebnih fajlova, instalirane komponente je
mogue videti u odeljku Installed Packages. Naknadno je mogue instalirati novu
verziju API-a izborom opcije Available Packages (Slika 2 .11).

Slika 2.11 Opcija Available Packages


Ovde bi trebalo izabrati Google Inc. add-ons, zato to ovi paketi ukljuuju dodatne
biblioteke za rad sa Google servisima. Nakon izbora, treba kliknuti na dugme
Install Selected i zatim prihvatiti licencu, ime e se potrebne datoteke preuzeti.
U okviru SDK Manager-a mogue je kreirati i podesiti virtuelne Android mobilne
ureaje, koji se koriste prilikom testiranja aplikacije. Potrebno je izabrati opciju
Virtual Devices. Ovde se prikazuje spisak podeenih virtuelnih Android ureaja.
Klikom na taster New mogue je kreirati novi ureaj (Slika 2 .12).

31

Razvoj aplikacija za operativni sistem Android

Slika 2.12 Virtuelni ureaji


U novootvorenom prozoru mogue je podesiti parametre virtuelnog ureaja. U
pitanju su sledei parametri:

Name proizvoljan naziv virtuelnog ureaja.


Target verzija Android API-a koju koristi ureaj.
SD Card podeavanja virtuelne memorijske kartice. Ukoliko se izabere
opcija Size, mogue je zadati veliinu nove virtuelne memorijske kartice.
Ukoliko se izabere opcija File, mogue je uitati sadraj image fajla kao
virtuelnu memorijsku karticu.
Snapshot ukoliko se izabere opcija Enabled, omoguie se pamenje
stanja virtuelnog ureaja i kasnije uitavanje tog stanja prilikom ponovnog
ukljuivanja virtuelnog ureaja. Opcija Snapshot je slina opciji Hibernate u
Windows operativnom sistemu.
Skin predstavlja rezoluciju ekrana virtuelnog ureaja. Moe se izabrati
neka od predefinisanih standardnih rezolucija (Built-in) ili se moe zadati
proizvoljna vrednost rezolucije (Resolution).
Hardware prilikom kreiranja virtuelnog ureaja, moe se izabrati
virtuelni hardver koji ureaj sadri (na primer GPS prijemnik, memorijska
kartica, kamera i drugo).

Na primer, kreiraemo novi virtuelni ureaj sa parametrima kao na slici 2.13.


Nakon unosa vrednosti parametara, kliknuemo na taster Create AVD, ime e
novi Android virtuelni ureaj biti sauvan.

32

Razvoj aplikacija za operativni sistem Android

Slika 2.13 Kreiranje novog Android virtuelnog ureaja


Sada treba izai iz SDK Manager-a i pokrenuti Eclipse razvojno okruenje. Prilikom
prvog startovanja ovog okruenja, potrebno je izabrati lokaciju workspace-a.
Workspace u stvari predstavlja folder u kome e se nalaziti projekti raeni u
Eclipse razvojnom okruenju. Workspace se obino nalazi u okviru linog foldera
operativnog sistema (Slika 2 .14). Ukoliko opcija Use this as the default and do
not ask again nije izabrana, korisnik e lokaciju workspace-a birati prilikom
svakog pokretanja Eclipse razvojnog okruenja. Nakon ovog podeavanja treba
kliknuti na taster OK.

Slika 2.14 Izbor lokacije workspace-a


Sada je neophodno instalirati dodatak koji omoguava integraciju Eclipse IDE-a i
Android SDK-a. Potrebno je izabrati meni Help, a zatim opciju Install New
Software (Slika 2 .15).

33

Razvoj aplikacija za operativni sistem Android

Slika 2.15 Izbor opcije Install New Software


Otvorie se novi prozor, u kome treba kliknuti na dugme Add (Slika 2 .16).

Slika 2.16 Dijalog Install New Software


U novootvorenom prozoru u polje Name treba uneti Android, a u polje Location
treba upisati https://dl-ssl.google.com/android/eclipse/, kao to je prikazano na
slici 2.17. Zatim treba izabrati opciju OK.

Slika 2.17 Dodavanje repozitorijuma


Posle nekoliko trenutaka, trebalo bi da se pojavi prozor kao na slici 2.18. Potrebno
je selektovati Developer Tools, ime e biti izabrane i sve podopcije, a zatim
kliknuti na taster Next.
34

Razvoj aplikacija za operativni sistem Android

Slika 2.18 Izbor opcija


Zatim je potrebno potvrditi izbor ponovnim klikom na Next (Slika 2 .19), prihvatiti
licence (Slika 2 .20) i na kraju kliknuti na taster Finish.

Slika 2.19 Potvrda izbora

35

Razvoj aplikacija za operativni sistem Android

Slika 2.20 Prihvatanje licenci


Ovim je zapoeo proces instalacije dodataka za Eclipse. Ukoliko se pojavi prozor
koji obavetava korisnika da sadraj koji se preuzima nema digitalni potpis,
potrebno je kliknuti na taster OK, ime se omoguava instalacija (Slika 2 .21).

Slika 2.21 Obavetenje o nepotpisanom sadraju

Nakon zavretka instalacije, potrebno je ponovo pokrenuti Eclipse razvojno


okruenje (Slika 2 .22).

Slika 2.22 Obavetenje o restartovanju Eclipse IDE-a


Sada je neophodno podesiti dodatak za Android SDK. Treba izabrati opciju
Window -> Preferences, a zatim opciju Android. U polje SDK Location treba uneti
putanju do instaliranog Android SDK. Podrazumevana vrednost je C:\Program
Files\Android\android-sdk-windows (Slika 2 .23).

36

Razvoj aplikacija za operativni sistem Android

Slika 2.23 Podeavanje dodatka za Eclipse IDE

Ovime je zavren proces podeavanja Android razvojnog okruenja i sada je


mogue kreirati aplikacije za Android platformu!

2.1.Kreiranje nove Android aplikacije


Kreiranje nove Android aplikacije korienjem Eclipse razvojnog okruenja dosta
je jednostavno. Nakon startovanja okruenja, potrebno je izabrati opciju New ->
Other -> Android -> Android Project (belowSlika 2 .24), a zatim kliknuti na taster
Next.

Slika 2.24 Kreiranje novog Android projekta

37

Razvoj aplikacija za operativni sistem Android


U sledeem koraku, pojavie se novi ekran gde programer moe da unese
odgovarajue parametre vezane za Android projekat (Slika 2 .25).
Navedeni parametri su:

Project Name Proizvoljan naziv novog Eclipse projekta.


Contents Sadraj projekta. Postoji tri razliite opcije parametra Contents:
o Create new project in workspace kreiranje potpuno novog projekta.
o Create project from existing source uvoz postojeeg koda u
novokreirani projekat.
o Create project from existing sample korienje gotovih primera u
okviru novog projekta.
Build Target Izbor verzije Android API-a koja e se koristiti u novom
projektu.
Properties Dodatni parametri novog Android projekta. To su:
o Application Name Naziv aplikacije koji e biti vidljiv na ureaju.
o Package Name Naziv Java paketa u okviru koga e se pisati klase
projekta.
o Create Activity Ukoliko je opcija izabrana, kreirae se nova prazna
aktivnost u okviru projekta. U tom sluaju, neophodno je uneti i
naziv te aktivnosti. Vie o aktivnostima moete proitati u poglavlju
3.
o Min SDK Version minimalna verzija Android API-a na kojoj e raditi
aplikacija.

Dakle, potrebno je podesiti parametre kao na slici. Za poetak, neemo kreirati


Android aktivnost. O tome e vie rei biti u poglavlju 3.2.

38

Razvoj aplikacija za operativni sistem Android

Slika 2.25 Parametri novog Android projekta

Nakon uspeno podeenih parametara, potrebno je kliknuti na taster Finish.


Ovime je kreiran novi Android projekat. Kreiranjem novog Android projekta,
generiu se odreeni fajlovi koji su organizovani po folderima. Svaki Android
projekat ima svoj XML manifest fajl ( AndroidManifest.xml) koji opisuje prirodu
aplikacije i svake njene komponente. O ovom fajlu bie vie rei u narednom
poglavlju.

39

Razvoj aplikacija za operativni sistem Android


U sledeoj tabeli prikazana je organizacija strukture Android projekta po
folderima:
Folder
src/
bin/
jni/
gen/
assets/
res/
libs/

Opis
Sadri fajlove sa izvornim kodom. U ovom folderu se nalaze sve kreirane aktivnosti (u okviru
odgovarajueg paketa).
Ovde se nalaze kompajlovani fajlovi projekta, kao to su konani apk fajlovi (varijanta jar fajla za
instalaciju na Android ureaju).
Sadri izvorni kod razvijen korienjem alata Android NDK (Native Development Kit). Ukoliko se ne
koristi NDK, ovaj folder ne postoji.
Sadri generisane fajlove, iji sadraj ne treba runo menjati.
Ovde se nalaze dodatni materijali koji se koriste u projektu. Na primer, to mogu da budu podaci koje
koristi aplikacija. Na poetku je ovaj folder prazan.
U ovom folderu se nalaze dodatni resursi koji se koriste u aplikaciji. Oni su organizovani po
podfolderima. To mogu da budu slike, animacije, raspored elemenata korisnikog interfejsa i sl.
Ovde se uvaju dodatne biblioteke koje se koriste u projektu.

Tabela 2.1 Organizacija strukture Android projekta


U korenom folderu projekta, osim fajla AndroidManifest.xml nalazi se i fajl
default.properties, koji sadri opta podeavanja projekta, kao to je verzija
Android API-a koju aplikacija koristi.

2.2.Fajl AndroidManifest.xml
Svaka aplikacija mora da poseduje svoj AndroidManifest.xml fajl u korenom
folderu projekta. Naziv manifest fajla mora da bude AndroidManifest.xml.
Manifest sadri neophodne informacije o aplikaciji i o Android sistemu. Ove
informacije sistem mora da poseduje pre poetka izvravanja aplikacije. Neke od
funkcija manifest fajla su:

Sadri naziv Java paketa u okviru kojeg je napisan izvorni kod aplikacije.
Naziv paketa predstavlja jedinstveni identifikator aplikacije.
Opisuje komponente aplikacije aktivnosti, servise, primaoce poruka i
provajdere sadraja. Dakle, manifest fajl sadri nazive klasa u kojima su
opisane komponente aplikacije. Na primer, aplikacija se nee startovati
ukoliko u manifest fajlu nije navedena njena poetna aktivnost, ak ni u
sluaju da fajl sa Java izvornim kodom te aktivnosti postoji.
Odreuje koji procesi e biti domaini komponentama aplikacije.
Definie koje privilegije (permissions) aplikacija mora da poseduje da bi
mogla nesmetano da funkcionie.
Takoe definie koje privilegije moraju druge aplikacije da poseduju da bi
mogle da koriste komponente aplikacije.
Definie minimalnu verziju Android API-a koji zahteva aplikacija.
Definie listu biblioteka koje aplikacija koristi

Izuzetno je bitno pravilno konfigurisati manifest fajl, zato to u protivnom


aplikacija nee dobro funkcionisati. U primeru 2.1 prikazan je izgled jednog
manifest fajla.

40

Razvoj aplikacija za operativni sistem Android

<?xml version="1.0" encoding="utf-8"?>


<manifest>
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />
<application>
<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider>
<grant-uri-permission />
<meta-data />
</provider>
<uses-library />
</application>

41

Razvoj aplikacija za operativni sistem Android


</manifest>

Primer 2.1 Struktura Android Manifest fajla


U primeru 2.1 prikazani su osnovni elementi datoteke AndroidManifest.xml, a to
su:

<action> opisuje akciju dodeljenu <intent-filter> elementu. Obavezan

deo <intent-filter> polja. Ukoliko se ne definie, Intent objekti ne prolaze


kroz filter.
<activity>
obavezni
deklariui
element
za
svaku
aktivnost
aplikacije.Podrava podelemente<intent-filter> kojima se specificiraju
pojedine namere aktivnosti. Pokretanje aktivnosti koja nije definisana u
AndroidManifest.xml datoteci rezultuje pojavom greke pri izvoenju (eng.
runtime error).
<activity-alias> zamenska aktivnost. Ciljanu aktivnost predstavlja kao
nezavisni entitet sa sopstvenim skupom filtera namera koji umesto
definisanja namera za direktno pokretanje ciljane aktivnosti odreuju
namere koji je pokreu preko zamenske aktivnosti.
<application> koreni element sa opisom dubine stabla koga ine
komponente paketa. Takoe moe da sadri globalne i/ili unapred zadate
atribute aplikacije, kao to su tema, ikona, dozvole itd. Manifest fajl moe
da sadri samo jedan element ove vrste.
<category> vrsta kategorije Intent filtera. Sadran u bloku <intentfilter>.
<data> odreuje vrstu podatka Intent filtera. To mogu biti opcioni, ali
meusobno zavisni atributi MIME ili URI. Sadran u bloku <intent-filter>.
<grant-uri-permission> odreuje garantovane dozvole podskupova
podataka pruaoca sadraja. Sadran u bloku <provider>.
<instrumentation> deklarie koje su instrumentacione komponente
raspoloive za testiranje funkcionalnosti paketa. Sadran u bloku
<manifest>.
<intent-filter> odreuje vrstu namere na koju reaguju aktivnost, usluga
iliBroadcast Receiver. Sadran u blokovima <activity>, <activityalias>,<service> i <receiver>.
<manifest> definie komponente, bezbednosne postavke i klase za
testiranje koje ine aplikaciju. Ovo je osnovni element AndroidManifest.xml
fajla.
<meta-data> par ime-vrednost dodatnih metapodataka koji mogu biti
isporueni roditeljskoj komponenti. Sadran u blokovima <activity>,
<activity-alias>, <service> i <receiver>.
<permission> deklarie bezbednosne dozvole nad komponentama kojima
pristupaju druge aplikacije.
<permission-group> odreuje grupu povezanih dozvola.
<permission-tree> odreuje stablo dozvola.
<provider> definie pruaoca sadraja. Sadran u <application>.
<receiver> definie Broadcast Reciever koji omoguava prihvatanje
namera i u sluaju kada aplikacija i njene komponente nisu pokrenute.

42

Razvoj aplikacija za operativni sistem Android

<service> definie usluge. Sadran u <application> bloku, a moe da

sadri<intent-filter> i <meta-data>.
<uses-library> definie biblioteku sa kojom aplikacija mora biti
povezana.Sadran u <application> bloku.
<uses-permission> deo bezbednosnog modela koji sadri bezbednosne
dozvole dodeljene od strane korisnika, a odnose se na funkcije aplikacije.
Dozvole se definiu prilikom instaliranja aplikacije.
<uses-sdk> definie nivo Android API-ja na kojima se moe izvravati
aplikacija.

Dozvole se definiu zbog hardverski ogranienog pristupa memoriji jednog


procesa od strane drugog, te zato to je svakoj aplikaciji dodeljen specifini ID
korisnika. Neke od najee korienih dozvola su:

INTERNET pristup Internetu.


READ_CONTACTSdozvola za itanje podataka kontakata.
WRITE_CONTACTS dozvola za pisanje podataka kontakata.
RECEIVE_SMS nadzor pristigle SMS poruke.
ACCESS_COARSE_LOCATION grubo beino lociranje ili lociranje preko bazne

stanice.

ACCESS_FINE_LOCATION finije lociranje korienjem npr GPS-a.

FajlAndroidManifest.xmlmoe runo da se ureuje, pisanjem XML koda ili moe da


se koristi ugraeni ureiva koji dolazi kao deo ADT-a.

3.

Aktivnosti i klasa Activity

Aktivnost (Activity) predstavlja komponentu aplikacije koja se uglavnom moe


poistovetiti s jednim konkretnim prozorom aplikacije u kojem je korisnik u
mogunosti da izvri odreenu radnju. Na primer, aktivnost slui da bi korisniku
mobilnog telefona omoguila pozivanje odreenog broja, slikanje fotografije
korienjem ugraene kamere, slanje e-mail poruke, pregled mape i dr. Aplikacija
moe da sadri jednu ili vie definisanih aktivnosti, pri emu je jedna od
aktivnosti uvek definisana kao primarna aktivnost. Prelaz izmeu aktivnosti odvija
se tako to aktuelna aktivnost poziva novu. Iako vie aktivnosti ini jedan
kompaktan korisniki interfejs, treba imati na umu da su one meusobno
nezavisne. Svaka aktivnost implementira se kao zasebna klasa koja nasleuje
klasu Activity, pa je sama odgovorna za uvanje svog stanja u ivotnom ciklusu
aplikacije.
Klasa aktivnosti je glavni deo svake Android aplikacije. Programer vei deo
vremena provodi na definisanju i implementaciji aktivnosti za svaki ekran u
aplikaciji.
Svakoj Android aplikaciji mora biti dodeljena aktivnost unutar Android manifest
fajla. Druge klase aktivnosti mogu biti oznaene u manifest fajlu da se pokrenu

43

Razvoj aplikacija za operativni sistem Android


pri odreenim okolnostima. Ovim sekundarnim ulaznim takama se upravlja
pomou Android manifest fajla odreenim filterima.
Aplikacije mogu biti prekinute zbog raznih dogaaja vieg prioriteta, kao to je
telefonski poziv. U jednom trenutku moe postojati samo jedna aktivna aplikacija.
Android aplikacije su odgovorne za upravljanje njihovim stanjem, kao i njihovom
memorijom, resursima i podacima. Android operativni sistem moe iskljuiti
aktivnost koja je na pauzi, stopirana ili unitena kada je memorija slaba. Ovo
znai da svaka aktivnost koja nije u prvom planu mora biti iskljuena. Drugim
reima, Android aplikacija mora odravati stanje i biti spremna da bude prekinuta
ili ak iskljuena u svakom trenutku.

3.1.ivotni ciklus aktivnosti


ivotnim
ciklusom
aktivnosti
jedne
Android
aplikacije
upravlja
se
implementacijom odgovarajuih metoda. Svaka aktivnost ima tri osnovna stanja:

Resumed (Running)
o Aktivnost je pokrenuta i fokusirana.
Paused
o Druga aktivnost je pokrenuta i fokusirana (u prvom planu), ali je
tekua aktivnost i dalje pokrenuta i vidljiva. Na primer, druga
aktivnost je u prvom planu, dok je tekua aktivnost vidljiva, ali ne
zauzima ceo ekran. Aktivnost ije je stanje paused je potpuno iva
(objekat klase Activity se nalazi u memoriji, zadrava sva stanja i
ostaje u window manager-u), meutim ova aktivnost moe da bude
ubijena u sluaju niske slobodne memorije.
Stopped
o Aktivnost ije je stanje stopped je i dalje iva, ali radi u pozadini.
Objekat klase Activity i dalje se nalazi u memoriji, uva sva stanja,
ali se vie ne nalazi u okviru window manager-a. Ovu aktivnost vie
ne vidi korisnik i u sluaju potrebe za memorijom sistem moe da je
ubije.

ivotni ciklus jedne aktivnosti prikazan je na slici 4.1. Dakle, kao to je


napomenuto na poetku ovog poglavlja, fazama ivotnog ciklusa aktivnosti
upravljaju metode onCreate(), onRestart(), onStart(),onResume(), onPause(),
onStop() i onDestroy().
ivotni ciklus aktivnosti zapoinje metodom onCreate(), a zavrava se zajedno sa
metodom onDestroy(). U okviru metode onCreate(), programer bi trebalo da
definie izgled i globalno stanje aktivnosti, kao to je raspored elemenata
korisnikog interfejsa. Implementacijom metode onDestroy() trebalo bi osloboditi
koriene resurse. Na primer, ukoliko vaa aktivnost koristi pozadinsku nit koja
preuzima podatke sa Interneta, nit bi trebalo kreirati u okviru metode onCreate(),
a zaustaviti je u okviru metode onDestroy().

44

Razvoj aplikacija za operativni sistem Android


Aktivnost je vidljiva (visible) izmeu poziva metoda onStart() i onStop(). Dok je
aktivnost vidljiva, korisnik je vidi na ekranu i moe da vri interakciju sa njom
(npr. da unosi podatke). Metoda onStop() se poziva kada se startuje nova
aktivnost, a tekua aktivnost vie nije vidljiva.
Aktivnost je fokusirana (u prvom planu) izmeu poziva metoda onResume() i
onPause(). Tada se ta aktivnost nalazi ispred svih ostalih aktivnosti. Aktivnost
moe esto da prelazi iz prvog plana u pozadinu i obrnuto. Na primer, metoda
onPause() se poziva kada ureaj pree u stanje mirovanja (sleep).

Slika 3.26 ivotni ciklus aktivnosti


U tabeli 4.1 prikazane su fundamentalne metode za upravljanje ivotnog ciklusa i
njihov opis.

45

Razvoj aplikacija za operativni sistem Android

Metoda

Opis

onCreate()

onRestart()

onStart()

onResume()

onPause()

onStop()

onDestroy()

Poziva se kada se aktivnost prvi put kreira. Ovde bi


trebalo kreirati poglede (views), povezati (bind)
podatke sa listama i sl. Ovoj metodi prosleuje se
objekat tipa Bundle koji sadri prethodno stanje
aktivnosti.
Poziva se posle stopiranja aktivnosti, ali neposredno
pre njenog ponovnog startovanja.
Poziva se neposredno pre nego to aktivnost postane
vidljiva korisniku. Metoda koja se poziva posle ove
moe da bude onResume() u sluaju da aktivnost
prelazi u prvi plan, ili onStop() u sluaju da postaje
sakrivena.
Poziva se neposredno pre nego to aktivnost zapone
interakciju sa korisnikom.
Poziva se neposredno pre nego to sistem nastavi
izvravanje druge aktivnosti. Ova metoda se obino
koristi da sauva podatke, zaustavi animacije i prekine
sa izvravanjem procesa koji koriste procesorsko
vreme. Ova metoda se mora izvriti to je bre
mogue, zato to sledea aktivnost nee biti
nastavljena dok se ova metoda zavri. Metoda koja se
poziva posle ove moe da bude onResume() u sluaju
da aktivnost prelazi u prvi plan, ili onStop() u sluaju
da postaje sakrivena.
Poziva se kada korisnik vie ne vidi aktivnost. Ovo se
moe dogoditi kada je u toku unitavanje aktivnosti ili
zbog nastavljanja izvravanja neke druge aktivnosti.
Metoda koja se poziva posle ove moe da bude
onRestart() ukoliko je potrebna ponovna interakcija
aktivnosti i korisnika ili onDestroy() u sluaju da
aktivnost vie nije potrebna.
Poziva se neposredno pre unitavanja aktivnosti. Ovo
je poslednji poziv koji e aktivnost da primi. Metoda
onDestroy() moe biti pozvana kada se zavrava sa
izvravanjem aktivnosti (neko je pozvao metodu
finish()) ili zato to sistem privremeno unitava
instancu aktivnosti da bi oslobodio prostor. Pomou
metode isFinishing() moe se napraviti razlika
izmeu ova dva scenarija.

Moe da se
ubije
posle?

Sledea
metoda

Ne

onStart()

Ne

onStart()

Ne

onResume()
ili
onStop()

Ne

onPause()

Da

onResume()
ili
onStop()

Da

onRestart()
ili
onDestroy()

Da

nema

Tabela 24.2 Fundamentalne metode ivotnog ciklusa

Kolona Moe da se ubije posle? oznaava da li sistem sme da ubije proces


koji omoguava pokretanje aktivnosti bilo kada nakon zavretka izvravanja date
metode.
Da bi se bolje ilustrovalo kako jedna aktivnost izgleda, dat je primer 4.1, u kome
su fundamentalne metode.
public class MojaAktivnost extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Nova aktivnost se kreira.
}
@Override
protected void onStart() {
super.onStart();
// Kreirana aktivnost postaje vidljiva.
}

46

Razvoj aplikacija za operativni sistem Android


@Override
protected void onResume() {
super.onResume();
// Aktivnost je postala vidljiva (sada je u stanju "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Druga aktivnost uzima fokus (ova aktivnost je sada "paused").
}
@Override
protected void onStop() {
super.onStop();
// Aktivnost vie nije vidljiva (sada je u stanju "stopped").
}
@Override
protected void onDestroy() {
super.onDestroy();
// Aktivnost se unitava.
}
}

Primer 3.2 Primer aktivnosti sa metodama ivotnog ciklusa

3.2.Kreiranje aktivnosti
Da bi se kreirala nova aktivnost u okviru Android aplikacije, kreira se nova klasa
koja nasleuje klasu Activity (ili njenu izvedenu klasu). U novokreiranoj klasi,
neophodno je implementirati metode opisane u prethodnom poglavlju (vidiPrimer
3.2). Najvanije je implementiranje metoda onCreate() i onPause().
Dakle, u okviru ve kreiranog Android poglavlja (vidi Poglavlje 2.1) potrebno je
kreirati novu klasu. U okviru Package Explorera koji se najee nalazi sa leve
strane u Eclipse razvojnom okruenju najpre treba izabrati folder src, a zatim
kliknuti desnim tasterom mia na paket koji je kreiran zajedno sa Android
projektom. U naem sluaju, to je net.myelab.android.mojaaplikacija(Slika ).

Slika 3.2 Izbor paketa u okviru projekta

Zatim treba izabrati opciju New, pa Other (Slika 3.27).

47

Razvoj aplikacija za operativni sistem Android

Slika 3.27 Izbor opcije za dodavanje novog fajla


Potom je potrebno izabrati opciju za dodavanje nove klase. To je opcija Java ->
Class (Slika 3.28). Zatim treba kliknuti na taster Next.

Slika 3.28 Izbor opcije za kreiranje nove klase

Sada e se pojaviti ekran prikazan na slici 4.5. Ovde je neophodno uneti


odgovarajua podeavanja, a to su:

Source folder folder u kome se uvaju izvorni fajlovi projekta. Obino je


to src.
Package naziv paketa u kome se kreira klasa. Ovde bi trebalo da stoji
naziv paketa koji je kreiran zajedno sa novim Android projektom. U ovom
sluaju, to je net.myelab.android.mojaaplikacija.
Name naziv klase. Ovde unosimo eljeni naziv aktivnosti koju kreiramo.
U naem sluaju, neka taj naziv bude Aktivnost.
Modifiers modifikatori pristupa. Za aktivnost, ova vrednost bi trebalo da
bude public.
48

Razvoj aplikacija za operativni sistem Android

Superclass nadreena klasa. Za aktivnost, to bi trebalo da bude


android.app.Activity.

Slika 3.29 Podeavanja nove klase


Nakon unetih vrednosti, potrebno je kliknuti na taster Finish. Sada je potrebno
implementirati neke od ranije pomenutih metode. Aktivnost koju smo kreirali
predstavljae Hello World primer.
Najpre emo implementirati metodu onCreate():
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello world");
setContentView(tv);
}

Primer 3.3 Implementacija metode onCreate()


Jedini ulazni parametar ove metode je objekat tipa Bundle koji predstavlja neko
prethodno stanje aktivnosti ukoliko je aktivnost bila ranije pokrenuta. Na poetku
se poziva metoda onCreate() nadreene klase (klasa Activity), kojoj se
prosleuje parametar tipa Bundle. Zatim se kreira novi pogled ( View). Pogled u
stvari predstavlja osnovnu jedinicu korisnikog interfejsa Android aplikacije.
Android aktivnost moe da koristi vie razliitih pogleda, a o njima e biti rei u
narednom poglavlju. Tekstualni sadraj se ubacuje korienjem metode
setText().
Konaan izgled klase Aktivnost prikazan je u narednom primeru:
49

Razvoj aplikacija za operativni sistem Android

package net.myelab.android.mojaaplikacija;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class Aktivnost extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello world");
setContentView(tv);
}
}

Primer 3.4 Klasa Aktivnost

Da bi aplikacija bila funkcionalna, neophodno je ubaciti podatke o kreiranoj


aktivnosti u Android manifest fajl. Nakon izmena, fajl AndroidManifest.xml treba
da izgleda ovako:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.myelab.android.mojaaplikacija"
android:versionCode="1"
android:versionName="1.0">
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".Aktivnost"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Primer 3.5 Manifest fajl projekta

Tag <activity>omoguava android aplikaciji da zna da navedena klasa


predstavlja aktivnost, s obzirom da je mogue koristiti i pomone klase. U okviru
taga <intent-filter> definisano je koja aktivnost predstavlja poetnu aktivnost u
aplikaciji.
Sada je mogue startovati aplikaciju. Izborom opcije Run -> Run As -> Android
Application startuje se aplikacija na odgovarajuem Android virtuelnom ureaju.
50

Razvoj aplikacija za operativni sistem Android


Startovanje virtuelnog ureaja predstavlja dug proces koji moe potrajati i vie od
5 minuta.
Proces kreiranja Android virtuelnog ureaja opisan je u poglavlju 1.4. Ukoliko je
napravljeno vie Android virtuelnih ureaja, eljeni ureaj je mogue izabrati
pomou opcije Run -> Run Configurations, a zatim je potrebno izabrati opciju
Android Application -> Naziv Projekta, pa karticu Target (Slika 3.30).

Slika 3.30 Izbor Android virtuelnog ureaja


Ukoliko je fiziki Android ureaj povezan sa raunarom korienjem USB porta,
izborom opcije Run nee doi do startovanja virtuelnog ureaja, ve e se
aplikacija instalirati na fiziki ureaj i potom automatski startovati na njemu.
Uspeno startovana aplikacija na virtuelnom ureaju prikazana je na sledeoj
slici:

51

Razvoj aplikacija za operativni sistem Android

Slika 3.31 Aplikacija na virtuelnom ureaju

52

Razvoj aplikacija za operativni sistem Android

4. Resursi u Android aplikacijama


Sve android aplikacije sastoje se iz dva segmenta:

funkcionalnost predstavlja kod kako se aplikacija ponaa na neki


zahtev. Ovde spadaju svi algoritmi koji pokreu aplikaciju

resursi ili podaci obuhvataju tekstove, slike, audio i video fajlove,


datoteke, ikone i druge podatke koje koristi aplikacija.

Resursi obuhvataju tekst u obliku stringa, slike i ikone, audio datoteke,


video zapise i druge podatke koje koristi aplikacija.
Resursi se dele na dva tipa: resurse aplikacije i resurse sistema. Resurse
aplikacije definie developer unutar fajlova Android projekta i tano su
odreeni za neku aplikaciju. Resursi sistema su standardni resursi koje
definie Android platforma i dostupni su svim aplikacijama kroz Android
SDK.
Resursi aplikacije se prave i uvaju unutar Android projekta u /res
direktorijumu. Koristei ve definisanu ali fleksibilnu strukturu
direktorijuma, resursi su organizovani, definisani i upakovani sa paketom
aplikacije. Resursi aplikacije se ne dele sa ostatkom Anroid sistema.
Svi resursi aplikacije se uvaju u strukturi direktorijuma /res i sastavljeni su
u projekat u trenutku pravljenja aplikacije. Resursi aplikacije se mogu
koristiti programerski. Takoe na njih se mogu odnositi resursi drugih
resursa aplikacija.
Svaki put kad se sauva fajl sa resursima u Eclipsu, R.java klasa fajl se
ponovo sastavlja kako bi se ubacile nove izmene. Ako nije korien pravi
direktorijum ili pravila o nazivu fajla, pojavie se greka u kompajleru u
prozoru Eclipse Problems.
Resursima aplikacije se moe pristupiti programerski koristei generisu
klasu koja se zove R.java. Kako bi se dodala referenca na resurs, mora se
doi do objekta resursa aplikacije koristei klasu getResources() i tako
napraviti odgovarajui poziv na komandu, koji je zasnovan na tipu resursa
koji eli da se doda.
Developeri mogu da pristupe resursima Android sistema (kao dodatak
resursima aplikacije). Mogu se deliti mnogi resursi sistema kroz vie
aplikacija zbog obinog izgleda i oseaja.Na primer, klasa resursa Android
53

Razvoj aplikacija za operativni sistem Android

sistema (android.R.string) sadri stringove za rei kao to su OK, Cancel,


Yes, No, Cut, Copy i Paste.
Sistemski resursi se uvaju u android paketu. Postoje klase za svaki od
veih tipova resursa. Na primer, klasa android.R.string sadri string
sistemskog resursa. Kako bi se dobio string sistemskog resursa za OK prvo
se mora koristiti statikia komanda klase Resursa getSystem() kako bi se
doveo globalni sistemski objekat Resource. Onda se poziva komanda
getString() sa odgovarajuim string imenom resursa.

4.1.Upravljanje i pristup resursima


U ovom poglavlju bie prikazano kako Android aplikacije skladite i
pristupaju vanim resursima kao to su stringovi, grafika i ostali podaci.
Takoe e biti prikazano kako da organizujete Android resurse u okviru
projekta kako bi se na najlaki nain mogla izvriti lokalizacija i
prilagoavanje aplikacija za razliite konfiguracione ureaje. Kako bi se
omoguila kompatabilnost sa razliitim ureajima potrebno je resurse
organizovati u folderima(direktorijumima) i podfolderima kako bi se svaki
deo android aplikacije mogao odravati nezavisno od ostalih delova
aplikacije.
Podrazumevani stil prikazivanja aplikacije uva se na putanji res/layout/
meutim moete podesiti u konfiguracionom fajlu da kada se aplikacija
pokrene na neki ureaj koji ima drugaiju rezoluciju ekrana, npr koristi
Landscape orijentaciju, da tada poziva funkcije za prikaz is foldera
res/layout-land/ gde e na ovaj nain sama aplikacija zavisno od
rezolucije ureaja prikazati adekvatan sadraj.

Slika 3.1. Razliit prikaz za raliitu rezoluciju ureaja


Korienje resursa koristei Eclipse razvojno okruenje sa dodatkom
Android Asset Packaging Tool je veoma jednostavno, nije potrebno
kompajlirati resurse, to e Eclipse sam uraditi, meutim ako koristite neko
drugo razvojno okuenje potrebno je sve resurse komplajlirati iz komandne
linije ili pak moete napisati skriptu koja e to uraditi, potom tu skriptu
moete koristiti za sve vae aplikacije.
54

Razvoj aplikacija za operativni sistem Android

Definisanje podataka aplikacije kao resursa je dobra veba programiranja.


Grupisanje resursa aplikacije i njihovo spajanje u paket aplikacije ima
sledee koristi:
-

Kod je jasniji i laki za itanje, to dovodi do manje greaka.


Resursi su organizovani po tipovima i sigurno su jedinstveni
Resursi su dobro smeteni za prilagoavanje telefonima

55

Razvoj aplikacija za operativni sistem Android

4.2.Tipovi resursa
Android aplikacije koriste veliki broj razliitih tipova resursa kao to je
tekst, grafika, eme u boji za dizajn korisnikog interfejsa itd. Ovi resursi se
nalaze u res/ direktorijumu vae android aplikacije.
Fajlovi resursa sauvani u /res direktorijumu moraju da potuju sledea
pravila:
-

Imena fajlova resursa moraju biti napisani malim slovima


Imena fajlova resursa mogu sadrati samo slova, brojeve, donju crtu,
i take
Imena fajlova resursa (i XML atributi imena) moraju biti jedinstveni.

U narednoj tabeli prikazano je kako se uvaju resursi koje podrava


Andoird SDK.
Tip resursa

Naziv

XML tag

Strings
Niz stringova

Potreban
direktorijum
/res/values/
/res/values/

strings.xml
strings.xml

Boolenas
Colors
Dimensions
Integers
Meovit niz

/res/values/
/res/values/
/res/values/
/res/values/
/res/values/

bools.xml
Colors.xml
Dimens.xml
integers.xml
Arrays.xml

Jednostavni
elementi
(Drawables)
Graphics
(slike)
Meni

/res/values/

drawables.xml

<string>
<string-array>,
<item>
<bool>
<color>
<dimen>
<integer>
<array>,
<item>
<drawable>

/res/drawable/

Icon.png,
logo,jpg itd
Primer:
mainmenu.xml
helpmenu.xml

XML fajlovi
Izgled
(Layouts)
Stilovi i teme
Animacija

/res/menu/
/res/xml/
/res/layout/
/res/values/
/res/drawable/

<menu>

main.xml
styles.xml
themes.xml
Primer.
sekvenca1.xml
sekvenca2.xml

<style>
<animationlist>, <item>

Tabela 3.1. Kako organizovati resurse u Android projektu


56

Razvoj aplikacija za operativni sistem Android

4.3.Rad sa resursima
U ovom delu bie prikazano kako moete upravljati resursima u vaoj
Andoird aplikaciji, koji formati su podrani i u kom formatu se uvaju. Neke
vrste resursa kao to su tekst, boja itd. su veoma dobro podrane od
strane Eclipse editora i Andoird Plug-in Resource Editor, dok drugi kao to
su animirane sekvence, nisu i sa njima je lake raditi direktno editovanjem
u XML datotekama.
4.3.1.Rad sa stringovima

String resursi su najjednostavniji tip resursa sa kojima moe da radi


Developer. Stringove moete promeniti ili dodati editovanjem xml datoteke
strings.xml. String se cuva u okviru taga <string>. U prilogu sledi primer
kako izgleda strings.xml
<?xml version=1.0 encoding=utf-8?>
<resources>
<string name=naziv_aplikacije>Moja prva aplikacija</string>
<string name=test_string>Test 1,2,3</string>
<string name=test_string2>Test 4,5,6</string>
<string
name=formatiran_text><b>Bold</b>,<i>Italic</i>,<u>Line</u></stri
ng>
</resources>
U narednoj liniji koda prikazano je kako moete odreenom stringu u xm
fajlu pristupiti i koristiti u aplikaciji:
String nazivAplikacije = getResources().getString(R.string.naziv_aplikacije);
4.3.2.Rad sa nizom stringova

Android podrava rad sa nizom stringova. Ovo je veoma pogodno kada


elite da u nekoj padajuoj listi prikaete vie opcija. Niz stringova se u
XML fajlu definie na putanji rez/values/ i kompajlira se u trenutku
izvravanja aplikacije. Niz stringova u XML-u se uva u okviru tagova
<string-array> i tagom za predstavljanje elemenata niza <item>. U
nastavku
moete
videti
kako
se
u
xml
fajlu
na
putanji
rez/values/arrays.xml uva niz stringova:
<?xml version=1.0 encoding=utf-8?>
<resources>
<string-array name=predmeti>
<item>Elektronsko poslovanje</item>
<item>Internet tehnologije</item>
<item>Mobilno poslovanje</item>
</string-array>
57

Razvoj aplikacija za operativni sistem Android

<string-array name=Predavaci>
<item>Marijana Zrakic Despotovic</item>
<item>Bozidar Radenkovic</item>
</string-array>
</resources>
Pristup resursima je veoma jednostavno, u konkretnom primeru pristup
resursu predmeti radimo na sledei nain:
String[] predmeti = getResources().getStringArray(R.array.predmeti);
4.3.3.Rad sa Boolean i Integer resursima

Boolean vrednosti se uvaju na putanji rez/values/bools.xml. Ovako izgleda


primer uvanja Bool vrednosti:
<?xml version=1.0 encoding=utf-8?>
<resources>
<bool name=podrzanSrpskiJezik>true</bool>
<bool name=podrzanIzborJezika>false</bool>
</resources>
Kada se eli resursu pristupiti iz Android aplikacije to se radi na sledei
nain:
boolean
podrzanIzborJezika
getResources().getBoolean(R.bool.podrzanIzborJezika);

Na slian nain se radi i sa Integer resursima, jedina razlika jeste tagovi


koji se koriste i putanja na kojoj se uvaju integer resursi
rez/values/nums.xml.
<?xml version=1.0 encoding=utf-8?>
<resources>
<integer name=sabirakA>25</integer>
<integer name=sabirakB>3</integer>
</resources>
Pristup integer resursima iz Android alikacije izgleda ovako:
int sabirakA = getResources().getInteger(R.integer.sabirakA);

58

Razvoj aplikacija za operativni sistem Android

4.3.4.Rad sa bojama

Android aplikacija u stanju je da skladiti vrednosti RGB boje, to


automatski obezbeuje da se te boje primene i na druge elemente ekrana.
Vrednosti koje se uvaju, mogu se iskoristiti za podeavanje boje teksta ili
pozadine ekrana apliakcije. Vrednosti za boje uvaju se u XML fajlu na
putanji rez/values/colors.xml.
Android podravaja rad sa sledeim formatima boja:

#RGB (primer, #F00 , 12-bit boja red)


#ARGB (primer, #8F00 , 12-bit boja, crvena sa transparetnosti do
50%)
#RRGGBB (primer, #FF00FF, 24-bit boja, purpurcrvena)
#AARRGGBB (primer, #80FF00FF , 24-bit boja, purpurcrvena sa
transparetnosti do 50%)

Primer skladitenja boja:


<?xml version=1.0 encoding=utf-8?>
<resources>
<color name=background_color>#006400</color>
<color name=text_color>#FFE4C4</color>
</resources>
Sledea linija koda vraa vrednost odreene boje:
int mojaBoja = getResources().getColor(R.color.mojaBoja);
4.3.5.Rad sa resursima koji se crtaju

Resursi koji se crtaju, kao to su slike, moraju se sauvati u /res/drawable


direktorijumu projekta. Ovi tipovi resursa se onda sastavljaju u paket
aplikacije i dostupne su aplikaciji.
Najei resursi koji se crtaju su bitmap slike, kao to su PNG i JPG fajlovi.
Ovi fajlovi se esto koriste kao ikonice aplikacije i slike dugmia ali se
mogu koristiti i za veliki broj komponenti korisnikog interfejsa.
Resursi slika su u klasi BitmapDrawable. Kako bi se pristupilo grafikom
resursu koji se zove /res/drawable/logo.png, treba se koristiti komanda
getDrawable(), po sledeem redosledu:
BitmapDrawable
logoBitmap
(BitmapDrawable)getResources().getDrawable(R.drawable.logo);

Veinu vremena, meutim, grafika ne mora da se otvara direktno. Umesto


toga, moe se koristiti identifikator resursa kao atribut za kontrolu kao to
je kontrola ImageView.
59

Razvoj aplikacija za operativni sistem Android

<ImageView
android:id="@+id/LogoImageView "
android:src="@drawable/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Sledei kod, na primer, postavlja i otvara logo.png sliku u kontroli
ImageView koja se zove LogoImageView, koja mora biti definisana unutar
fajla za layout (main.xml):
ImageView logoView = (ImageView)findViewById(R.id.LogoImageView);
logoView.setImageResource(R.drawable.logo);
Takoe se moe kreirati specijalni XML fajl kako bi se opisale druge
Drawable podklase, kao to je ShapeDrawable. Moe se koristiti klasa
ShapeDrawable da bi se definisali razni oblici, kao to je pravougaonik i
krug.
4.3.6.Rad sa menijima

Prilikom razvoja aplikacije, stalno se javlja potreba za kreiranjem menija


funkcionalnosti. Andird podrava rad sa menijima, meni se kao i ostali
resursi skladite u direktorijumu rez/menu/. Svaki resurs menija, koji
predstavlja skup pojedinanih stavki menija, se skladipti kao posebno
formatirana XML datoteka i kompajliraju se u vreme izvravanja aplikacije.
U nastavku sledi prikaz jednostavnog menija koji je skladiten u
rez/menu/speed.xml koji predstavlja meni jedne proste aplikacije :
<menu xmlns:android
=http://schemas.android.com/apk/res/android>
<item
android:id=@+id/start
android:title=Startuj aplikaciju!
android:orderInCategory=1></item>
<item
android:id=@+id/stop
android:title=Stopiraj aplikaciju!
android:orderInCategory=4></item>
<item
android:id=@+id/ubrzaj
android:title=Ubrzaj aplikaciju!
android:orderInCategory=2></item>
<item
android:id=@+id/uspori
android:title=Uspori aplikaciju!
android:orderInCategory=3></item>
60

Razvoj aplikacija za operativni sistem Android

</menu>

61

Razvoj aplikacija za operativni sistem Android

Meni se moe kreirati i korienjem Eclipse dodatka koji moe pristupati


konfiguracionim atributima za svaku stavku menija. U predhodnom
primeru smo direktno u xml fali postavili naziv stavke menija, inae ti
stringovi se takoe mogu izdvojiti iz tog fajla i kasnije lokalizovati na vie
jezika. Primer menija gde su definisani samo nazivi resursa, gde se
vrednost resursa uzima kasnije iz konkretnog xml fajla.
<menu xmlns:android=
http://schemas.android.com/apk/res/android>
<item
android:id=@+id/start
android:title=@string/start
android:orderInCategory=1></item>
<item
android:id=@+id/stop
android:title=@string/stop
android:orderInCategory=2></item>
</menu>
Da bi se koristio predhodno napisan meni potrebno je u aplkaciji pozvati
resurs koji je skladiten na putanji rez/menu/speed.xml tako to se
overajduje metoda nadreene klase onCreateOptionsMenu() u android
aplikaciji.
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.speed, menu);
return true;
}
Ovim je meni kreiran i to je sve. Sada, ako se pokrene aplikacija i pritisne
taster meni dobie se meni koji je gore definisan. Postoji veliki broj atributa
koji se moe dodeliti nekoj stavki menija, spisak svih stavki moete
pogledati
u
zvaninoj
dokumentaciji
za
Andoird
SDK
http://d.android.com/guide/topics/resources/menu-resource.html.

62

Razvoj aplikacija za operativni sistem Android

4.3.7.Rad sa fajlovima

Kao dodatak stringu, grafici i layout resursima, Android projekti mogu


sadrati fajlove kao resurse. Ovi fajlovi mogu biti u bilo kom formatu.
Meutim, neki formati su pogodniji nego drugi.
XML fajl format je dobro podran na Android platformi. Proizvoljni XML
fajlovi mogu biti ukljueni kao resursi. Ovi XML fajlovi se uvaju u /res/xml
direktorijumu. XML fajlovi su preferirani format za bilo koje strukturisane
podatke koje aplikacija trai. Kako se formatira XML fajl zavisi od
developera. Razliiti XML alati su dostupni za Android platformu.
Primer xml fajla:
<?xml version=1.0 encoding=utf-8?>
<predmeti>
<predmet name=Mobilno poslovanje type=izborni />
<predmet name=Elektronsko poslovanje type=obavezan />
<predmet name=ITEH type=izborni />
</predmeti>
XML resursu iz aplikacije moe se pristupiti na sledei nain:
XmlResourceParser
mojiPredmeti
getResources().getXml(R.xml.mojiPredmeti);

Aplikacija moe sadrati .raw fajlove kao resurse. Raw fajlovi koje
aplikacija moe koristiti sadri audio, video i druge fajlove. Svi raw fajlovi
resursa bi trebali biti sauvani u /res/raw direktorijum.
Nema pravila ili ogranienja pri kreiranju raw fajlova (osim pravila o nazivu
fajla koji je ranije pomenut). Ako treba ubaciti multimedia fajlove, treba
proveriti dokumentaciju Android platforme kako bi se odredili koji su media
formati i kodeci podrani za traeni mobilni telefon. Isto vai i za bilo koji
drugi format koji treba da se ubaci u resurse aplikacije.Ako format fajla koji
treba da se koristi nije podran u poetnom Android sistemu, aplikacija e
moda zatraiti da sama odradi proveru fajlova.
Da bi se pristupilo raw fajlu programerski, jednostavno treba koristiti
komandu openRawResource(). Na primer, sledei kod bi napravio
InputStream objekat da bi pristupio resurs fajlu /res/raw/file1.txt:
InputStream iFile = getResources().openRawResource(R.raw.file1);

63

Razvoj aplikacija za operativni sistem Android

4.3.8.Rad sa rasporedom (Layout)

Veina korisnikih interfejsa Android aplikacija se definiu koristei


specijalni XML fajl koji se zove layout. Resursi rasporeda su u /res/layout
direktorijumu. Layout fajlovi se sastavljaju u aplikaciju kao i svaki drugi
resurs. Oni esto definiu ceo ekran i povezani su sa odreenom
aktivnou, ali i ne moraju da budu. Resursi rasporeda takoe mogu
definisati deo ekrana i mogu biti deo nekog drugog rasporeda.
<?xml version=1.0 encoding=utf-8?>
<LinearLayout
xmlns:android=http://schemas.android.com/apk/res/android
android:orientation=vertical
android:layout_width=fill_parent
android:layout_height=fill_parent>
<TextView
android:layout_width=fill_parent
android:layout_height=wrap_content
android:text=@string/hello />
</LinearLayout>
Ovo je obian raspored, koji se zove main.xml, koji se pravi sa svakom
Android aplikacijom. Ovaj layout file opisuje korisniki interfejs jedine
aktivnosti u aplikaciji. Sadri kontrolu LinearLayout koja se koristi kao skup
za sve druge kontrole korisnikog interfejsa. U ovom sluaju to je kontrola
TextView.
Main.xml layout fajl sadri i druge resurse: string resurs @string/hello, koji
je definisan u strings.xml resurs fajlu koji sadri tekst Moja prva Android
aplikacija!
Nakon pokretanja aplikacije, izgled ekrana je sledei:

64

Razvoj aplikacija za operativni sistem Android

Slika 3.2. Prikaz pokrenute Android aplikacije.


Postoje dva naina da se formiraju resursi rasporeda. Najjednostavniji
nain je da se koristi Layout Resource Editor u Eclipsu da bi se dizajnirali
layout fajlovi. Takoe se mogu direktno menjati XML layout fajlovi.
4.3.9.Rad sa stilovima

Korisniki interfejs Andoird aplikacije, dizajneri mogu ureivati korienjem


stilova. Kontrola rasporeda elemenata izvedena je iz View klase, koja ima
veliki broj korisnih osobina.
Stilovi se oznaavaju tagom <style> koji su smeteni u direktorijum
rez/values/ . Stilovi se takoe definiu u XML fajlu a potom se kompajliraju
u vreme izvravanja aplikacije. Stilovi se ne mogu pregledavati
korienjem Eclipse Resource designer-a ali se ispravno prikazuju na
emulatoru kao i na samom ureaju.
U nastavku sledi jednostavan primer kako se koriste stilovi koji su smeteni
u fajlu rez/values/styles.xml. Definisana su dva stila, prvi stil je za
obavezna polja u formularu, dok drugi je za neobavezna polja. Obavezna
polja bie predstavljena crvenom bojom i veliinom slova 14p koja e biti
boldovana, dok opciona plja bie predstavljena belom bojom, iskoena i
veliina 12p.
<?xml version=1.0 encoding=utf-8?>
<resources>
<style name=obavezna_polja_style>
<item name=android:textColor>#e4101a</item>
<item name=android:textSize>14pt</item>
<item name=android:textStyle>bold</item>
</style>
65

Razvoj aplikacija za operativni sistem Android

<style name=opciona_polja_style>
<item name=android:textColor>#FFFFFF</item>
<item name=android:textSize>12pt</item>
<item name=android:textStyle>italic</item>
</style>
</resources>

4.3.10.

Rad sa temama

Tema predstavlja skup stilova koji se primenjuju na sve elementu neke


aktivnosti. Teme se definiu na isti nain kao i stilovi, koristi se tag <style>
koji se uva u rez/values/ direktorijumu. Jedina razlika to temu od stilova
izdvaja jeste to to tema mora de se definie kao atribut aktivnosti u
AndoirdManifest.xml fajlu.
<application android:theme="@style/CustomTheme">
<activity android:theme="@style/CustomTheme">

66

Razvoj aplikacija za operativni sistem Android

4.4.Referenciranje sistemskih resursa


Sistemski resursi se koriste na isti nain kao i resursi same aplikacije.
Android paket sadri sve vrste resursa, koje moete pretraivati u
android.R podklasu.
U ovoj podklasi mogu se nai sledei sistemski resursi za:
Animiranje sekvence ka unutra ili ka spolja
Liste imejlova, telefona itd.
Standardni sistem boja,
Dimenzije i primenu slika i ikona,
Sistem stilova i tema,
Poruke o grekama,
Kreiranje rasporeda elemenata kao i crtanje jednostavnih elemenata.
Referncijaranje sistemskih resursa je na isti naina kao i kada se koriste
spostveni resursi. Npr ako eli podesiti da boja teksta bude svetlo siva
potrebno je podesiti atribut @android:color/darker_gray. Sistemskim
resursima se pristupa na isti nain kako se pristupa resursima aplikacije.
android.R.string.ok

67

Razvoj aplikacija za operativni sistem Android

5. Elementi korisnikog interfejsa


Postoje dva naina dizajniranja korisnikog interfejsa: proceduralno i deklarativno.
Proceduralni dizajn odnosi se na pisanje Java koda, a deklarativni na pisanje XML
(eng. Extensible Markup Language) koda. U praksi se za kreiranje grafikog
korisnikog interfejsa uglavnom koristi XML.Primer 3.4 predstavlja primer
proceduralnog dizajna.
Kreiranjem interfejsa aktivnosti dobijaju svoju funkcionalnost, tj. vidljivost na
ekranu ureaja i na taj se nain omoguava interakciju sa korisnikom. Osnovne
jedinice korisnikog interfejsa su objekti pogled (View) i grupe pogleda
(ViewGroup):

pogled objekat ija prenos struktura u sebi nosi zapis izgleda i sadraja
odreenog pravougaonog podruja na ekranu, upravlja iscrtavanjem
elemenata, pomeranjem sadraja na ekranu (scrolling) i ostalim faktorima
koji utiu na izgled definisanog dela ekrana. U hijerarhijskom stablu objekti
pogled su listovi stabla. Android raspolae sa ve gotovim skupovima
objekata ove vrste kao to su dugmad, kvadratii za odabir (eng.
checkbok) i slino. Ovi objekti nasleuju klasu View;
grupe pogleda posebna vrsta objekta pogled koja sadri i upravlja
grupom zavisnih objekata pogleda i grupe pogleda ime je omoguena
kompleksnost prikaza korisnikog interfejsa. Objekti ove vrste su inastance
klase ViewGroup.

Slika 5.32 Hijerarhijski prikaz elemenata korisnikog interfejsa

68

Razvoj aplikacija za operativni sistem Android


Iscrtavanje elemenata stabla zapoinje od korena stabla tako to aktivnost prvo
poziva svoju setContentView() metodu i Android operativnom sistemu predaje
referencu na koreni objekat. Svaki podvor iscrtava se sam pozivanjem draw()
metode i to pod uslovom da vor sam postavlja zahtev za lokacijom i veliinom,
ali roditeljski vor (grupa pogleda) donosi konanu odluku o veliini prostora za
iscrtavanje podvora i njegovoj lokaciji na ekranu. Svaka grupa pogleda je
odgovorna za renderovanje prikaza svojih podvorova.

5.1.XML layout
Naa prva Android aplikacija (Primer 3.4) koristila je najjednostavniji pogled
TextView koji slui za prikaz teksta i bila je dizajnirana proceduralno, to znai da
nije korien XML prilikom dizajniranja korisnikog interfejsa. S obzirom da je
poeljno koristiti deklarativan dizajn prilikom kreiranja sloenijeg korisnikog
interfejsa, u daljem tekstu bie opisan postupak kreiranja Hello world
aplikacijekorienjem XML tehnologije za dizajn korisnikog interfejsa. Jedna od
najveih prednosti deklarativnog dizajna jeste potpuna odvojenost dizajna
korisnikog interfejsa od aplikacione logike. To znai da male promene u kodu
nee uticati na dizajn aplikacije i obrnuto. Deklarisanje TextView pogleda pomou
XML-a obavlja se na sledei nain:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/zdravo"/>
Primer 5.6 XML prikaz TextView pogleda

Ovo predstavlja XML layout fajl, u kome je opisan dizajn korisnikog interfejsa.
Struktura ovog fajla je jednostavna. U pitanju je stablo sainjeno od XML
elemenata, gde svaki njegov vor u stvari predstavlja pogled koji se koristi u
aplikaciji (naziv View klase). U ovom primeru naveden je samo jedan View
element, a to je TextView. U okviru XML layout fajla mogue je koristiti bilo koju
klasu koja je izvedena (nasleena) iz klase View, to podrazumeva i korisnike
izvedene klase.
U primeru 5.1 korien je samo jedan element TextView sa svojih pet atributa.
Znaenje ovih atributa prikazano je u sledeoj tabeli:
Atribut
xmlns:android

android:id

Znaenje
Ovo predstavlja naziv XML imenskog prostora. Poto je vrednost ovog atributa
android, to znai da e se koristiti atributi deklarisani u okviru Android imenskog
prostora. vorovi najvieg hijerarhijskog poloaja u Android layout fajlu moraju da
poseduju ovaj atribut.
Ovaj atribut dodeljuje jedinstveni identifikator elementu TextView. Dodeljeni ID je
mogue koristiti za referenciranje ovog pogleda u izvornom kodu ili drugim XML
deklaracijama.

69

Razvoj aplikacija za operativni sistem Android

android:layout_width
android:layout_height

android:text

Ovaj atribut odreuje koliko e ovaj pogled da zauzme irine ekrana. U ovom sluaju,
ovo je jedini pogled koji se koristi, te je mogue zauzeti itav ekran, to oznaava
vrednost atributa "fill_parent".
Ovaj atribut se ponaa slino atributuandroid:layout_width. Razlika je u tome to se
atribut android:layout_height odnosi na dostupnu visinu ekrana.
Ovde se ubacuje eljeni tekst koji TextView treba da prikae. U ovom primeru, koristi
se resurs tipa string (umesto direktno unete vrednosti stringa). Ovaj string je
definisan u fajlu res/values/strings.xml . Prilikom ubacivanja stringova u aplikaciju
preporuuje se korienje resursa, a ne direktni unos vrednosti stringova. Ovo je
dobra praksa zato to omoguava lokalizaciju aplikacije, odnosno mogunost
viejezinosti, bez imena koda layout fajla.

Tabela 5.3 Znaenje atributa elementa TextView

XML layout fajlovi nalaze se u folderu /res/layout/ u okviru projekta.


Dodatak za Eclipse automatski kreira podrazumevani layout fajl, main.xml. U
primeru 5.1 ovaj fajl je ignorisan, a sam layout je kreiran direktno u kodu. Da bi
se koristio XML layout, neophodno je nainiti odgovarajue izmene.
Najpre je potrebno otvoriti fajl /res/layout/main.xml, u njega ubaciti kod prikazan
u primeru 5.1 i sauvati izmene.
Zatim treba otvoriti fajl /res/values/strings.xml. Ovde se nalaze vrednosti
stringova koji se koriste u aplikaciji. Potrebno je ubaciti sledei kod:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="zdravo">Hello world!</string>
<string name="app_name">Hello world application</string>
</resources>
Primer 5.7 Fajl strings.xml

String zdravo se prikazuje u okviru TextView-a, a string app_name se odnosi na


naziv same aplikacije koji e se prikazivati na Android ureaju.
Sada je potrebno promeniti sadraj klase Aktivnost. Neophodno joj je staviti do
znanja da treba da koristi XML layout. Nakon izmena, klasa Aktivnost izgleda
ovako:
package net.myelab.android.mojaaplikacija;
import android.app.Activity;
import android.os.Bundle;
public class Aktivnost extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Primer 5.8 Klasa Aktivnost

70

Razvoj aplikacija za operativni sistem Android


Dakle,

odgovarajuim

XML

layout-ima

se

pristupa

pozivanjem

atributa

R.layout.naziv_layouta, to predstavlja reprezentaciju kompajlovanog objekta

odgovarajueg

XML layout-a. Ovi objekti se


/gen/paket/R.java, koji ne treba runo modifikovati.

uvaju

okviru

fajla

Izmenjenu aplikaciju je sada mogue pokrenuti na standardni nain.


U daljem tekstu bie prikazano vie grupa pogleda (layouta) i pogleda (views) koji
se mogu koristiti prilikom dizajniranja korisnikog interfejsa. Uz svaki pogled
priloen je izvorni kod odgovarajueg primera.

5.2.Layouts
5.2.1.LinearLayout
LinearLayout predstavlja grupu pogleda koja prikazuje vie pogleda, horizontalno

ili vertikalno. Ukoliko se koristi ugnjedavanje vie LinearLayout-a, bolje je


umesto njega koristiti RelativeLayout.

Slika 5.33 LinearLayout

Sadraj fajla res/layout/main.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"

71

Razvoj aplikacija za operativni sistem Android


android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<TextView
android:text="red"
android:gravity="center_horizontal"
android:background="#aa0000"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"/>
<TextView
android:text="green"
android:gravity="center_horizontal"
android:background="#00aa00"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"/>
<TextView
android:text="blue"
android:gravity="center_horizontal"
android:background="#0000aa"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"/>
<TextView
android:text="yellow"
android:gravity="center_horizontal"
android:background="#aaaa00"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<TextView
android:text="row one"
android:textSize="15pt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:text="row two"
android:textSize="15pt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:text="row three"
android:textSize="15pt"

72

Razvoj aplikacija za operativni sistem Android


android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:text="row four"
android:textSize="15pt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
Primer 5.9 Sadraj fajla res/layout/main.xml

U opisu ovog layout-a postoji koreni element LinearLayout. On definie vertikalnu


orijentaciju i ima dva izvedena vora tipa LinearLayout. Prvi vor je horizontalne
orijentacije, a drugi vertikalne. Svaki od ovih vorova poseduje svoje izvedene
TextViewvorove koji prikazuju neki sadraj.
Sada je potrebno kreirati poetnu aktivnost projekta i podesiti manifest fajl.
Izvorni kod aktivnosti:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Primer 5.10 LinearLayout aktivnost

Sada se aplikacija moe pokrenuti.

73

Razvoj aplikacija za operativni sistem Android

5.2.2.RelativeLayout
RelativeLayoutpredstavlja grupu pogleda koja prikazuje vie View elemanata

korienjem relativnih pozicija. Pozicije su relativne u odnosu na element istog


nivoa hijerarhije ili u odnosu na celo podruje RelativeLayout-a.

Slika 5.34 RelativeLayout

Sadraj fajla res/layout/main.xml:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Type here:"/>
<EditText
android:id="@+id/entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background"
android:layout_below="@id/label"/>
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/entry"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"

74

Razvoj aplikacija za operativni sistem Android


android:text="OK" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/ok"
android:layout_alignTop="@id/ok"
android:text="Cancel" />
</RelativeLayout>
Primer 5.11 Sadraj fajla res/layout/main.xml

Dakle, za opisivanje pozicije elemenata koriste se atributi


layout_alignParentRighti layout_toLeftOf.

layout_below,

Sada je potrebno kreirati poetnu aktivnost projekta i podesiti manifest fajl. U


sledeem kodu prikazana je samo onCreate() metoda ove aktivnosti:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Primer 5.12 RelativeLayout aktivnost

75

Razvoj aplikacija za operativni sistem Android

5.2.3.TableLayout
TableLayoutje grupa pogleda koja prikazuje svojeView elemente u redovima i

kolonama.

Slika 5.35 TableLayout

Sadraj fajla res/layout/main.xml:


<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_column="1"
android:text="Open..."
android:padding="3dip" />
<TextView
android:text="Ctrl-O"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView
android:layout_column="1"
android:text="Save..."
android:padding="3dip" />
<TextView
android:text="Ctrl-S"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<TableRow>

76

Razvoj aplikacija za operativni sistem Android


<TextView
android:layout_column="1"
android:text="Save As..."
android:padding="3dip" />
<TextView
android:text="Ctrl-Shift-S"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TableRow>
<TextView
android:text="X"
android:padding="3dip" />
<TextView
android:text="Import..."
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView
android:text="X"
android:padding="3dip" />
<TextView
android:text="Export..."
android:padding="3dip" />
<TextView
android:text="Ctrl-E"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TableRow>
<TextView
android:layout_column="1"
android:text="Quit"
android:padding="3dip" />
</TableRow>
</TableLayout>
Primer 5.13 Sadraj fajla res/layout/main.xml

Primeujemo da nain formiranja tabele u ovom layout-u podsea na formiranje


tabele u HTML-u. Element TableLayout analogan je tagu <table> u HTML-u, a
77

Razvoj aplikacija za operativni sistem Android


element TableRow analogan je elementu <tr>. Kao elije tabele mogu se koristiti
bilo koji View elementi. U ovom sluaju se koristi TextView. Na kraju, ostaje kod
poetne aktivnosti, koji je isti kao u prethodna dva primera. Ovde je samo
prikazana onCreate metoda ove aktivnosti:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
Primer 5.14 RelativeLayout aktivnost

78

Razvoj aplikacija za operativni sistem Android

5.2.4.GridView
GridViewpredstavlja grupu pogleda koja prikazuje elemente u dvodimenzionalnoj

mrei sa mogunou skrolovanja. Elementi se ubacuju pomou ListAdapter-a. U


ovom primeru bie prikazano kreiranje mree sa malim slikama (thumbnails).
Kada se izabere neka od njih, toast poruka e prikazati poziciju slike.

Slika 5.36 GridView

Sadraj fajla res/layout/main.xml:


<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"/>
Primer 5.15 Sadraj fajla res/layout/main.xml

Zatim je neophodno kreirati podrazumevanu aktivnost. Njena onCreate() metoda


prikazana je u sledeem primeru:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

79

Razvoj aplikacija za operativni sistem Android

GridView gridview = (GridView) findViewById(R.id.gridview);


gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int
position, long id) {
Toast.makeText(HelloGridView.this, "" + position,
Toast.LENGTH_SHORT).show();
}
});
}
Primer 5.16 RelativeLayout aktivnost

Nakon podeavanja podrazumevanog (main) layout-a za prikaz sadraja,


aplikacija odgovarajui GridView pogled preuzima iz layout-a uz pomo metode
findViewById(int). Metoda setAdapter() postavlja odgovarajui izvor podataka
koje e prikazati GridView. U ovom primeru se koristi ImageAdapter. Klasa
ImageAdapter bie definisana u narednom koraku.
Da bi bilo mogue reagovati na dogaaj kada se izabere stavka mree, poziva se
metoda koja oslukuje te dogaaje. Njen naziv je setOnItemClickListener(), a
prosleuje joj se dogaaj OnItemClickListener. U ovom primeru, prilikom samog
poziva metode kreira se instanca tog dogaaja. Konano, definie se prikaz toast
poruke sa indeksom izabranog elementa.
Sada je potrebno definisati klasu ImageAdapter koja definie nain popunjavanja
mree:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;

80

Razvoj aplikacija za operativni sistem Android


if (convertView == null) { // if it's not recycled, initialize
some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7
};
}
Primer 5.17 Klasa ImageAdapter

Najpre

se

implementiraju

metode

roditeljske

klase

BaseAdapter.

Metoda

getCount() vraa ukupan broj elemenata ovog adaptera. Metoda getItem() vraa

element koji se nalazi na prosleenoj poziciji. Metoda getItemId() vraa id reda


elementa. U ovom primeru se ove metode ne koriste (vraaju respektivno null i
0).
Metoda getView() kreira novi pogled za svaku sliku iz ImageAdapter-a. Njoj se
prosleuje pogled za koji se proverava da li je null. Ukoliko jeste, ImageView je
instanciran i konfigurisan. Ukoliko ova vrednost nije null, to znai da je ImageView
ranije instanciran i u tom sluaju se koristi taj objekat.
Metode
setLayoutParams(),
setScaleType()
i
setPadding()
respektivno
podeavaju dimenzije pogleda, tip skaliranja i razmak izmeu elemenata.
Na kraju bi trebalo napomenuti da je neophodno ubaciti eljene slike u folder
res/drawable/.

81

Razvoj aplikacija za operativni sistem Android

5.2.5.TabLayout
Korienje kartica (tabova) prilikom izrade korisnikog interfejsa veoma je
popularno. Android platforma omoguava dva razliita pristupa prilikom izrade
ovakvog korisnikog interfejsa. Prvi pristup jeste jednostavna promena pogleda u
okviru iste aktivnosti prilikom izbora eljene kartice, a drugi pristup je promena
itave aktivnosti prilikom izbora kartice. U bilo kom sluaju, neophodno je
korienje klasa TabHostiTabWidget. TabHost predstavlja koreni vor layout-a. U
okviru njega nalaze se elementi TabWidget za prikaz dostupnih kartica i
FrameLayout za prikaz sadraja izabrane kartice.

Slika 5.37 TabLayout

U ovom primeru, svakoj kartici bie dodeljena razliita aktivnost.


Najpre je neophodno kreirati tri razliite aktivnosti. To su ArtistsActivity,
AlbumsActivity iSongsActivity. Svaka od njih e biti prikazana u posebnoj kartici.
Za poetak, svaka aktivnost e prikazivati odreenu poruku. Na primer:
public class ArtistsActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textview = new TextView(this);
textview.setText("This is the Artists tab");
setContentView(textview);
}
}
Primer 5.18 RelativeLayout aktivnost

82

Razvoj aplikacija za operativni sistem Android


Prethodni

kod

odnosio

se

na aktivnost ArtistsActivity. Za aktivnosti


AlbumsActivity i SongsActivity koristi se isti kod, uz izmenu poruke koja e se
prikazati. Treba uoiti da aktivnosti ne koriste XML layout, ve pomou koda
pozivaju TextView. Naravno, ove aktivnosti je neophodno ubaciti u Android
manifest fajl.Za svaku karticu potrebno je pripremiti dve ikone. Jedna se prikazuje
u sluaju kada je kartica izabrana, a druga kada kartica nije izabrana.

Slika 5.38 Primer izgleda ikona za kartice

U ovom primeru, ista ikona e se koristiti za svaku karticu. Slike ikona bi trebalo
ubaciti u folder res/drawable/. U istom folderu treba kreirati novi XML fajl i
nazvati ga ic_tab_artists.xml. Kod koji treba ubaciti u fajl je sledei:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Ikona koja se koristi za izabranu karticu -->
<item android:drawable="@drawable/ic_tab_artists_grey"
android:state_selected="true" />
<!-- Ikona koja se koristi za ostale kartice -->
<item android:drawable="@drawable/ic_tab_artists_white" />
</selector>
Primer 5.19 Fajl ic_tab_artists.xml

U fajl koji opisuje layout (res/layout/main.xml) treba ubaciti sledei kod:


<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>

83

Razvoj aplikacija za operativni sistem Android


Primer 5.20 Sadraj fajla res/layout/main.xml

Ovaj layout e prikazati kartice i omoguiti navigaciju izmeu svih ranije kreiranih
aktivnosti. Element TabHost zahteva elemente TabWidget i FrameLayout unutar
sebe. U zavisnosti od eljenog rasporeda ovih elemenata, mogu se koristiti
razliiti layout-i za njihovo pozicioniranje. Na primer, za njihovo vertikalno
pozicioniranje moe se koristiti LinearLayout. Element FrameLayout trenutno je
prazan zato to se sadraj trenutne kartice uzima iz tekue aktivnosti koja se
odnosi na tu karticu. Treba primetiti elementi TabWidget i FrameLayout imaju svoje
identifikatore. To su tabs i tabcontent, respektivno. Ova imena moraju da se
koriste kada neko referencira ove elemente.
Sada treba napraviti jo jednu aktivnost. Moe se izabrati njen proizvoljan naziv,
ali je vano da se u Manifest fajlu definie da je u pitanju poetna aktivnost. Ova
aktivnost e se razlikovati od ostalih, ranije spominjanih aktivnosti, zato to ona
nasleuje klasu TabActivity. U nastavku je dat skraeni kod poetne aktivnosti
(nije prikazan paket kojem klasa pripada, kao ni uvezene klase):
public class HelloTabWidget extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // Uzimaju se resursi
TabHost tabHost = getTabHost(); // Aktivnost TabHost
TabHost.TabSpec spec; // TabSpec za svaku karticu
Intent intent; // Intent za svaku karticu
// Instanciranje Intent-a
intent = new Intent().setClass(this, ArtistsActivity.class);
// Instanciranje TabSpec-a za svaku karticu i dodavanje TabHost-u
spec = tabHost.newTabSpec("artists").setIndicator("Artists",
res.getDrawable(R.drawable.ic_tab_artists))
.setContent(intent);
tabHost.addTab(spec);
// Sledi isti postupak za ostale kartice
intent = new Intent().setClass(this, AlbumsActivity.class);
spec = tabHost.newTabSpec("albums").setIndicator("Albums",
res.getDrawable(R.drawable.ic_tab_albums))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, SongsActivity.class);
spec = tabHost.newTabSpec("songs").setIndicator("Songs",
res.getDrawable(R.drawable.ic_tab_songs))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(2);
}
}
Primer 5.21 Poetna aktivnost aplikacije sa karticama

84

Razvoj aplikacija za operativni sistem Android


Poslednja linija koda podeava koja kartica predstavlja poetnu karticu u
aplikaciji.

5.2.6.ListView
ListViewpredstavlja

grupu pogleda koja kreira listu sastavljenu od vie


elemenata, sa mogunou skrolovanja. Elementi kojima se lista popunjava
definiu se pomou ListAdapter-a.

Slika 5.39 ListView

Prvo je potrebno napraviti layout. Fajl sa sledeim sadrajem treba snimiti kao fajl
/res/layout/list_item.xml. Navedeni layout definie izgled svakog elementa
pojedinano u listi.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>
Primer 5.22 Sadraj fajla res/layout/main.xml

Zatim treba kreirati poetnu aktivnost, koja umesto klase Activity nasleuje
klasu ListActivity. Priloenom kodu treba dodati naziv paketa u kome se nalazi i
uvezene klase, odnosno pakete.
public class HelloListView extends ListActivity {
@Override

85

Razvoj aplikacija za operativni sistem Android


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter
COUNTRIES));

(new ArrayAdapter<String>(this, R.layout.list_item,

ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
static final String[] COUNTRIES = new String[] {
"Srbija", "Madjarska", "Bugarska", "Rumunija", "Italija"
};
}
Primer 5.23 Glavna TabView aktivnost

Primetiemo da navedeni kod ne uitava layout fajl vezan za aktivnost, to se


obino radi metodom setContentView(). Umesto toga, metoda setListAdapter()
omoguava prikaz pogleda ListView preko itavog ekrana tekue aktivnosti.
ArrayAdapter omoguava popunjavanje liste elementima odreenog niza.
Konstruktor klase ArrayAdapter prihvata parametre konteksta (Context) aplikacije,
referencu na layout svakog elementa ( main.xml, Primer 5 .22) i referencu ka nizu
u kome se nalaze elementi koje elimo da prikaemo u ovoj listi. U ovom sluaju,
taj niz se zove COUNTRIES i kreiran je posle metode onCreate(), u klasi aktivnosti.
Metodom setTextFilterEnabled() omoguuje se filtriranje liste. Ukoliko je
vrednost postavljena na true, omoguava se filtriranje liste kada korisnik
aplikacije ukuca deo naziva odreenog elementa.
Zatim se oslukuju onItemClick() dogaaji. Ukoliko nastupi ovaj dogaaj (korisnik
izabere odreeni element liste), prikazuje se toast poruka.
Ovime je zavrena aplikacija koja prikazuje listu. Ubacivanje vrednosti kljunih
varijabli u kod nije dobro reenje. Mnogo je bolje vrednost niza koji popunjava
listu ubaciti u neki XML fajl u okviru resursa. Na primer, moemo kreirati fajl
res/values/strings.xml, sa sledeim sadrajem:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="countries_array">
<item>Srbija</item>
<item>Madjarska</item>

86

Razvoj aplikacija za operativni sistem Android


<item>Bugarska</item>
<item>Rumunija</item>
<item>Italija</item>
</string-array>
</resources>
Primer 5.24 Sadraj fajla res/values/strings.xml

Da bi se koristili elementi iz XML fajla umesto niza koji je definisan u klasi


aktivnosti, potrebno je promeniti liniju koda:
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item,
COUNTRIES));

Umesto te linije, potrebno je ubaciti sledei kod:


String[] countries =
getResources().getStringArray(R.array.countries_array);
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item,
countries));
Primer 5.25 Kod za referenciranje resursa iz eksternog XML fajla

Ovim kodom omoguava se uzimanje resursa iz definisanog XML fajla. Sadraj i


funkcionalnosti aplikacije se ovim nee promeniti.

5.3.Meniji
Meniji su sastavni deo korisnikog interfejsa u veini aplikacija. Za prezentovanje
korisnikih akcija i drugih opcija u aktivnostima potrebno je koristiti
android.view.Menu klasu. Za sve tipove menija Android prua standardni XML
format za definisanje menija. Meniji se ne definiu u kodu aktivnosti ve se meniji
sa svim stavkama i podstavkama definiu u vidu XML datoteke u folderu
res/menu/ a zatim ukljuuju u aktivnost. Korienjem menija kao resursa
omogueno je razdvajanje menija od koda kao i kreiranje alternativnih menija za
razliite Android verzije, razliite veliine ekrana, itd. Da bi definisali meni
potrebno je u okviru projekta kreirati XML dokument u res/menu direktorijumu.
Obavezni delovi menija su:
<menu>
Ovaj element je koreni element sadri jedan ili vie
<item> i <group> elementa.
<item>
Kreira stavku menija. Ovaj element moe sadrati ugnjeden
<menu> element I na taj nain se formira struktura podmenija.
<group>

87

Razvoj aplikacija za operativni sistem Android


Ovo je opcioni, nevidljivi kontejner za <item> element. Omoguava
kategorizaciju stavki menija u cilju deljenja zajednikih karakteristika kao
to su vidljivost ili aktivno stanje.
Primer menija moj_meni.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/new_game"
android:icon="@drawable/ic_new_game"
android:title="@string/new_game"
android:showAsAction="ifRoom"/>
<item android:id="@+id/help"
android:icon="@drawable/ic_help"
android:title="@string/help" />
</menu>
<item> element ima podrku za nekoliko atributa koji se koriste za definisanje
ponaanja i naina pojavljivanja stavki menija. Stavke menija iz prethodnog
primera sadre i atribut android:showAsAction koji obezbeuje da se stavka
menija pojavi u action bar-u samo ako ima slobodnog mesta.Ukoliko nema mesta
stavka menija se pojavljuje u overflow meniju.U svakom meniju je mogue dodati
stavku menija koja predstavlja novi meni. Na primer:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/file"
android:title="@string/file" >
<!-- "file" submenu -->
<menu>
<item android:id="@+id/create_new"
android:title="@string/create_new" />
<item android:id="@+id/open"
android:title="@string/open" />
</menu>
</item>
</menu>
Da bi se meni koristio u aktivnosti potrebno je ubaciti meni kao resurs
korienjem MenuInflater.inflate().
5.3.1.Meni opcija
Meni opcija je osnovna kolekcija stavki menija za aktivnost. Korisnici otkrivaju
ovaj meni klikom na dugme Menu.

88

Razvoj aplikacija za operativni sistem Android

Options menu u pretraivau na Android 2.3.


Ukoliko se aplikacija razvija za verziju Android 2.3 ili niu sadraj menija opcija se
pojavljuje na dnu ekrana nakon klika na dugme Menu. Ovaj meni sadri do 6
stavki menija i ukoliko postoji vie stavki Android ostale stavke smeta u overflow
meni koji se otvara dodirom na taster More.
Da bi se naveo meni sa opcijama za neku aktivnost potrebno je prepisati metodu
onCreateOptionsMenu(). U ovoj metodi je mogue ubaciti na meni u vidu resursa
(definisan u XML fajlu) u Menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.moj_meni, menu);
return true;
}
Ukoliko se razvija aplikacija za Android 2.3.x i nie verzije sistem poziva metodu
onCreateOptionsMenu() kako bi po kada korisnik po prvi put otovri meni kreirao
meni opcija.
5.3.1.1.

Obrada dodira kao dogaaja

Kada korisnik selektuje stavku menija iz menija opcija sistem poziva


onOptionsItemSelected() metod unutar nae aktivnosti. Ovaj metod prosleuje
selektovanu stavku menija. Identifikacija stavke je mogua pozivom getItemId(),
koja vraa jedinstveni ID stavke menija koji je definisan u android:id atributu
(unutar menija kao resursa). Ispitivanjem vrednosti ovog atributa mogue je
izvravati razliite akcije. Npr:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
89

Razvoj aplikacija za operativni sistem Android


// Handle item selection
switch (item.getItemId()) {
case R.id.new_game:
newGame();
return true;
case R.id.help:
showHelp();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Ukoliko je stavka menija uspeno obraena odgovor je TRUE u suprotnom je
potrebno pozvati onOptionsItemSelected() implementaciju superklase.
5.3.1.2.

Promena menija opcija tokom izvravanja

Nakon to sistem pozove metodu onCreateOptionsMenu(), zadrava instancu


napunjenog menija i vie ne poziva onCreateOptionsMenu() metodu osim ukoliko
meni
iz
nekog
razloga
postane
nevalidan.
Stoga
se
metoda
onCreateOptionsMenu() koristi samo za kreiranje inicijalnog menija opcija a ne za
izmene tokom ivotnog ciklusa aktivnosti.
Za izmene menija opcija koje se baziraju na dogaajima koji se deavaju tokom
ivotnog ciklusa aktivnosti koristi se metod onPrepareOptionsMenu(). Ovaj metod
prosleuje Menu objekat u trenutnom stanju pa je mogue vriti izmene kao to
su dodavanje, brisanje novih stavki ili onemoguavanje odreenih stavki.
U Android 2.3.x i niim verzijama sistem poziva onPrepareOptionsMenu() svaki
put kada korisnik otvori meni opcija (pritisne Menu dugme).
5.3.2.Kreiranje kontekstualnih menija
Kontekstualni meni je kretajui meni koji se pojavljuje kada korisnik izvrava
produeni klik na elementu. Omoguava akciju nad selektovanim sadrajem ili
okvirom u kojem se kontekst pojavljuje.

90

Razvoj aplikacija za operativni sistem Android

Prikaz kretajueg kontekstualnog menija (leva slika) i kontekstualnog action bar-a


(desna sllika).
Kontekstualni meni je mogue obezbediti za bilo koji pogled ali se najee koristi
za elemente u ListView i GridView-u.
Postoje dva naina za obezbeivanje kontekstualnih akcija:

Kretajui kontekstualni meni. Meni se pojavljuje kao pokretna lista stavki


menija. Korisnik moe da izvri kontekstualnu akciju nad jednim po jednim
elementom..
Kontekstualni action mode. Kontekstualni action bar se pojavljuje na vrhu
ekrana sa elementima koji utiu na selektovani element. Korisnici mogu da
izvravaju akcije nad vie elemenata istovremeno (ukoliko to aplikacija
dozvoljava). Ova opcija je omoguena samo na verzijama Android 3.x i
viim.

5.3.3.Kreiranje kretajueg kontekstualnog menija


1) Registruje se pogled (View) sa kojim e kontekstualni meni biti povezan
pozivom registerForContextMenu() i prosleivanjem odgovarajueg pogleda.
Ukoliko aktivnost koristi ListView ili GridView i potrebno je da svaka stavka ima
isti
kontekstualni
meni
dovoljno
je
proslediti
ListView ili GridView ka
registerForContextMenu()
2) Potrebno je implementirati metodu onCreateContextMenu() u konkretnoj
aktivnosti. Kada registrovani pogled dobije dogaaj dugog klika sistem poziva
onCreateContextMenu() metodu. Tamo su definisane stavke menija obino
ubacivanjem u resurse menija. Na primer:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
91

Razvoj aplikacija za operativni sistem Android


ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
MenuInflater omoguava da se kontekstualni meni ubaci iz resursa menija.
Parametri callback metode ukljuuju pogled koji je korisnik selektovao a objekat
ContextMenu.ContextMenuInfo obezbeuje dodatne informacije o selektovanom
elementu. Ukoliko aktivnost ima nekoliko pogleda koje obezbeuju razliite
kontekstualne menije ovi parametri se mogu koristiti kako bi se donela odluka koji
kontekstualni meni je potrebno ubaciti.
3) Implementirati onContextItemSelected().
Kada korisnik selektuje stavku menija sistem poziva ovaj metod kako bi se
uzvrile odreene akcije. Na primer:
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
editNote(info.id);
return true;
case R.id.delete:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
Metod getItemId() ispituje ID kod selektovane stavke menija koji se dodeljuje
svakoj stavci u XML dokumentu, tanije u android:id atributu. Ukoliko se stavka
menija neuspeno obradi potrebno je stavku menija proslediti superklasi.
5.3.4.Iskaui meni
Popup meni prikazuje listu stavki u vertikalnoj listi koja je povezana sa pogledom
koji poziva meni. Akcije u iskauem meniju ne bi trebalo da utiu odgovarajui
sadraj za to su zaduene kontekstualne akcije. Iskaui meniji se koriste za
dodatne akcije koje se odnose na delove sadraja unutar akrivnosti.

Iskaui meni u Gmail app povezan sa overflow dugmetom (gore desno).


Iskaui meni je dostupan od verzije Android 3.x i vie.
92

Razvoj aplikacija za operativni sistem Android


5.3.5.Kreiranje meni grupa
Meni grupa je skup stavki menija koje imaju odreene osobine. Sa grupom je
mogue:
Prikazivanje ili skrivanje svih stavki sa setGroupVisible()
Omoguavanje ili onemoguavanje svih stavki sa setGroupEnabled()
Definisati da li je sve stavke mogue ekirati pomou setGroupCheckable()
Grupu je mogue kreirati gnjeenjem <item> elemenata unutar
<group> elementa u resursima menija ili definisanjem grupnog ID elementa
korienjem add() metode.
Primer kako je mogue unutar resura menija obuhvatiti grupu::
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_save"
android:icon="@drawable/menu_save"
android:title="@string/menu_save" />
<!-- menu group -->
<group android:id="@+id/group_delete">
<item android:id="@+id/menu_archive"
android:title="@string/menu_archive" />
<item android:id="@+id/menu_delete"
android:title="@string/menu_delete" />
</group>
</menu>
Stavke koje se u grupi pojavljuju na isptom nivou su braa i sestre. Mogue je
promeniti osobine dve stavke iz grupe referenciranjem grupnog ID-a i
korienjem prethodno opisanih metoda ali sistem nee nikada razdvojiti
grupisane
stavke.
Na
primer
ukoliko
se
deklarie
android:showAsAction="ifRoom" za svaku stavku, one e se ili obe pojaviti u
action bar-u ili u action overflow-u.
5.3.5.1.

Korienje stavki menija koje se ekiraju

Ovaj meni je veoma koristan kada je u pitanju interfejs pomou kojeg se neka
opcija ukljuuje ili iskljuuje ili za grupu meusobno iskljuivih opcija.

93

Razvoj aplikacija za operativni sistem Android

Prikaz podmenija koji sadri stavke koje se ekiraju.


Mogue je definisati da neka stavka menija ima ekirajuu osobinu korienjem
android:checkable atributa u <item> elementu, ili da cela grupa ima tu osobinu
korienjem
android:checkableBehavior atributa
u <group> elementu.
Na
primeru je prikazano da su sve stavke iz grupe u formi radio dugmeta koje se
moe ekirati:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item android:id="@+id/red"
android:title="@string/red" />
<item android:id="@+id/blue"
android:title="@string/blue" />
</menu>
android:checkableBehavior atribut prihvata samo sledee osobine:
single Samo jedna stavka iz grupe moe biti selektovana (radio dugme)
all Sve stavke mogu biti ekirane (checkboxes)
none Nijednu stavku nije mogue ekirati
Mogue je primeniti podrazumevano stanje na stavku
korienjem android:checked atributa u <item> elementu i promene u kodu
korienjem setChecked() metode.
Kada je stavka koju je mogue ekirati selektovana sistem poziva odgovarajuu
(za tu stavku) callback metodu (kao to je onOptionsItemSelected()). Obavezno je
da se izvri postavka stanja checkbox-a iz razlga to checkbox ili radio dugme
ne menjaju automatski svoje stanje. Potrebno je proveriti stanje stavke (isto kao
94

Razvoj aplikacija za operativni sistem Android


pre selektovanja) pomou isChecked() metode i onda postaviti stanje pomou
setChecked() metode. Na primer:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.vibrate:
case R.id.dont_vibrate:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Ako se stanje ne postavi na ovaj nain onda se vidljivo stanje stavke nee
promeniti kada ga korisnik selektuje. Sa druge stanje kada se stanje postavi na
prethodno opisan nain aktivnost uva ekirano stanje i prilikom ponovnog
otvaranja menija novoekirano stanje je vidljivo korisniku.Stavke menija koje se
ekiraju se koriste samo po sesiji i nee biti sauvane kada se sesija uniti.

5.4.Dogaaji u okviru korisnikog interfejsa


Obrada dogaaja u okviru korisnikog interfejsa se zasniva na hvatanju dogaaja
u okviru specifinog pogleda (View) sa kojim korisnik trenutno interaguje. U
okviru svake od podklasa klase View nalazi se nekolicina javnih metoda koje
mogu biti korisne za UI dogaaje. Android frejmwork poziva ove metode kada se
god desi neka akcija nad definisanom klasom, odnosno objektom. Na primer,
kada korisnik dodirne odreeni View (na primer Button), poziva se onTouchEvent()
metoda nad tim objektom. Da bi se ovaj dogaaj obradio, neophodno je proiriti
odgovarajuu klasu i realizovati override metode. Meutim, proirivanje svakog
pojedinanog tipa View-a da bi se obradio dogaaj, nije najbolje reenje. S tim u
vezi, klasa View sadri kolekciju ugnedenih interfejsa sa callbacks koji se
jednostavnije definiu. Ovi interfejsi se zovu event listeners.
5.4.1.Event listeners
Event listener je interfejs u okviru View klase koji sadri jednu callback metodu.
Ove metode se pozivaju od strane Androida kada korisnik preko UI interaguje sa
View objektom za koji je listener registrovan.
Event listener interfejsi obuhvataju sledee callback metode:
onClick()

95

Razvoj aplikacija za operativni sistem Android


Iz View.OnClickListener. Ova metoda se poziva kada korisnik: dodirne
elemenat, fokusira se na elemenat, pritisne enter ili pritisne pokaziva nad
elementom.
onLongClick()
Iz View.OnLongClickListener.
Obuhvata dogaaje koji se odnose na
zadravanje ulaznog dodira/fokusa i sl. nad odreenim elementom.
onFocusChange()
Iz View.OnFocusChangeListener. Odnosi se na situaciju kada korisnik
postavlja ili uklanja focus sa nekog elementa.
onKey()
Iz View.OnKeyListener. Odnosi se na situaciju kada je korinsik postavio
focus na neki element i pritiska ili puta dugme na telefonu.
onTouch()
Iz View.OnTouchListener. Bilo koja aktivnost na ekranu kategorizovana kao
dodir, obuhvatajui pritisak, putanje ili pokret preko ekrana.
onCreateContextMenu()
Iz View.OnCreateContextMenuListener.
kontekstualni meni (oblast 5.4).

Poziva

se

kada

se

kreira

Sve ove metode su jedini lanovi svojih interfejsa. Da bi se ove metode definisale
potrebno je implementirati ugnedene interfejse u okviru Aktivnosti ili ih
definisati kao anonimne klase. Nakon toga, alje se instanca implementiranog
interfejsa ka odgovarajuem View. SetListener (na primer poziva se
setOnClickListener() a njemu se prosleuje OnClickListener).
U primeru je prikazano kako se registruje on-click listener za Button view:
// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
}
};
protected void onCreate(Bundle savedValues) {
...
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
...
}
Ili se on-click listener moe implementirati u okviru Aktivnosti:
96

Razvoj aplikacija za operativni sistem Android


public class ExampleActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedValues) {
...
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(this);
}
// Implement the OnClickListener callback
public void onClick(View v) {
// do something when the button is clicked
}
...
}
U primeru onclick() nema povratnu vrednost, ali neki drugi listener events moraju
vratiti boolean vrednost, to zavisi od konkretnog dogaaja.
Umesto korienja OnClickListener-a za dugme u okviru aktivnosti, mogue je
dodeliti odgovarajui metod dugmetu u okviru XML layouta. Na primer:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/tekstd"
android:onClick="mojametoda" />
Kada korisnik klikne na dugme Android e automatski pozvati metodu
mojametoda. View koji se prosleuje predstavlja referencu ka videtu koji je
kliknut.
public mojamteoda (View v)
{
Toast.makeText(Nazivaktivnosti.this, "Button clicked",
Toast.LENGTH_LONG).show();
}
U ovom primeru mojametoda ispisuje kratku poruku u vidu notifikacije da je
dugme kliknuto. Toast je specifian view koji sadri poruku za korisnika. Toast
view se prikazuje kao kretajui natpis iznad aplikacije i nikad ne dobija fokus.
Ideja je da se korisnik ne uznemirava dok neto radi, ali da mu se ipak prikae
odreena informacija. Jedan od primera je podeavanje jaine zvuka ili
obavetenje da su podeavanja sauvana.

Sledei primer ilustruje obradu dogaaja nad poljem za unos teksta:


<EditText
android:id="@+id/txt"
android:layout_width="match_parent"
97

Razvoj aplikacija za operativni sistem Android


android:layout_height="wrap_content"
/>
Neophodno je implementirati OnKeyListener. U okviru metode onKey koja
prihvata 3 paramtera, u primeru se prate pritisci na dugmad i kada se pritisne
dugme ENTER ispisuje se poruka na ekranu. Da bi se iitao tekst koji je korsnik
uneo u polje, potrebno je pozvati metodu getText() (edittext.getText())
public class Nazivaktivnosti extends Activity implements OnKeyListener
....
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nov);
EditText edittext = (EditText) findViewById(R.id.txt);
edittext.setOnKeyListener(this);
....

public boolean onKey(View v, int keyCode, KeyEvent event) {


if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
// Perform action on key press
Toast.makeText(Nazivaktivnosti.this, "Potvrdili ste unos",
Toast.LENGTH_SHORT).show();
return true;
}
return false;
}

Sledei primer se odnosi na obradu selektovanja checkbox elementa:


<CheckBox android:id="@+id/checkbox"

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="check it out"
android:onClick="onCheckboxClicked"/>
U okviru Aktivnosti potrebno je ubaciti implementaciju odgovarajue metode:
public void onCheckboxClicked(View v) {
98

Razvoj aplikacija za operativni sistem Android


// Perform action on clicks, depending on whether it's now checked
if (((CheckBox) v).isChecked()) {
Toast.makeText(SubotaActivity.this, "Selected",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(SubotaActivity.this, "Not selected",
Toast.LENGTH_SHORT).show();
}
}

Sledei primer se odnosi na obradu selektovanja radiobutton elementa:


<RadioGroup
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton android:id="@+id/radio_red"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Red"
android:onClick="onRadioButtonClicked"/>
<RadioButton android:id="@+id/radio_blue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Blue"
android:onClick="onRadioButtonClicked"/>
</RadioGroup>
U okviru Aktivnosti potrebno je ubaciti implementaciju odgovarajue metode:
public void onRadioButtonClicked(View v) {
// Perform action on clicks
RadioButton rb = (RadioButton) v;
Toast.makeText(HelloFormStuff.this, rb.getText(), Toast.LENGTH_SHORT).show();
}

99

Razvoj aplikacija za operativni sistem Android


Upravljanje fokusom
Android okruenje omoguava praenje fokusa nad elementima, odnosno View
objektima. Fokus se menje tako to View nestaje, ili se sakriva u pozadini ili se
pojavljuje novi View. Svaki View objekat moe podesiti svoju dostupnost za fokus
pomou metode setFocusable(), odnosno ispitati fokus pomou metode
isFocusable().
Pomeranje fokusa se zasniva na algoritmu najblieg suseda (objekta View na
ekranu) u datom pravcu. U sluaju kada je potrebno izmeniti default pomeranje
fokusa, mogu se iskoristit sledei XML atributi u okviru lazout fajla:
nextFocusDown, nextFocusLeft, nextFocusRight, and nextFocusUp. Na primer
<LinearLayout
android:orientation="vertical"
... >
<Button android:id="@+id/top"
android:nextFocusUp="@+id/bottom"
... />
<Button android:id="@+id/bottom"
android:nextFocusDown="@+id/top"
... />
</LinearLayout>
Bez dodatnih atributa, navigacija na gore od prvog dugmeta i navigacija na dole
od drugog dugmeta ne bi vodila nikud. Kada se ubace dodatni atributi,
omoguena je navigacija u oba smera.
Ukoliko je potrebno definisati neki View kao focusable, potrebno je dodati
android:focusable XML attribut u View u okviru layout deklaracije i podesiti ga na
true. Da bi se postavio focus na odreeni View poziva se funkcija requestFocus().

5.5.Rad sa obavetenjima Notifications


Postoje situacije kada je potrebno obavestiti korisnika da se desio neki dogaaj u
okviru aplikacije, iako aplikacija moe da bude u pozadini u tom trenutku. Na
primer:

Kada se u pozadini preuzima neki fajl sa Interneta u momentu zavretka


downloada, trebalo bi porukom obavestiti korisnika da je proces zavren
Ako aplikacija radi u pozadini, ali je u nekim momentu potrebno da korisnik
definie dalje korake, javlja se notifikacija o tome
Ukoliko aplikacija neto radi dok korisnik eka, potrebno je obavestiti
korisnika o napretku ili vremenu ekanja
E-mail aplikacija moe da obavesti korisnika da je stigla nova poruka;

100

Razvoj aplikacija za operativni sistem Android

Aplikacije za vremensku prognozu, mogu da obaveste korisnika o


promenama vremena;
Aplikacije za berzu, mogu da obaveste korisnika ako je nastala neka
promena cena nekih akcija;
Itd.
Notifikacije se mogu realizovati na tri naina:
Toast notifikacija kratka poruka koja dolazi iz pozadine
Status bar notifikacija perzistentni reminder koji dolazi iz pozadine i zahteva
odgovor korisnika
Dialog notifikacija notifikacije vezane za aktivnosti
Korisnici znaju da cene ova obavetenja, jer dolaze do potrebnih informacija bez
da pokrenu aplikaciju. Meutim, postoji granica izmeu dobrog obavetajnog
sistema i onog koji preteruje sa notifikacijama, ne treba korisnika stalno
uznemiravati. Svako obavetenje treba da bude uraeno tako da na korisnika
deluje samo pozitivno.
Android platforma nudi nekoliko naina kako se mogu obavetavati korisnici.
Obavetenje se esto prikazuje u statusnoj liniji u gornjem delu ekrana.
Obavetenje moe da podrazumeva:
Tekstualne informacije
Grafika
Zvuk
Vibracija ureaja
Kontrola nad svetlosnim indikatorom
Napomena: prilikom rada sa notifikacijama bitno je da se zna da ne podravaju
svi android ureaji npr rad sa vibracijom ili sfetlosnim efektima telefona.
5.5.1.Toast notifikacije

Ova notifikacije predstavlja poruku na povrini prozora. Na kratko popunjava


jedan deo ekrana, a korisnikova aktivnost ostaje aktivna i vidljiva sve vreme.
Notifikacija tuomatski isezava sa ekrana i ne prihvata dogaaje. Moe se kreirati
i prikazati u okviru aktivnosti i servisa.

101

Razvoj aplikacija za operativni sistem Android


Context context = getApplicationContext();
CharSequence text = "Hello toast!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
toast.show();
5.5.2.Status bar notifikacije
Status bar notifikacija dodaje ikonu na sistemski status bar i poruku u
Notification prozoru. Kada korisnik selektuje poruku iz notifikacije, Android
poziva intent kojim se aktivira aktivnost kojoj notifikacija pripada. Ovaj tip
notifikacije moe da upozori korisnika i putem zvuka, vibracije ili svetla na
mobilnom ureaju. Najee se koristi kada akitvnost ili servis neto radi u
pozadini i ima potrebu da komunicira sa korisnikom u nekom momentu.

5.5.3.Dialog notifikacije
Dijalog notifikacija se najee javlja u okviru trenutno aktivne aktivnosti. Dijalog
od aktivnosti preuzima interakciju sa korisnikom. Dijalozi su objanjeni u sekciji
5.6.

5.6.Dijalozi
Android omoguava prikazivanje interaktivnih dijaloga koji u sebi mogu da sadre
bilo koje elemente korisnikog interfejsa. Neke vrste dijaloga dolaze sa
predefinisanim izgledom i namenom, a mogue je definisati i spostveni layout za
dijalog ili ak napraviti sopstvenu klasu na osnovu klase Dialog koja predstavlja
zajedniku nadklasu za sve vrste dijaloga.

102

Razvoj aplikacija za operativni sistem Android


Bez obzira na klasu dijaloga, potrebno je obratiti panju na nain njihovog
kreiranja. Najjednostavniji nain je da se dijalog kreira u samom kodu, tamo gde
je potrebno i zatim prikae pozivanjem metode show() nad objektom dijaloga.
Ovaj pristup je problematian, jer se o takvom dijalogu moramo sami starati u
sluaju promene konfiguracije telefona (tipino: u sluaju rotacije iz Portrait u
Landscape i obrnuto).
Dialog mojDijalog = new MojaKlasaDijaloga()
mojDijalog.show();

Bolja varijanta je da staranje o dijalogu prepustimo naoj aktivnosti u kojoj e


dijalog biti prikazan. Da bi to postigli, prvo moramo da implementiramo metodu
onCreateDialog(int) ili onCreateDialog(int, bundle). Int parametar u oba
sluaja predstavlja neki na ID dijaloga kojeg treba prikazati, a opcioni bundle
parametar predstavlja paket podataka koji se mogu proslediti pri kreiranju
dijaloga.
@Override
protected Dialog onCreateDialog(int id, Bundle args) {
Dialog rezultat;
switch(id) {
case 1:
rezultat = new MojaKlasaDijaloga(); break;
case 2:
rezultat = new NekiDrugiDijalog(); break;
}
return rezultat;
}

U ovoj metodi proveravamo koji dijalog se trai (npr. dijalog sa IDjem 1 je


upozorenje korisniku da se greka desila, a dijalog sa IDjem 2 mu nudi izbor
OK/CANCEL), pa zavisno od toga kreiramo odgovarajui dijalog i vraamo ga kao
rezultat.
Ova metoda e automatski biti pozvana kada korisnik prvi put pozove metodu
showDialog(int) ili showDialog(int, bundle). Pri sledeim pozivanjima e
biti upotrebljen postojei, ve kreirani dijalog. Ako doe do promene
konfiguracije, sama aktivnost e se postarati za ponovno iscrtavanje dijaloga.
showDialog(1, null); // hocemo prikaz greske (ID 1), ne saljemo Bundle

Ako nam je neophodno da napravimo neke izmene na dijalogu pri svakom


prikazivanju (npr. svaki put prikazujemo drugaijio tekst greke), onda moemo
pored onCreateDialog da implementiramo i metodu onPrepareDialog koja se
zove svaki put po pozivu metodu showDialog.
5.6.1.Kreiranje AlertDialog-a

103

Razvoj aplikacija za operativni sistem Android


Vri se pomou klase AlertDialog.Builder.
Moe se odrediti tekst poruke koja e biti prikazana
metodom setMessage, kao i broj dugmia (1/2/3),
tekst na njima i listeneri koji e reagovati na klik.
Dugmii i njihovi listeneri se dodaju metodama
setNeutralButton,
setPositiveButton
i
setNegativeButton. Sve navedene metode vraaju referencu na samog Buildera pa je omogueno pozivanje vie metoda u jednom redu
builder.metoda1().metoda2().metoda3();
AlertDialog.Builder builder = new AlertDialog.Builder(roditelj);
Dialog dijalog = builder.setMessage(idTeksta)
.setNeutralButton(R.string.standardOK, null)
.create();

5.6.2.Kreiranje dijaloga sa sopstvenim layout-om


U ovoj varijanti moramo prvo da kreiramo svoj
layout fajl u res/layout, a zatim, pri kreiranju dijaloga
prosledimo ID layouta koji elimo da se koristi. Dalja
procedura je ista kao pri radu sa layout-om
aktivnosti - vadimo reference na elemente layouta i
dodeljujemo im vrednosti/listenere po elji.
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.moj_lejaut);
dialog.setTitle(R.string.KvizKraj);
TextView polje1 = (TextView) dialog.findViewById(R.id.dijalog_polje1);
polje1.setText("tekst polja 1");
TextView polje2 = (TextView) dialog.findViewById(R.id.dijalog_polje2);
polje2.setText("tekst polja 2");

Korien layout (moj_lejaut.xml):


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dijalog_polje1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dijalog_polje2" />

104

Razvoj aplikacija za operativni sistem Android


</LinearLayout>

5.6.3.Druge vrste dijaloga


Druge, specifine vrste dijaloga je uglavnom dovoljno samo kreirati uz
odgovarajue parametre pri konstrukciji poto im je izgled predefinisan. Primeri
drugih vrsta dijaloga:

6.

Intents
Tri kljune komponente svake aplikacije aktivnosti, servisi i broadcast risiveri se
aktiviraju preko poruka intents. Razmena poruka preko intenta omoguava
kasno povezivanje tokom izvravanja izmeu izmeu komponenata u okviru iste
ili razliitih aplikacija. Objekat Intent je pasivna struktura podataka koja dri
apstraktan opis operacija koje treba da se izvre, ili u sluaju broadcast risivera,
opis neega to se dogodilo ili se objavljuje. Postoje odvojeni mehanizmi za
dopremanje intenta svakoj od tri navedene komponente:

Intent
objekat
se
alje
ka
Content.Activity()
ili
Activity.startActivityForResult() da bi se pokrenula aktivnost ili pozvala
postojea aktivnost da uradi neto novo (Takoe, Intent moe biti poslat ka
Activity.setResult() da bi se vratila informacija ka aktivnosti koja je pozvala
startActivityForResult().

Intent objekat se alje ka Context.startService() da bi se inicirao servis ili


dostavile nove instrukcije ka aktivnom servisu. Slino, intent moe biti
poslat ka Context.bindService() da bi se uspostavila veza izmeu
komponente koja poziva i ciljnog servisa. Opciono moe se inicirati servis
ako nije aktivan.

Intent objekti koji se alju nekoj od boradcast metoda kao to su:


Context.sendBroadcast(),Context.sendOrderedBroadcast(),
ili Context.sendStickyBroadcast()) se dostavljaju svim zainteresovanim
broadcast risiverima.

U svakom sluaju, Android sistem pronalazi odgovarajuu aktivnost, servis ili


broadcast risiver kao odgovor na intent poruku. Android poseduje pravila za
mapiranje intenta sa komponentama, odnosno na koji nain se odreuje
105

Razvoj aplikacija za operativni sistem Android


komponenta koja prima intent poruku. Za intente koji nemaju eksplicitno
definisanu ciljnu komponentu, neophodno je testirati Intent objekte u odnosu na
intent filtere povezane sa potencijalnim ciljnim komponentama.
Intent Objekat
Intent objekat je paket informacija. Sadri informacije od interesa za komponentu
koja prihvata intent (na primer akcija koju treba preduzeti i podaci nad kojim se
radi), kao i informacije od interesa za Android sistem (kao na primer kategorija
komponenti koja treba da prihvati intent i instrukcije kako da pokerene ciljnu
aktivnost).
Intent
objekat
sadri
(http://developer.android.com/reference/android/content/Intent.html):
Ime komponente
Ime komponente koja treba da upravlja Intentom. Ovo polje je objekat
ComponentName kombinacija imena klase ciljne komponente (na primer
android.elab.project.app. ImeAktivnosti) i ime package-a postavljenog u manifest
fajlu aplikacije u kojoj se komponenta nalazi (na primer android.elab.project). Ime
komponente se postavlja pomou setComponent (), setClass() ili setClassName(),
a ita se pomou getComponent ().
Action
String koji definie akciju koju treba realizovati, ili u sluaju broadcast Intenta,
akciju koja se desila i o kojoj se izvetava. Intent klasa definie vei broj
konstanti, obuhvatajui sledee:
Konstanta
Ciljna
Akcija
komponent
a
ACTION_CALL
activity
Iniciranje poziva
ACTION_EDIT
activity
Prikaza
podataka
za
editovanje
korisniku
ACTION_MAIN
activity
Zaponi kao inicijalnu aktivnost u
okviru aplikacije, bez ulaznih i izlaznih
podataka
ACTION_SYNC
activity
Sinronizuj podatke na serveru sa
podacima na mobilnom ureaju.
ACTION_BATTERY_LOW broadcast
Obavetenje da je baterija pri kraju.
receiver
ACTION_HEADSET_PLU broadcast
Slualice su utaknute ili istaknute iz
G
receiver
ureaja
ACTION_SCREEN_ON
broadcast
Ekran je uklljuen
receiver
ACTION_TIMEZONE_CH broadcast
Podeavanja za vremensku zonu su
ANGED
receiver
promenjena
Akcija u velikoj meri definie kako je struktuiran ostatak intenta, posebno polja
data i extras. Akcija u Intent objektu se postavlja pomou metode setAction() , a
ita se pomou getAction().
106

Razvoj aplikacija za operativni sistem Android


Neki od primera ureenog para action/data su:
ACTION_VIEW content://contacts/people/1 Prikazuje informacije o korisniku iji je
identifikator "1".
ACTION_VIEW tel:123 -telefonski broj.

Prikazuje telefonski brojanik I prikazuje navedeni

ACTION_EDIT content://contacts/people/1 Vri izmenu podataka o osobi iji je


identifikator "1".
ACTION_VIEW content://contacts/people/ -- Prikazuje listu osoba kroz koju korisnik
moe da pretrauje. Selektovanjem osobe za detaljniji prikaz otvara se novi
intent.
Data
Podaci o URI-ju na kome se nalaze podaci i MIME tip podataka. Razliite akcije su
uparene sa razliitim tipovima podataka. Ukoliko je action polje ACTION_EDIT
data polje e sadrati URI dokumenta koji je potrebno prikazati za edit-ovanje.
Ukoliko je action polje ACTION_CALL data polje e biti tel: URI sa brojem telefona
koji je potrebno pozvati. Ako je action polje ACTION_VIEW a data polje je http: URI
pozvana aktivnost e download-ovati i prikazati ono na ta upuuje navedeni URI.
Kada se uparuju intenti i komponente koje su sposobne da obrauju podatke
(data) potrebno je znati tip podataka (MIME tip) kao dodatak URI-ju. Komponentu
koja prikazuje slike ne bi trebalo pozivati kada je potrebno pustiti audio fajl. Tip
podataka se moe zakljuiti i iz URI-ja naroito iz content: URI koji ukazuje da su
podaci smeteni na ureaju i kontrolisani od strane dobavljaa sadraja. Meutim
tip podataka se moe eksplicitno postaviti u Intent objektu. setData() metod
navodi podatke samo kao URI, setType() navodi podatke samo kao MIME tip a
setDataAndType() navodi podatke i kao URI i kao MIME tip. Podatke o URI-ju je
mogue dobiti pomou getData() a podatke o tipu pomou getType() metode.
Category
Kategorija je string koji sadri dodatne informacije o komponenti koja treba da
obradi Intent. Intente klasa definie nekoliko predefinisanih kategorija neke od
njih su:
Kategorija

Znaenje

CATEGORY_BROWS
ABLE

Ciljana aktivnost se moe pozvati iz browser-a za


prikaz podataka koji su referencirani linkom (slika ili
e-pota).

CATEGORY_GADGE
T

Aktivnosi mogu biti ugraene u druge aktivnosti koje


hostuju alate (gadget)

CATEGORY_HOME

Aktivnost prikazuje poetni ekran tj. Prvi ekran koji


korisnik vidi kada je ureaj ukljuen i dugme Home je
pritisnuto.

107

Razvoj aplikacija za operativni sistem Android


Metoda addCategory() smeta kategoriju u Intent objekat, removeCategory()
brie prethodno dodatu kategoriju i getCategory() uzima skup svih kategorija koje
su trenutno u objektu.
Extras
Predstavljaju ureene parove koji nose dodatnu vrednost za komponentu koja
obrauje Intent. Kao to su neke akcije uparene sa specifinim vrstama URI-ja
tako su i neke akcije uparene sa posebnim dodacima.Na primer,
ACTION_TIMEZONE_CHANGED Intent ima "time-zone" extra koji identifikuje novu
vremensku zonu, ACTION_HEADSET_PLUG ima "state" extra koji ukazuje na to da
li su slualice ukljuene ili iskljuene kao i "name" extra koji definie tip slualica.
Intent objekat ima vie put...() metoda za ubacivanje razliitih tipova extra
podataka i analogne get...()methoe za itanje ovih podataka.
Flags
Android sistemu je mogue zadati instrukcije u sluaju pokretanja aktivnosti
(kojem zadtku pripada aktivnost) i kako je obraditi ukoliko je pokrenuta (da li ju je
potrebno dodati u listu prethodnih aktivnosti). Svi flegovi se definiu u Intent
klasi.

6.1.Vrste Intent-a
Intente moemo odeliti u dve grupe:
Eksplicitne intente odreuju ciljnu komponentu po imenu. Korienje
imena komponente nije dobar nain za korienje komponente iz drugih
aplikacija pa se ovaj pristup koristi za interne poruke aplikacije (za
pokretanje podreenog servisa ili za pokretanje aktivnosti na istom nivou.)

Implicitni intenti ne imenuju ciljnu komponentu (ime kopmonente je


prazno). Implicitni intenti se esto koriste za pokretanje aktivnih
komponenti u drugim aplikacijama.
Android isporuuje eksplicitne intent-e instanci dizajnirane klase. Nita osim
imena komponente nije bitno za odreivanje komponente koja obrauje Intent.
Eksplicitni Intenti se najee koriste u okviru jedne aplikacije. Ukoliko je dobro
poslat, Intent e aktivirati klasu Aktivnost2:
Intent i = new Intent (this, Aktivnost2.class);

Implicitni Intenti ne specificiraju Java klasu koju treba pozvati. Samo se definie
naziv akcije koju treba realizovati i opciono URI koji treba upotrebiti za akciju. Na
primer sledei intent govori Android OS-u da prikae veb stranicu. Iako je veb
brauzer registrovan za ovaj intent i druge komponente mogu biti prijavljene za
ovaj intent:

108

Razvoj aplikacija za operativni sistem Android


Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://www.myelab.net"));
Kada se implicitni intent poalje Androidu, on pretrauje sve komponente
registrovane za odreenu akciju i tip podataka. Ukoliko Android pronae samo
jednu komponentu, on je direktno startuje. Meutim, ako Android identifikuje vie
komponenata registrovanih za taj intent, otvara se dijalog koji trai od korisnika
da definie komponentu pomou koje e biti obraen intent. Komponenta koja
prihvata intent moe preuzeti informacije iz intenta preko metoda getAction() i
getData(). Komponenta koja kreira intent moe dodati podatke na intent preko
metode putExtra(). Extras su parovi klju/vrednost; a kljue je uvek String. Kao
vrednost se moe koristiti bilo koji primitivni tip podataka, String, Bundle i sl. Na
primer, sve komponente koje su registrovane za slanje podataka mogu se
aktivirati preko new Intent(Intent.ACTION_SEND.
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "News for you!");
// createChooser is a convenience method to create
// an Chooser Intent with a Title
startActivity(Intent.createChooser(sharingIntent,"Share this using"));
Komponenta
koja
prihvata
intent,
moe
uzeti
podatke
pomou
getIntent().getExtras()

Bundle extras = getIntent().getExtras();


if (extras == null) {
return;
}
// Get data via the key
String value1 = extras.getString(Intent.EXTRA_TEXT);
if (value1 != null) {
// Do something with the data
}
Za impicitne Intent-e Android sistem mora pronai najbolju komponentu za
obradu Intent-a jednu aktivnost, servis da izvri traenu radnju ili skup
broadcast prijemnika kao odgovor na broadcast objavu. To se vri uporeivanjem
sadraja Intent objekta i intent filters-a strukture povezane sa komponentama.
Filteri oglaavaju mogunosti komponente i razdvajaju Intent-e na one koji mogu i
koji ne mogu da obrade zahtev. Filteri objanjavaju koje implicitne intent-e
komponente mogu da obrade. Ukoliko komponenta nema intent filter ona moe
da obrauje samo eksplicitni intent. Komponente sa filterima mogu da obrauju i
eksplicitne i implicitne intent-e
Tri aspekta Intent objekta se posmatraju kada se objekat poredi sa intent filer-om.
To su:

Action
Data (i URI i tip podataka)
Category
109

Razvoj aplikacija za operativni sistem Android


Extras i flag-ovi nemaju nikakvog uticaja na reavanje problema koja komponenta
moe da obradi Intent
6.1.1.Intent filteri
Njihov zadatak je da informiu sistem koje implicitne filtere mogu da obrade.
Aktivnosti, servisi i broadcast prijemnici mogu da imaju jedan ili vie Intent filtera.
Svaki filter opisuje mogunosti komponente odnosno set Intenta koji je
komponenta spremna da obradi. Na ovaj nain filteri blokiraju neeljene Intente
ali samo neeljene implicitne intente. Eksplicitni intenti se uvek isporuuju bez
obzira na sadraj, odnosno filter se u ovim sluajevima uopte ne posmatra.
Impicitni intenti se isporuuju komponenti samo ukoliko prou jedan filter
komponente.
Komponente imaju razliite filtere za svaki posao koji moe da obavi. Na primer,
NoteEditor aktivnost (opisana kasnije) Note Pad aplikacije ima dva filtera jedan
za pokretanje odreene beleke koju korisnik moe pregledati ili izmeniti i drugi
za pokretanje nove, prazne beleke koju korisnik moe popuniti i sauvati.
Filteri i sigurnost
Oslanjanje na filtere kada je sigurnost u pitanju nije dovoljna. Iako otvara
komponentu samo za odreene zahteve od strane impicitnih filtera ne ini nita
da zatiti komponente od eksplicitnih intenta. Intent filter je instanca IntentFilter
klse. Meuti s obzirom da Android sistem mora znati mogunosti komponente pre
nego to je pokrene, intent filteri se ne postavljaju u Java kodu nego u manifest
fajlu aplikacije (AndroidManifest.xml) kao <intent-filter> element.
Filter ima polja koja su zaduena za action, data i category polja Intent objekta.
Implicitni intent se testira filterima iz sve tri oblasti. Da bi se isporuio
komponenti mora proi sva tri testa odnosno filtere iz sve tri oblasti. Ukoliko ne
proe bar jedan filter Android sistem ga nee isporuiti komponenti. Meutim
ukoliko komponenta ima vie intent filtera u svakoj oblasti dovoljno je da
zadovolji bar jedan filter iz oblasti kako bi ga sistem isporuio komponenti. Svaki
od ova tri testa su detaljnije objanjeni u tekstu koji sledi.
Action test
Element <intent-filter> u manifest fajlu prikazuje listu action elemenata u formi
<action> taga:
<intent-filter . . . >
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
...
</intent-filter>
Lista ne moe biti prazna, filter mora sadrati barem jedan <action> element, u
suprotnom e blokirati sve intente. Da bi proao ovaj test action definisan u

110

Razvoj aplikacija za operativni sistem Android


intent objektu se mora poklapati sa barem jednom od akcija definisanih u filteru.
Ako objekat ili filter ne navodi nijednu akciju, ishodi su sledei:

Ukoliko filter nema navedenu nijednu akciju ne postoji nita sa ime intent
moe da se podudara tj. svi intnti ne prolaze test. Nijedan intent ne prolazi
kroz filter.

Ukoliko Intent objekat ne precizira akciju automatski prolazi test sve dok
filter sadri barem jednu akciju

Category test
Element <intent-filter> prikazuje listu kategorija kao podelemente. Na primer:
<intent-filter . . . >
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
Konstante definisane u manifest fajlu se ne koriste ve se koriste puni nazivi
stringa. Na primer "android.intent.category.BROWSABLE" string je primer koji
korespondira sa CATEGORY_BROWSABLE konstantom definisanom ranije. Slino i
string "android.intent.action.EDIT" korespondira sa ACTION_EDIT konstantom.
Da bi intent proao test kategorije svaka kategorija u intent objektu mora se
poklapati sa kategorijom u filteru. Filter moe imati i dodatne kotegorije ali mora
sadrati sve koje su u intent-u. Iz tog razloga Intent objekat bez kategorija uvek
prolazi test bez obzira ta je u filteru. Meutim postoji jedan izuzetak. Android sve
implicitne intent-e koji su prosleeni ka startActivity() metodi tretira kao da
sadre barem jednu kategoriju i to "android.intent.category.DEFAULT"
(CATEGORY_DEFAULT konstantu). Iz tog razloga aktivnosti koje ele da primaju
implicitne intente moraju ukljuiti "android.intent.category.DEFAULT" u svoje
intent
filtere.
Filteri
sa
"android.intent.action.MAIN"
i
"android.intent.category.LAUNCHER" podeavanjima su izuzeci. Oni oznaavaju
aktivnosti koje poinju nove zadatke i koji se prikazuju na poetnom ekranu. One
mogu ukljuivati "android.intent.category.DEFAULT" u listi kategorija ali ne
moraju.)
Data test
Kao i action i category i data specifikacija je u vidu podelementa i moe se
pojavljivati vie puta. Na primer:
<intent-filter . . . >
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="audio/mpeg" android:scheme="http" . . . />
...
</intent-filter>

111

Razvoj aplikacija za operativni sistem Android


Svaki <data> element moe definisati URI i tip podataka (MIME tip podataka).
Postoje posebni atributi scheme, host, port, i path za svaki deo URI-ja:
scheme://host:port/path
Na primer, sledfei URI
content://com.example.project:200/folder/subfolder/etc
scheme je "content", host je "com.example.project", port je "200", i path je
"folder/subfolder/etc". Host i port zajedno ine URI authority;ako host nije
definisan port se ignorie.
Svaki od ovih atributa je opcion ali nisu nezavisni meu sobom. Authority zavisi
od scheme dok path to zavisi i od scheme i od authority-a.
Kada se URI u intent objektu poredi sa specifikacijom URI-ja u filteru on se poredi
samo sa definisanim delovima u filteru. Ukoliko filter definie samo scheme, svi
URI-ji sa tom emom se poklapaju sa filterom. Samo path specifikacija u filteru
moe sadrati specijalne znakove pomou kojih se omoguuje delimino
poklapanja path-a.
Atribu type u <data> elementu definie MIME tip podataka i mnogo se ee
koristi nego URI filter. I intent objekat i filter mogu koristiti "*" kao specijalni
karakter koji zamenjuje sve podtipove tog polja. Na primer: "text/*" ili "audio/*"
dozvoljavaju poklapanje i sa svim podtipovima.
Data test poredi i URI i tip podataka u Intent objektu sa URI-jem i tipom podataka
definisanom u filteru. Pravila su sledea:
a. Intent objekat koje ne sadri ni URI ni tip podataka prolazi test samo
ukoliko filter ne specificira nikakve URI ni tipove podataka.
b. Intent objekat koji sadri URI a ne sadri nikakav tip podataka (i tip
podataka se ne moe zakljuiti iz URI-ja) prolazi test samo ako se URI
poklapa sa Uri-jem u filteru i filter ne specificira nikakve tipove podataka.
c. Intent objekat koji sadri tipove podataka ali ne sadri URI prolazi test
samo ukoliko filter definie isti tip podataka a ne specificira URI.
d. Intent objekat koji sadri i URI i tip podataka (ili se tip podataka moe
zakljuiti iz URI-ja) prolazi test samo ukoliko se tip podataka poklapa se
tipom u filteru. URI test ili ako njegov URI odgovara URI-ju u filteru ili
ukoliko ima content: ili file: URI a filter ne specificira URI. Za komponentu
se porazumeva da podrava content: i file:.
Poslednje pravilo odraava oekivanje da su komponente sposobne da izvuku
lokalne podatke iz fajla ili od strane content provajdera. Iz tog razloga njihovi
filteri mogu navesti samo listu tipova podataka a ne moraju eksplicitno navoditi
112

Razvoj aplikacija za operativni sistem Android


imena content: i file: ema. Element <data> kao u primeru govori Androidu da
komponenta moe da uzme sliku od content dobavljaa i da je prilae:
<data android:mimeType="image/*" />
S obzirom da se veina podataka dobavlja od strane content dobavljaa filteri koji
odreuju tip podataka a ne definiu URI su najei. Filteri koji definiu scheme i
tip podataka su takoe veoma esti. Na primeru je prikazan <data> element koji
govori Androidu da komponenta moe da dopremi video materijal sa mree i da
ga prikae:
<data android:scheme="http" android:type="video/*" />
Ukoliko veb pretraiva sledi link ka nekoj veb stranici on prvo pokuava da
prikae sadraj te stranice i uspeva ukoliko je re o HTML stranici. Meutim
ukoliko ne moe da prikae podatke on sastavlja implicitni intent sa scheme i
tipom podataka i pokree aktivnost koja moe da obradi zahtev. Ukoliko nema
nikoga da obradi zahtev on aktivira preuzimaa datoteka kako bi preuzeo
podatke. Nakon toga ga preuzima content provider odnosno mnogo vie
aplikacija moe da odgovori na taj zahtev.
Sledea specifikacija prijavljuje aktivnost za intent koji se poziva kada neka
komponenta zatrai otvaranje veb stranice:
<activity android:name=".BrowserActivitiy" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
Primer definisanja aktivnosti za intent koji trai ACTION_SEND za text/plain tip
podataka
<activity
android:name=".ActivityTest"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
Mnoge aplikacije zapoinju bez referenciranja na podatke. Aktivnosti koje
inicijalizuju aplikacije imaju filtere "android.intent.action.MAIN" koji su
specificirani kao akcija. Ukoliko je potrebno da budu zastupljeni u application
launcher-u
potrebno
je
da
definiu
i
kategoriju
"android.intent.category.LAUNCHER":
<intent-filter . . . >
<action android:name="code android.intent.action.MAIN" />
113

Razvoj aplikacija za operativni sistem Android


<category android:name="code android.intent.category.LAUNCHER" />
</intent-filter>
Korienje poklapanja intent-a
Intenti se uparuju sa intent filterima ne samo da bi se odredilo koju komponentu
je potrebno aktivirati nego i iz razloga otkrivanja neega o setu komponenti
instaliranih na ureaju. Na primer: Android sistem popunjava application
launcher, tj. poetni ekran koji prikazuje sve aplikacije koje su dostupne korisniku
za pokretanje pronalaenjem svih aktivnosti iji intent filter specificira action
"android.intent.action.MAIN" i "android.intent.category.LAUNCHER" kategoriju
(kao u ranije navedenom primeru). On nakon toga prikazuje sve ikonice i labela
tih aktivnosti u application launcher-u. Na isti nain pronalazi home ekran
traenjem svih aktivnosti koje imaju "android.intent.category.HOME" u svom
filteru.
Svaka aplikacija moe veoma jednostavno koristiti uparivanje intent-a.
PackageManager klasa ima skup query...() metoda koje vraaju sve komponente
koje mogu da prihvate odreeni intent i skup slinih resolve...() metoda koje
odreuju komponentu koja najbolje odgovara zadatom intent-u. Na primer:
queryIntentActivities() vraa listu svih aktivnosti koje mogu da obrade intent koji
je prosleen kao parametar a queryIntentServices() vraa listu svih servisa koji
mogu da obrade intent koji je prosleen kao parametar dok metod,
queryBroadcastReceivers(), vraa listu broadcast receiver-a. Ove metode ne
aktiviraju komponente nego ih samo izlistavaju one koje mogu da obrade zahtev.
6.1.2.Primer belenice
Aplikacija Belenica (Note Pad) omoguava korisnicima da pregledaju listu
beleaka, da pogledaju detalje o odreenoj beleci, da menjaju beleke, ali i da
dodaju nove beleke u listu. Ovaj primer prikazuje upotrebu intent filtera koji su
prethodno deklarisani u manifest fajlu. Ukoliko su pomou Android SDK managera instalirani i odgovarajui primeri, izvorni kod ovog primera nalazi se u folderu
<sdk>/samples/NotePad/index.html, gde je <sdk> putanja do foldera gde se nalazi
instaliran Android SDK. Izvorni kod je takoe mogue pronai i na Internetu, u
odeljku Tutorials and Sample Code, odnosno ovde.
U svom manifest fajlu, aplikacija Belenica deklarie tri aktivnosti, a svaka od njih
poseduje najmanje po jedan intent filter. Takoe se deklarie i provajder sadraja
(content provider) koji upravlja podacima o belekama. Naredne linije koda
prikazuju definisan manifest fajl:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.notepad">
<application android:icon="@drawable/app_notes"
android:label="@string/app_name" >

114

Razvoj aplikacija za operativni sistem Android


<provider android:name="NotePadProvider"
android:authorities="com.google.provider.NotePad" />
<activity android:name="NotesList"
android:label="@string/title_notes_list">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>
<activity android:name="NoteEditor"
android:theme="@android:style/Theme.Light"
android:label="@string/title_note" >
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="com.android.notepad.action.EDIT_NOTE" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
</activity>
<activity android:name="TitleEditor"
android:label="@string/title_edit_title"
android:theme="@android:style/Theme.Dialog">
<intent-filter android:label="@string/resolve_title">
<action android:name="com.android.notepad.action.EDIT_TITLE" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.ALTERNATIVE" />
<category
android:name="android.intent.category.SELECTED_ALTERNATIVE" />
<data
android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
115

Razvoj aplikacija za operativni sistem Android


</activity>
</application>
</manifest>
Prva aktivnost, NotesList, razlikuje se od ostalih aktivnosti tako to ona upravlja
direktorijumom (listom) beleaka, a ne pojedinanim belekama. Ona praktino
slui kao poetni korisniki interfejs aplikacije. Omoguava izvrenje tri akcije,
definisane pomou tri intent filtera:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Ovaj filter deklarie glavnu ulaznu taku aplikacije Belenica. Standardna MAIN
akcija predstavlja ulaznu taku koja ne zahteva bilo koju drugu informaciju sa
Interneta (npr. specifikaciju podataka). Kategorija LAUNCHER definie da ova ulazna
taka treba da bude u pokretau (launcher) aplikacije.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
Ovaj filter deklarie akcije koje aktivnost moe da izvri nad direktorijumom
beleaka. On omoguava korisniku da pregleda ili edituje direktorijum (pomou
akcija VIEW i EDIT) ili da uzme odgovarajuu beleku iz direktorijuma (akcija PICK).
Atribut mimeType elementa <data> specifikuje tip podataka nad kojima se akcija
izvrava. Oznaava da aktivnost moe da dobije Cursor za nula ili vie unosa
(vnd.android.cursor.dir) od provajdera sadraja koji uva podatke aplikacije
Belenica (vnd.google.note). Objekat Intent koji startuje aktivnost treba da sadri
URI content: koji tano definie koje podatke ovog tipa aktivnost treba da otvori.
Treba napomenuti da se i kategorija DEFAULT nalazi u ovom filteru, zato to metode
Context.startActivity() i Activity.startActivityForResult() posmatraju sve intente
kao da sadre DEFAULT kategoriju, uz dva izuzetka:

Intenti koji eksplicitno spominju ciljanu aktivnost


Intenti koji sadre akciju MAIN i kategoriju LAUNCHER

Dakle, kategorija DEFAULT je obavezna za sve filtere, osim za one koji sadre akciju
MAIN i kategoriju LAUNCHER.

116

Razvoj aplikacija za operativni sistem Android


<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
Ovaj filter opisuje mogunost da aktivnost vrati beleku koju je korisnik izabrao,
ali bez zahtevanja bilo kakve specifikacije direktorijuma iz koga korisnik treba da
izabere odreenu beleku. Akcija GET_CONTENT je slina akciji PICK. U oba sluaja,
aktivnost vraa URI beleke koju je korisnik izabrao. (U oba sluaja, URI se vraa
aktivnosti startActivityForResult() da bi se startovala aktivnost NoteList) Razlika
je u tome to ovde pozivalac definie koji tip podataka ga interesuje, a ne
direktorijum podataka iz kog korisnik uzima podatke.
Tip podataka vnd.android.cursor.item/vnd.google.note definie tip podataka koji
aktivnost moe da vrati URI iz jedne beleke. Iz vraenog URI-a, pozivalac moe
da dobije Cursor za samo jednu stavku (vnd.android.cursor.item), i to od provajdera
sadraja koji poseduje podatke aplikacije Belenica ( vnd.google.note).
Drugim reima, za akciju PICK iz prethodnog filtera, ovaj tip podataka definie tip
podataka koji aktivnost moe da prikae korisniku. Za filter GET_CONTENT, on
definie tip podataka koji aktivnost moe da vrati pozivaocu.
Zahvaljujui ovim mogunostima, sledei intenti reavaju aktivnost NotesList:
1.
2.

3.

4.

5.

Akcija: android.intent.action.MAIN
Opis: Pokree aktivnost bez definisanih podataka.
Akcija: android.intent.action.MAIN
Kategorija: android.intent.category.LAUNCHER
Opis: Pokree aktivnost bez definisanih izabranih podataka. Ovo je intent
koji se koristi od strane pokretaa da popuni svoju glavnu listu. Sve
aktivnosti sa filterima koji sadre ovu akciju i kategoriju dodaju se na listu.
Akcija: android.intent.action.VIEW
Podaci: content://com.google.provider.NotePad/notes
Opis: Trai od aktivnosti da prikae sve beleke iz
content://com.google.provider.NotePad/notes. Korisnik moe da pregleda listu
i da dobije sve informacije o njenim stavkama.
Akcija: android.intent.action.PICK
Podaci: content://com.google.provider.NotePad/notes
Opis: Trai od aktivnosti da prikae listu beleaka iz
content://com.google.provider.NotePad/notes. Korisnik moe da izabere
beleku iz liste, a aktivnost e vratiti URI te stavke natrag aktivnosti koja je
startovala aktivnost NoteList.
Akcija: android.intent.action.GET_CONTENT
Tip podataka: vnd.android.cursor.item/vnd.google.note
Opis: Trai od aktivnosti da vrati jednu beleku iz podataka aplikacije
Belenica.
117

Razvoj aplikacija za operativni sistem Android


Druga aktivnost, NoteEditor, prikazuje korisnicima jedan unos i omoguuje im
njegovu izmenu. Ove dve akcije opisane su pomou dva intent filtera:
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="com.android.notepad.action.EDIT_NOTE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
Prva i primarna svrha ove aktivnosti je da omogui korisnicima da vre interakciju
sa jednom belekom, odnosno da vide i menjaju beleku. Intent bi sadrao URI
podataka koji se poklapaju sa MIME tipom vnd.android.cursor.item/vnd.google.note,
to je URI za jednu, specifinu beleku. To bi tipino bio URI koji vraaju akcije PICK
ili GET_CONTENT aktivnosti NoteList.
Kao i ranije, ovaj filter izlistava kategoriju DEFAULT, pa aktivnost moe da se
startuje pomou intenta koji ne definiu eksplicitno klasu NoteEditor.
<intent-filter>
<action android:name="android.intent.action.INSERT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
Druga svrha ove aktivnosti je da omogui korisnicima da kreiraju novu beleku,
koja e biti ubaena (INSERT) u postojei direktorijum beleaka. Intent e sadrati
URI
podataka
koji
se
poklapaju
sa
MIME
tipom
vnd.android.cursor.dir/vnd.google.note. To je URI direktorijuma u koji beleka treba
da bude smetena.
Sledei intenti su zadueni za aktivnost NoteEditor:
Akcija: android.intent.action.VIEW
Podaci: content://com.google.provider.NotePad/notes/ID
Opis: Trai od aktivnosti da prikae sadraj beleke sa odreenim ID-om.
2. Akcija: android.intent.action.EDIT
Podaci: content://com.google.provider.NotePad/notes/ID
Opis: Trai od aktivnosti da prikae sadraj beleke odreenog ID-a i
omoguava korisniku da izmene ovakvu beleku. Ako korisnik sauva
promene, aktivnost e aurirati podatke beleke kod provajdera sadraja.
3. Akcija: android.intent.action.INSERT
Podaci: content://com.google.provider.NotePad/notes
Opis: Trai od aktivnosti da kreira novu, praznu beleku u listi beleaka, na
lokaciji content://com.google.provider.NotePad/notes i omoguava korisniku
da izvri izmenu beleke. Ako korisnik sauva beleku, URI e biti vraen
pozivaocu.
1.

118

Razvoj aplikacija za operativni sistem Android

Poslednja aktivnost, TitleEditor, omoguava korisniku da izmeni naslov beleke.


Ovo je mogue implementirati direktnim pozivanjem aktivnosti (navoenjem
imena aktivnosti u intentu), bez korienja intent filtera. Meutim, ovde emo
prikazati kako je mogue objavljivanje razliitih operacija nad postojeim
podacima:
<intent-filter android:label="@string/resolve_title">
<action android:name="com.android.notepad.action.EDIT_TITLE" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.ALTERNATIVE" />
<category
android:name="android.intent.category.SELECTED_ALTERNATIVE" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>

Ova

aktivnost

koristi

jedan

intent filter koji koristi posebnu akciju


Trebalo bi da akcija bude izvrena nad
specifinom belekom (tip podataka vnd.android.cursor.item/vnd.google.note),
slino kao i kod VIEW i EDIT akcija. Ovde aktivnost prikazuje naslov koji se nalazi u
podacima beleke, a ne sam sadraj beleke.
com.android.notepad.action.EDIT_TITLE.

Editor naslova osim klasine kategorije DEFAULT podrava i dve ostale standardne
kategorije ALTERNATIVE i SELECTED_ALTERNATIVE. Ove kategorije identifikuju aktivnosti
koje mogu da budu predstavljene korisnicima u meniju sa opcijama na slian
nain kao to kategorija LAUNCHER identifikuje aktivnosti koje se predstavljaju
korisniku prilikom startovanja aplikacije. Treba obratiti panju da filter takoe
obezbeuje i eksplicitnu labelu (pomou android:label="@string/resolve_title"),
radi bolje kontrole ta korisnici mogu videti kao alternativne podatke podacima
koje trenutno pregledaju, kada im se prezentuje ova aktivnost (videti metode
PackageManager.queryIntentActivityOptions() i Menu.addIntentOptions()).
Ovde se koristi sledei intent:
1.

Akcija: com.android.notepad.action.EDIT_TITLE
Podaci: content://com.google.provider.NotePad/notes/ID
Opis: Trai od aktivnosti da prikae naslov beleke sa odreenim ID-om.
Omoguava korisniku da izmeni naslov.

6.2.Intents primeri
Pozivanje dve aktivnosti pomou intenta
public class IntentA extends Activity implements OnClickListener {
/** Called when the activity is first created. */

119

Razvoj aplikacija za operativni sistem Android


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.intentAButton);
button.setOnClickListener(this);
}
@Override
public void onClick(View src) {
Intent i = new Intent(this, IntentB.class);
startActivity(i);
}
}
public class IntentB extends Activity implements OnClickListener{
@Override
public void onClick(View src) {
Intent i = new Intent(this, IntentA.class);
startActivity(i);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intentBlayout);
Button button = (Button) findViewById(R.id.ButtonIntentB);
button.setOnClickListener(this);
}
}
Pozivanje komponenti sistema preko intenta:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter number:"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
120

Razvoj aplikacija za operativni sistem Android


android:id="@+id/number"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Call"
android:onClick="callNumber"
/>
</LinearLayout>
Manifest
treba
dopuniti
sa:
android:name="android.permission.CALL_PHONE"/>

<uses-permission

a implementacija metode callNumber() izgleda ovako:


public void callNumber(View view) {
TextView numberField = (TextView) findViewById(R.id.number);
Intent contacts = new Intent();
contacts.setAction(android.content.Intent.ACTION_CALL);
//Intent.ACTION_CALL, ili ACTION_VIEW, ili Intent.ACTION_CALL_BUTTON, ili
android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI,
Intent.ACTION_SEARCH
contacts.setData(Uri.parse("tel:" + numberField.getText()));
// contacts.setData(ContactsContract.Contacts.CONTENT_URI);
startActivity(contacts);
6.2.1.Slanje podataka novoj aktivnosti
esto je potrebno proslediti nekakve podatke iz jedne aktivnosti drugoj. Na
primer, moda imamo aktivnost koja lista sve drave sveta u jednom spisku pa se
klikom na neku od drava pokree druga aktivnost sa detaljnim opisom izabrane
drave. Slanje podataka vri se pomou Intent-a kojim startujemo aktivnost; sve
podatke koje elimo da poaljemo dodajemo Intent-u pre nego to ga opalimo.
Podaci se dodaju pomou niza metoda putExtra(kljuc, vrednost). Postoje
varijante ove metode za razliite tipove vrednosti - integere, booleane, stringove
itd.
Intent namera = new Intent(Pocetna.this, NovaAktivnost.class);
namera.putExtra("KLJUC_PODACI", "Neki String podatak");
startActivity(namera);
Sa druge strane, startovana aktivnost treba nekako da izvadi podatke po
pokretanju. To se ini pozivom metode getIntent koja vraa Intent koji je
startovao aktivnost, dakle onaj intent koji smo napunili nekakvim podacima. Nad
tim intentom zovemo metodu getExtras koja nam vraa Bundle objekat, tj.
paketi sa podacima. Podatke onda vadimo pomou neke od get metoda getInt, getBoolean, getString itd.
String dpodaci = getIntent().getExtras().getString("KLJUC_PODACI");
TextView tv = new TextView(this);
121

Razvoj aplikacija za operativni sistem Android


tv.setText(dpodaci);
setContentView(tv);
6.2.2.Vraanje podataka iz aktivnosti
Kao to je mogue poslati podatke iz aktivnosti-pokretaa u pokrenutu aktivnost,
mogue je i obrnuto, tj. aktivnost moe po zavretku da vrati neke podatke onoj
aktivnosti koja ju je pokrenula. Da bi se ovo postiglo, prvo treba izmeniti nain na
koji se pokree aktivnost. Umesto metode startActivity, treba koristiti metodu
startActivityForResult. Ova metoda, pored Intent-a, prima i ID koji elimo da
dodelimo novoj aktivnosti, to je neophodno u sluaju kada startujemo vie
razliitih aktivnosti iz poetne.
startActivityForResult(namera, 1);
Pokrenuta aktivnost odreuje koji podaci e se vratiti nazad pozivom metode
setResult. Postoje dve varijante ove metode; prva kao parametar uzima tzv. result
code, za kojeg postoje predefinisane konstante RESULT_OK i RESULT_CANCEL, a
mogue je i koristiti neke svoje kodove. Ovo je zgodno u stiuacijama kada
hoemo da javimo aktivnosti-pokretau da li je korisnik napravio neke izmene
koje treba snimiti ili odbaciti, najee zavisno od toga koje dugme je kliknuo
(OK/CANCEL).
setResult(RESULT_OK, null);
finish(); //kod u okviru pozvane aktivnosti
Druga varijanta ove metode prihvata jo jedan parametar - Intent - koji se u ovom
sluaju ne koristi za startovanje aktivnosti ve samo za smetanje podataka
pomou metode putExtra.
Intent povratniPodaci = new Intent();
povratniPodaci.putExtra("POVRATNI", 12345678);
setResult(RESULT_OK, povratniPodaci); //kod u okviru pozvane aktivnosti
Na kraju, da bi aktivnost-pokreta preuzela ove podatke, ona mora da reaguje
kada se pokrenuta aktivnost zavri. Ovo se postie implementiranjem metode
onActivityResult. Ova metoda po zavretku pokrenute aktivnosti dobija kod
aktivnosti (u naem primeru 3), result code (u naem primeru smo ga podesili na
RESULT_OK) i Intent objekat sa podacima.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1) {
if(resultCode == RESULT_OK) {
int dobijeniPodatak = data.getExtras().getInt("POVRATNI"); //kod u okviru
pozivajue aktivnosti
TextView tv = new TextView(this);
tv.setText (Integer.toString(dobijeniPodatak));
setContentView(tv);
}
122

Razvoj aplikacija za operativni sistem Android


}
super.onActivityResult(requestCode, resultCode, data);
}
U ovoj metodi proveravamo da li je kod aktivnosti koja se zavrila 1 (ili neki drugi,
ako startujemo vie aktivnosti), eventualno proveravamo result code, i zatim
vadimo podatke iz dobijenog Intent objekta pomou metode getExtras().

7. Rad sa servisima Services


Servis je komponenta aplikacije koja izvrava dugotrajne operacije u pozadini i
nema korisniki interfejs. Neka druga komponenta aplikacije moe startovati
servis, a on e nastaviti da se izvrava u pozadini iako korisnik pree na neku
drugu aplikaciju. Dalje, komponenta moe se moe povezati sa servisom i
interagovati sa njim. Na primer, servis moe upravljati transkacijama preko
mree, putati muziku, realizovati I/O operacije ili komunicirati sa content
provajderom i to sve u pozadini.
Servis se pojavljuje u dve forme:
Pokrenuti servis(Started) kada ga komponenta aplikacije pozivom
metodestartService() pokrene. Tada servis moe da se izvrava u pozadini
neogranieno dugo, bez obzira na status komponente. Na primer, moe
downloadovati ili uploadovati fajl preko mree.
Povezani (Bound) kada se komponenta aplikacije vezuje sa njim pomou
metode bindService(). Tada se servis izvrava dokle god je aktivna komponenta ili
komponente koje su sa njim povezane.
Bez obzira na tip servisa, komponente aplikacije mogu korsititi servis isto kao i
aktivnost startujui ga pomou intent.
Servis u okviru Android Software Development Kit (SDK) moe da znai dve
stvari. Prvo, servis moe da znai proces u pozadini, koji obavlja neke korisne
informacije u redovnim intervalima. Drugo, servis moe biti interfejs za udaljeni
objekat koji se zove u okviru vae aplikacije. U oba sluaja servis objakat proiruje
klasu Service u okviru Andoird SDK, i to moe da bude samostalna komponenta ili
deo aplikacije sa kompletnim korisnikim interfejsom.
Ovaj servis Andoird platforme moe se koristit u sledeim situacijama:
Kada aplikacija obavlja neke duge i zahtevne procese, a da ne postoji
potreba da korisnik pokrene pomenuti proces,
Aplikacija mora da obavlja neke rutinske operacije ili operacije u odreenim
redovnim intervalima,
Itd.

7.1.ivotni ciklus Servisa


Pre nego to se krene u detaljno objanjenje kako kreirati servis, mora se prvo
razumeti na koji nain servis ima interakciju sa Andorid operativnim sistemom.
Prilikom kreiranja servisa, bitno je da se zna, da se pomenuti servis mora prvo
registrovati u manifest fajlu koji aplikacija koristi u okviru taga <service>. U
123

Razvoj aplikacija za operativni sistem Android


okviru implementacije servisa moraju se definisati dozvole potrebne za
pokretanje, zaustavljanje i povezivanje na servis, kao i neophodni poziv servisa.
Nakon to je servis implementaran, servis se moe koristiti korienjem metode
Context.startService(). Ako je usluga servisa ve pokrenuta, kasnijem korienjem
metode startService(), usluga se ne pokree ponovo. Servis funkcionie sve dok
se ne pozove metoda Context.stopService() ili servis zavri sa radom i sam
pozove funkciju za prestanak rada stopSelf().
Da bi neke aplikacije koje ele da koriste servis, moraju da pozovu funkciju
Context.bindService() za uspostavljanje veze sa servisom. Ako servis nije
pokrenut, on se pokree u tom trenutku, ako je servis ve pokrenut, aplikacije
mogu da alju zahteve za izvravanje odreenih usluga ako za to imaju dozvolu.

7.2.Kreiranje servisa
Kreiranje servisa i njegov rad e biti demostrirano na primeru servisa koji reaguje
na pomeranje korisnika, tj. promenu njegovih koordinata (latitude i longitude).
Prvo emo napraviti obinu android aplikaciju sa jednom aktivnou koju emo
nazvati ServisKontroler. Ova aktivnost e se koristiti da pokrene/ugasi na servis,
pa emo u skladu sa time aktivnosti dodati dva dugmeta u lejaut fajl a zatim
pokupiti reference na njih u kodu.
Lejaut aktivnosti (main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
124

Razvoj aplikacija za operativni sistem Android


android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dugmeStart" android:text="START"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/dugmeStop" android:text="STOP"/>
</LinearLayout>
Kod aktivnosti (ServisKontroler.java):
public class ServisKontroler extends Activity {
Button dugmeStart, dugmeStop;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dugmeStart = (Button)findViewById(R.id.dugmeStart);
dugmeStop = (Button)findViewById(R.id.dugmeStop);
}
Ovim dugmiima emo kasnije dodati listenere za pokretanje i zaustavljanje
aktivnosti.
Da bi kreirali novi servis, treba da nasledimo klasu Service i implementiramo
njene
metode
onCreate,
onStart/onStartCommand
i
onDestroy.
onStartCommand je novija verzija metode onStart koju treba izbegavati osim ako
elimo da nam aplikacija bude kompatibilna i sa starijim verzijama Android
sistema. Za poetak emo napraviti samo kostur servisa.
Kod servisa (MojServis.java):
public class MojServis extends Service {
private LocationManager lokacija = null;
private NotificationManager notifikator = null;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, startId);
}
@Override
125

Razvoj aplikacija za operativni sistem Android


public void onDestroy() {
super.onDestroy();
}
}
Ove tri metode su nam bitne - onCreate se poziva po kreiranju servisa,
onStartCommand po pozivu startService() iz neke aktivnosti, a onDestroy kada
servis zavri pruanje usluge.
Potrebno je da u manifestu naglasimo da e naa aplikacija koristiti servis
(MojServis), a takoe i da e nam trebati dozvola za pristupanje lokaciji korisnika:
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<application>
...
<service android:name="MojServis" ></service>
...
</application>
Da bismo povezali aktivnost i servis, tj. da bismo startovali/gasili aktivnost iz
servisa, treba samo da pozovemo startService ili stopService metode, to emo
uiniti kada korisnik klikne na odgovajue dugme:
dugmeStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent namera = new Intent(ServisKontroler.this, MojServis.class);
startService(namera);
}
});
dugmeStop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent namera = new Intent(ServisKontroler.this, MojServis.class);
stopService(namera);
}
});
Sada emo prei na pisanje konkretnog koda u servisu. Prvo emo
implementiramo metodu onCreate:
public void onCreate() {
super.onCreate();
lokacija = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
notifikator
=
(NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
}

126

Razvoj aplikacija za operativni sistem Android


Pri kreiranju servisa emo ugrabiti reference na LocationManager-a koji e nam
kasnije potreban za odreivanje lokacije i NotificationManager-a kojeg emo
koristiti da prikaemo notifikacije kada se korisnik pomeri.
Ovde je bitno naglasiti da prilikom razvoja servisa, obavezno se mora testirati
aplikacija da li je kompatabilna sa raznim verzijama Andoird SDK platforme. Da bi
sve bilo kompatabilno aplikacija mora biti uraena u skladu sa SDK 5 platforme.
Ponaanje servisa definie se u metodama onStart() i/ili onStartCommand().
Dalje emo implementirati metodu onStartCommand koja
startovanju servisa:
@Override
public int onStartCommand(Intent intent, int flags, int startId ) {
Criteria kriterijum = new Criteria();
kriterijum.setAccuracy(Criteria.NO_REQUIREMENT);
kriterijum.setPowerRequirement(Criteria.POWER_LOW);

se

poziva

po

// dobili provajder lokacije koji najvie odgovara traenim kriterijumima


String best = lokacija.getBestProvider(kriterijum, true);
// zahtevamo periodino informisanje o promeni lokacije
lokacija.requestLocationUpdates(best, 60000, 5, this);
// aljemo notifikaciju da je zapoeto praenje lokacije
Notification obavestenje = new
Notification(android.R.drawable.stat_notify_more,
"GPS pracenje", System.currentTimeMillis());
obavestenje.flags |= Notification.FLAG_AUTO_CANCEL;
Intent
toLaunch
=
new
Intent(getApplicationContext(),
ServisKontroler.class);
toLaunch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent intentBack =
PendingIntent.getActivity(getApplicationContext(), 0, toLaunch, 0);
obavestenje.setLatestEventInfo(getApplicationContext(),
"GPS pracenje", "Pracenje je zapocelo ", intentBack);
notifikacije.notify(1, obavestenje);

// 1 - ID notifikacije

}
Prvo kreiramo objekat klase Criteria. Poto jedan telefon moe imati vie naina
da odredi svoju lokaciju (pomou mobilne mree, pomou GPS-a, pomou
interneta itd.), koristimo objekte ove klase da specificiramo kakav mehanizam za
odreivanje lokacije bi nam najvie odgovarao. U ovom sluaju specificiramo da
nam treba mehanizam sa malim utrokom baterije, a bez ikakvih posebnih
zahteva po pitanju preciznosti.
Poto smo to podesili u Criteria objektu, predajemo objekat LocationManager-ovoj
metodi getBestProvider a kao rezultat dobijamo ime mehanizma koji najbolje
odgovara onome to smo traili.

127

Razvoj aplikacija za operativni sistem Android


Da
bi
bili
informisani
o
promeni
lokacije,
pozivamo
metodu
requestLocationUpdates() LocationManager-a i kao parametre joj dajemo ime
eljenog provajdera, minimalno vreme izmeu dva obavetenja, minimalnu
razdaljenost koja treba da bude preena da bi bila registrovana i referencu na
klasu koja e biti periodino pozivana. Poto smo tu prosledili this kao
parametar, moraemo kasnije da implementiramo LocationListener interfejs u
naem servisu i njegovu metodu onLocationChanged.
Preostale linije koda se odnose na sastavljanje i slanje notifikacije, to je
pokazano u ranijim poglavljima. Ova notifikacija treba da javi korisniku da je
snimanje zapoeto. Dalje emo pogledati metodu onLocationChanged koju treba
implementirati:
@Override
public void onLocationChanged(Location location) {
Notification
obavestenje
Notification(android.R.drawable.stat_notify_more,
"GPS pracenje", System.currentTimeMillis());

new

obavestenje.flags |= Notification.FLAG_AUTO_CANCEL;
Intent toLaunch = new Intent(getApplicationContext(), ServisKontroler.class);
toLaunch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent intentBack = PendingIntent.getActivity(getApplicationContext(),
0, toLaunch, 0);
// Saljemo notifikaciju sa vrednostima latitude i longitude
obavestenje.setLatestEventInfo(getApplicationContext(), "GPS
"Lokacija: " +
location.getLatitude() + "," + location.getLongitude(), intentBack);

pracenje",

notifikacije.notify(1, obavestenje);
}
U ovoj metodi ponavljamo proceduru sa slanjem notifikacije, jedina je razlika to
sada u tekst naih notifikacija stavljamo vrednosti latitude i longitude koje
dobijamo kao parametar metode onLocationChanged u okviru objekta Location.
Nakon korienja servisa potrebno je jo oistiti servis nakon korienja. U
nastavku sledi primer kako se to radi:
@Override
public void onDestroy() {
// odjavljujemo se od prijema obavestenja o promeni lokacije
if (lokacija != null) {
lokacija.removeUpdates(this);
lokacija = null;
}
// saljemo notifikaciju da je servis ugasen
Notification obavestenje = new
Notification(android.R.drawable.stat_notify_more,
"GPS pracenje", System.currentTimeMillis());
128

Razvoj aplikacija za operativni sistem Android

obavestenje.flags |= Notification.FLAG_AUTO_CANCEL;
Intent toLaunch = new Intent(getApplicationContext(),
ServisKontroler.class);
PendingIntent intentBack =
PendingIntent.getActivity(getApplicationContext(), 0, toLaunch, 0);
obavestenje.setLatestEventInfo(getApplicationContext(),
"GPS pracenje", "Pracenje je stopirano!", intentBack);
notifikacije.notify(1, obavestenje);
super.onDestroy();
}
Na kraju odjavljujemo servis od primanja obavetenja o promeni lokacije i aljemo
notifikaciju o tome.

7.3.Implementacija udaljenog interfejsa


U veini sluajeva postoji potreba da se ima vea kontrola nad sistemom i
servisima, koji servis je pokrenut ili stopiran. Andoird SDK platforma sadri
korisne alate i formate za kreiranje korisnikog interfejsa za ove potrebe.
Da bi se daljinski interfejs definisao, potrebno je da se interfejs objavi u AIDL
fajlu, potom da se implmentira interfejs, a zatim da se vrati instanca interfejsa
kada se poziva onBind() metoda.
U nastavku sledi kod koji je smeten u AIDL fajlu za interfejs:
interface IRemoteInterface {
Location getLastLocation();
}
Kada se koristi Eclipse za razvoj, AIDL fajl se veoma lako i jednostavno definie. U
nastavku sledi kod koji definie interfejs:
private final IRemoteInterface.Stub
mRemoteInterfaceBinder = new IRemoteInterface.Stub() {
public Location getLastLocation() {
Log.v(interface, getLastLocation() je pozvana);
return lastLocation;
}
};
@Override
public IBinder onBind(Intent intent) {
//svi servisi imaju sam jedan interfjs, konkretno u ovom slucaju tako da nije
potrebno nikakvo
//dodatno navodjenje i proveravanje, vec samo vratimo instancu
return mRemoteInterfaceBinder;
}
129

Razvoj aplikacija za operativni sistem Android

U okviru AndroidManifest.xml fajlu mora se dodati sledei kod kako bi se


omoguio rad sa interfejsima:
<action android:name =com.androidbook.services.IRemoteInterface />
Nakon podeavanja u manifest fajlu servis se moe koristiti, potrebno je jo samo
definisati glavne metode za konekciju i diskonekcija sa servisa.
public void onServiceConnected(ComponentName name, IBinder service) {
mRemoteInterface = IRemoteInterface.Stub.asInterface(service);
Log.v(ServiceControl, Interfejs se povezao.);
}
public void onServiceDisconnected(ComponentName name) {
mRemoteInterface = null;
Log.v(ServiceControl, Udaljeni interfejs se diskonektovao!);
}
Nakon poziva metode onServiceConnected() interfjs je spreman za korienje i
potom se moe koristiti. Kod za korienje izgleda ovako:
Location lokacija = mRemoteInterface.getLastLocation();

8. Skladitenje podataka
Android nudi nekoliko opcija za skladitenje podataka. Koji nain e se koristiti
zavisi od specifinih potreba, da li su podaci dostupni drugim aplikacijama ili su
privatni, kao i koliko prostora zauzimaju ti podaci.
Andoird nudi sledee opcije za skladitenje podataka:

Zajednika podeavanja uvanje primitivnih podataka u obliku kljuvrednost


Inerne memorije uvanje podataka na memoriji ureaja
Eksterne memorije spoljne deljenje memorije
SQLite baze podataka lokalno uvanje podataka u privatnoj bazi
podataka
Network Connection uvanje podataka na nekom od web servera

Andoird nudi mogunost deljenja i privatnih podataka sa drugim aplikacijama uz


korienje preko provajdera sadraja.
Vie o ovome moete pronai na adresi
http://developer.android.com/guide/topics/providers/content-providers.html

8.1.Zajednika podeavanja

130

Razvoj aplikacija za operativni sistem Android


Klasa SharedPreferences daje opti okvir ua uvanje primitivnih tipova podataka
koji su upareni klju-vrednost. Ova klasa se moe koristiti za uvanje podataka
koji su tipa: boolean, floats, int, long, i string. Ovi podaci se pre svega koristi i
proimaju kroz sesije.
Da bi kreirali obejakt SharedPreferences koristi se jedan od dole dva navedena
naina:

getSharedPreferences() ova opcija se koristi ako su potrebne vie


preferencija datoteka koji su odreenim prvim parametrom koji predstavlja
identifikator
getPreferences() opcija se koristi ako je potrebno dobiti samo jednu
preferenciju datoteke za eljenu aktivnost

U nastavku sledi primer koda kako se uvaju podaci na ovaj nain. Prikazan je
primer kako se uva vrednost koja je uneta prilikom izraunavanja kod
kalkulatora:

131

Razvoj aplikacija za operativni sistem Android

public class Kalkulator extends Activity {


public static final String PREFS_NAME = "mojPref";
@Override
protected void onCreate(Bundle stanje){
super.onCreate(stanje);
...
// vrati preference
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// svi objekti su sa android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// potvrdimo promene
editor.commit();
}
}

Primer:
// Get the app's shared preferences
SharedPreferences app_preferences =
PreferenceManager.getDefaultSharedPreferences(this);
// Get the value for the run counter
int counter = app_preferences.getInt("counter", 0);
// Update the TextView
TextView text = (TextView) findViewById(R.id.text);
text.setText("This app has been started " + counter + " times.");
// Increment the counter
SharedPreferences.Editor editor = app_preferences.edit();
editor.putInt("counter", ++counter);
editor.commit(); // Very important

132

Razvoj aplikacija za operativni sistem Android

8.2.Interne memorije
Interne memorije omoguavaju da se skladite podaci direktno na memoriju
ureaja. Podrazumevano je da podaci koji se koriste na memoriji ureaju su
privatni i ostale aplikacije tim podacima ne mogu pristupiti. Kada se apliakcija
ukloni sa ureaja, nestaju i podaci.
Da bi upisali podatke na internoj memoriji koriste se sledee metode:

openFileOutput()
write()
close()

String NAZIVFAJLA = "moj_prvi_fajl";


String string = "Dobar dan svima!";
FileOutputStream fos = openFileOutput(NAZIVFAJLA, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
Argument MODE_PRIVATE kreirae novi fajl ili pak zameniti postojeu datoteku
novim ako je isto ime. Ostali modovi koji su jo dostupni prilokom upisivanja u fajl
su: MODE_APPEND, MODE_WORLD_READABLE, i MODE_WORLD_WRITEABLE.
Da bi se proitali podaci sa interne memorije potrebno je koristiti sledee metode:

openFileInput() ovde se definie ime datoteke koja se ita


read() ita bajtove iz datoteke
close() zatvara tok za itanje.

Metode koje se jo koristi prilikom itanja i pisanja u datoteku:


getFilesDir() vraa absolutnu putanju direktorijuma gde se datoteka uva
u memoriji
getDir() kreira ili otvara ve postojei direktorijum u okviru unutranjeg
prostora
deleteFile() brie datoteke koje se uvaju na internoj memoriji
fileList() vraa listu datoteka koje su sauvane na memoriji

133

Razvoj aplikacija za operativni sistem Android

8.3.Skladitenje podataka na spoljanoj memoriji


Svaki android ureaj podrava deljeno eksterno skladite, koje se moe koristiti
za uvanje podataka. Ovde spadaju prenosivi mediji za skladitenje podataka,
kao to su CD kartice. Datoteke koje se uvaju na ovakvom ureaju su svetski
kompatabilni i itljivi, to dalje govori da se prilikom povezivnja na USB podaci
mogu preneti na neki drugi ureaj.
Pre nego to krene da se radi bilo ta sa spoljanom memorijom, potrebno je
predhodno da se proveri da li je spoljani mediji dostupan uz pomo metode
getExternalStorageState(). Dostupnost medija se proverava na sledei nain:
boolean mSpoljnaMemorijaAvailable = false;
boolean mSpoljnaMemorijaWriteable = false;
String stanje = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(stanje)) {
// sada se moze citati i upisivati na memoriju
mSpoljnaMemorijaAvailable = mSpoljnaMemorijaWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(stanje)) {
// u ovom slucaju moguce je samo citati podatke
mSpoljnaMemorijaAvailable = true;
mSpoljnaMemorijaWriteable = false;
} else {
// nastala je neka greska, mozda uredjaj nije dobro povezan ili nesto slicno
mSpoljnaMemorijaAvailable = mSpoljnaMemorijaWriteable = false;
}
Da bi se pristuplo datotekama na spoljanom skladitu ako se koristi API 8 ili
noviji, koristi se metoda getExternalFilesDir(). Ova metoda prihvata parametar
koji odreuje tip poddirektorijuma koji se eli otvoriti, kao to je
DIRECTORY_MUSIC ili DIRECTORY_RINGTONES. Ako direktorijum ne postoji, ova
metoda e automatski kreirati novi.
Ako se koristi API 7 ili stariji, koristi se metoda getExternalStorageDirectory(), da
bi se otvorila datoteka koja predstavlja root ekterne memorije. U tom sluaju
podaci se uvaju na sledeoj putanji:
/Android/data/<package_name>/files/
Ako se eli sauvati neka datoteka, koja se nee obrisati sa deintaliranje
aplikacije, potrebno je tu datoteku sauvati na javnom delu skladita. Ovi
direktorijumi su postavljeni u root-u direktorijumu eksternog skladita Music/,
Pictures/, Ringtones/, i drugi.

134

Razvoj aplikacija za operativni sistem Android

8.4.Rad sa bazom podataka SQLite


Kada se javi potreba za skladitenje podataka, Andoird platforma podrava rad sa
SQLite bazom, koja spada u relacione baze podataka, to je sama po sebi veoma
pogodna i idealna za skladitenje podataka na Android platformi.
Koristei SQLite bazu podataka, koja je privatna u smislu pristupa podacima i
podaci iz nje se ne mogu na ovaj nain deliti sa drugim aplikacijama. Za deljenje
podataka potreban je drugi mehanizam koji e kasnije biti objanjen.
Andoird SDK sadri veliki broj korisnih klasa sa kojima se moe upravljati SQLite
bazom podataka. Mnoge od ovih klasa se nalaze u android.database.sqlit paketu.
U okviru ovih klasa mogu se nai alati za upravljanje bazom podataka, klase za
kreiranje i izvravanje sql upita, kao i razne pomagae za ispravno kreirane sql
upite. U okviru ovog paketa moete nai i veliki broj generiikih klasa koje slue
za upravljanje podacima iz vie izvora podataka.
8.4.1.Kreiranje SQLite baze podataka
U okviru Android sistema, baza podataka moe se kreirati na vie naina.
Najjednostavniji nain da se kreira nova baza podataka je da se koristi
openOrCreateDatabase() metoda:
import android.database.sqlite.SQLiteDatabase;
...
SQLiteDatabase mDatabase;
mDatabase = openOrCreateDatabase( my_sqlite_database.db,
SQLiteDatabase.CREATE_IF_NECESSARY,null);
U ovom sluaju putanja baze podataka je sledea:
/data/data/com.androidbook.SimpleDatabase/databases/my_sqlite_database.db
Moe se pristupiti bazi podataka, korienjem sqlite3 interfejs komadne linije za
navedenu putanju.
Da bi se baza podataka mogla koristiti mora se ispravno konfigurisati:
import java.util.Locale;
...
mDatabase.setLocale(Locale.getDefault());
mDatabase.setLockingEnabled(true);
mDatabase.setVersion(1);
8.4.2.Kreiranje tabela
Kreiranja tabela je veoma jednostavno kao i formiranje i izvravanje sql upita.
Izraz CREATE TABLE SQL slui za kreiranje nove tabele. U nastavku bie kreirana
tabela tbl_autori koja e imati 3 polja, id autora, ime i prezime.
CREATE TABLE tbl_autori (
id INTEGER PRIMARY KEY AUTOINCREMENT,
135

Razvoj aplikacija za operativni sistem Android


ime TEXT,
prezime TEXT);
SQL upit moe se izvrii pozivanjem metode mDatabase.execSQL(SQL). Metoda
execSQL() se moe koristiti za izvravanje bilo kog sql upita. Moe se koristiti za
kreiranje, brisanje, auriranje tabela, pogleda itd. U nastavku sledi kod za
kreiranje tabele tbl_knjige
CREATE TABLE tbl_knjige (
id INTEGER PRIMARY KEY AUTOINCREMENT,
naslov TEXT,
datumdodavanja DATE,
autorid INTEGER NOT NULL CONSTRAINT autorid REFERENCES tbl_autori(id) ON
DELETE
CASCADE);
SQLite ne proverava skup ogranienja za spoljni klju, zato se moraju koristiti
odreeni sql trigeri koji e to proveravati:
private static final String CREATE_TRIGGER_ADD =
CREATE TRIGGER fk_insert_knjige BEFORE INSERT ON tbl_knjige
FOR EACH ROW
BEGIN
SELECT RAISE(ROLLBACK, insert on table \tbl_knjige\ violates foreign key
constraint \fk_autorid\) WHERE (SELECT id FROM tbl_autori WHERE id =
NEW.autorid) IS NULL;
END;;
Kada je definisan triger, onda je potrebno samo pozvati metodu execSQL() da se
izvri sql upit:
mDatabase.execSQL(CREATE_TRIGGER_ADD);
Da bi se veza ojaala izmeu autora i knjige potrebno je jo definisati okidae,
odnosno trigere za auriranje i brisanje iz tabele.
8.4.3.Unos, promena i brisanje podataka iz tabele
Klasa SQLiteDatabase, ima u sebe ugraene metode za unos, promenu i brisanje
podataka. Nazivi metoda su veoma jednostavni insert(), update(), i delete().
8.4.4.Unos podataka insert()
Za definisanje vrednosti koje se unose u tabelu koristi se klasa ContentValues
koja uparuje imena kolona u tabeli za vrednostima koje se ele uneti.
import android.content.ContentValues;
...
ContentValues vrednosti = new ContentValues();
vrednosti.put(ime, Aleksandar);
vrednosti.put(prezime, Nastevski);
long noviAutorId = mDatabase.insert(tbl_autori, null, vrednosti);

136

Razvoj aplikacija za operativni sistem Android


Metoda insert() vraa id unetog sloga u bazu, u ovom sluaju vraa id novog
autora.
8.4.5.Promena podataka update()
Podaci u bazi se mogu promeniti uz pomo update() metode. Ova metoda
prihvata 4 parametara:
Naziv tabele koja se aurira
ContentValues objekat sa auriranim podacima
Opciona WHERE naredba
Niz argumenata za Where naredbu
Trei i etvrti argumenti su opcioni, ne koriste se npr kada se ele promeniti svi
rekordi u bazi. U nastavku sledi metoda koja menja naslov knjige za id knjige koji
se prosledi:
public void promenaNaslovaKnjige(Integer knjigaId, String noviNaslov) {
ContentValues vrednosti = new ContentValues();
vrednosti.put(naslov, noviNaslov);
mDatabase.update(tbl_knjige, vrednosti, id=?, new String[]
{ knjigaId.toString() });
}
U gore navedenom promenili smo samo naslov, to je i dozvoljeno. Ako se eli
promeniti vie polja u tabeli, potrebno je samo navesti dodatne podatke u
ContentValues objektu.
8.4.6.Brisanje podataka delete()
Zapis iz baze se moe ukloniti koristei delete() metodu. Metoda prihvata tri
argumenta:
Naziv tabele u kojoj se briu podaci
WHERE klauzula koja je opciona, ako se ne koristi onda se briu svi podaci
u tabeli
Niz argumenata za WHERE klauzulu, gde je id niza zapravo naziv kolone u
bazi, dok drugi paramatar je vrednost.
Naredba kojom se briu svi slogovi iz baze izgleda ovako:
mDatabase.delete(tbl_autori, null, null);
Meutim u praksi je ei sluaj da briemo pojedinane slogove iz baze, za to se
moraju koristiti identifikatori. U nastavku bie prikazan primer koji brie knjigu za
prosleenu vrednost za id knjige.
public void brisanjeKnjige(Integer knjigaId) {
mDatabase.delete(tbl_knjige, id=?, new String[] { knjigaId.toString() });
}
8.4.7.Rad sa transakcijama

137

Razvoj aplikacija za operativni sistem Android


esto postoji potreba da se izvravaju vei skup operacija zajedno, tj da se
celokupan proces desi ispravno ili da se opte nita ne desi. U tom sluaju mogu
se koristiti SQL transakcije, koje u sluaju greke mogu da ponite sve operacije i
vrate na poetno stanje. U nastavku sledi osnovni prikaz transakcije:
mDatabase.beginTransaction();
try {
// unos novih rekorda, promena, brisanje
mDatabase.setTransactionSuccessful();
} catch (Exception e) {
// nastala je greska prilikom izvrsavanje transakcije, radi sta je u tom slucaju
potrebno
} finally {
mDatabase.endTransaction();
}
Transakcija uvek poinje naredbom mDatabase.beginTransaction(); a potom se
koristi try/catch blok naredbi. Ako se transakcija izvrila uspeno onda se poziva
metoda setTransactionSuccessful(), dok na kraju izvraavanja transakcije poziva
se metoda endTransaction().
8.4.8.Upiti SQLite baze podataka
Baze podataka su odlini mehanizmi za skladitenje velikog broja podataka, ali
korienje tih podataka predstavlja vanu komponentu, to se samu po sebi bazu
ini monom. Android nudi veliki broj naina kako se mogu izvravati i formirati
sql upiti.
Kada se dobije rezultat izvravanja sql upita, podacima se pristupa pomou
objekta klase Cursor koji je smeten u paketu android.database.Cursor. Cursor
objekti su slini kao i pokazivai, uz pomo kojih se moe pristupiti rezultatima
nakon izvravanja sql upita. Cursor objekat sadri korisne metode poput metode
koja vraa ukupan broj rekorda, metoda koja vraa nazive kolona itd. Curser se
pre svega koristi za jednostavnije sql upite, i bitno je naglasiti da nakon
korienja, obavezno se Cursor mora zatvoriti naredbom close() kao to je to
prikazano u kodu ispod:
// jednostav upit: select * from tbl_knjige
Cursor c = mDatabase.query(tbl_knjige,null,null,null,null,null,null);
// ovde sada se moze nesto uraditi sa objektom
c.close();
Prilikom korienja Cursor objekta mora se voditi rauna i o ivotnom ciklusu
obejkta. Kada se apliakcija gasi ili puzira, kursor mora da se deaktivira pozivom
metode deactivate(), dok kada se aplikacija ponovo pokree, kursor bi morao da
se ozvei pozivanjem metode requery(). Kada kursor vie nije potreban za rad, u
tom sluaju potrebno je osloboditi resurse pozivajui metodu close().
Programer prilikom rada moe koristiti sledee metode za upravljanje ivotnim
ciklusom Cursora onPause(), onResume(), i onDestroy(). Meutim, postoji
mogunost da pokrenete i menadera koji e automatski voditi rauna o
ivotnom ciklusu Cursora, koristei aktivnost metodu startManagingCursor() koja
u ovom sluaju kontrolie sve sama. U svakom trenutku, postoji mogunost da se
138

Razvoj aplikacija za operativni sistem Android


ree na runo upravljanje
stopManagingCursor().

ivotnog

ciklusa

Cursora,

pozivajui

metodu

Cursor ima ugraene u sebi i metode koje omoguavaju za interativno prolaenje


kroz sve rekorde koji su dobijeni izvravanje upita nad bazom. U tom konetkstu
moe se koristiti funkcije kako bi se kretali kroz listu, da se postavipokaziva na
prvi rekord, da se pomeri pokaziva na sledei rekord i da se pita da li ima neto
posle poslednjeg rekorda, moveToFirst(), moveToNext(), i isAfterLast().
Na sledeem primeru bie pokazano kako se pristupama podacima iz Cursor
objekta, gde e se uz pomo ugraenih metoda doi do informacije o tekuem
kursoru, sledeem, nazivu kolone, broj kolena itd.

139

Razvoj aplikacija za operativni sistem Android

public void informacijeOCursoru(Cursor c) {


Log.i(DEBUG_TAG, *** Cursor start *** + Rezultat: + c.getCount() +
Kolone: + c.getColumnCount());
// stampanje imena kolona
String zaglavljeReda = || ;
for (int i = 0; i < c.getColumnCount(); i++) {
zaglavljeReda = zaglavljeReda.concat(c.getColumnName(i) + || );
}
Log.i(DEBUG_TAG, Kolone + zaglavljeReda);
// stampanje rekorda
c.moveToFirst(); //postavljamo pokazivac na prvi rekord
while (c.isAfterLast() == false) {
String rezultatReda = || ;
for (int i = 0; i < c.getColumnCount(); i++) {
rezultatReda = rezultatReda.concat(c.getString(i) + || );
}
Log.i(DEBUG_TAG, Red + c.getPosition() + : + rezultatReda);
c.moveToNext();//pomeramo pokazivac na sledeci rekod
}
Log.i(DEBUG_TAG, *** Cursor End ***);
}
8.4.9.Brisanje tabela i ostalih SQLite objekata
Brisanje tabela i ostalih SQLite obejkata radi se na isti nain kao i njihove
kreiranje. Potrebno je formirati odgovarajue SQL upite i izvriti ih.
U nastavku sledi prikaz koda za brisanje tabele tbl_knjige, kao i brisanje tabele
tbl_autori, na kraju briemo i triger.
mDatabase.execSQL(DROP TABLE tbl_knjige;);
mDatabase.execSQL(DROP TABLE tbl_autori;);
mDatabase.execSQL(DROP TRIGGER IF EXISTS fk_ubaci_knjigu;);
Bitno je napomenuti, da kada baza podataka se ne koristi, potrebno je zatvoriti
konekciju ka njoj. To se radi pozivanjem metode close().
mDatabase.close();
Da bi izbrisali kompletnu bazu podataka, najbolje je koristiti metodu
deleteDatabase(), ipak treba voditi rauna o korienju ove metode jer ona brie
kompletne podatke iz baze podataka koja je navedena.
deleteDatabase(moja?prva_sqlite_baza.db);

140

Razvoj aplikacija za operativni sistem Android

9. Internet
Android ureaji obino imaju vie naina za uspostavljanje konekcije sa
internetom, pa se i mnoge aplikacije oslanjaju na tu mogunost ili su
kompletno izgraene oko nje. Programerima Android aplikacija se na
raspolaganju nalazi nekoliko alata:
1. Klasnine Java biblioteke za rad sa soketima i streamovima
2. Apache HTTP klijent
3. HttpURLConnection
Rad sa soketima se u Androidu ni najmanje ne razlikuje od rada u
klasinom Java okruenju pa nee detaljnije biti opisan ovde. Appache
HTTP biblioteka je dosta obimna i kvalitetna i preporuuje se za upotrebu
na starijim verzijama Androida. HttpURLConnection je jednostavniji za
upotrebu i kontinualno se radi na njegovom poboljavanju pa je preporuka
da se koristi u novijim verzijama.
Da bi vaa aplikacija mogla da koristi internet, potrebno je prvo u
manifestu dodati:
<uses-permission android:name="android.permission.INTERNET"/>

9.1.HttpURLConnection
Osnovni objekat za komunikaciju je ovde HttpURLConnection objekat. Da
bi se kreirao ovaj objekat, prvo kreiramo objekat klase URL koji e
predstavljati adresu koju elimo da otvorimo, a zatim nad njime pozivamo
metodu openConnection.
URL url = new URL("http://www.fon.rs");
HttpURLConnection con = (HttpURLConnection) url.openConnection();

Poto
smo
dobavili
konfigurisanje:

HttpURLConnection

objekat,

prelazimo

na

con.setConnectTimeout(1500);
con.setReadTimeout(1000);
con.setRequestMethod("GET");
con.setDoInput(true);

Podeavamo koliko milisekundi ekamo na uspostavljanje konekcije i


prijem podataka iz uspostavljene konekcije. Biramo koja metoda e se
koristiti (GET/POST) i da li e biti dozvoljeno slanje podataka u telu
zahteva. Kada zavrimo sa time, moemo da zatraimo stranicu i preemo
na itanje dobijenog odgovora:
con.connect();
BufferedReader
reader
=
new
InputStreamReader(con.getInputStream(), "UTF-8"));
String odgovor = null;

BufferedReader(new

141

Razvoj aplikacija za operativni sistem Android


rezultat = "";
while((odgovor = reader.readLine())!=null) {
rezultat += odgovor;
}
reader.close();

Pozivom metode getInputStream() nad HttpURLConnection objektom,


dobijamo klasini InputStream koji moemo da konvertujemo u Reader
kako bismo itali tekstualne znake umesto bajtova i obmotamo
BufferedReaderom radi bolje efikasnosti. Dalje itamo red po red sadraj
dobijenog streama dokle god postoji neto u njemu.
Konano, ceo primer izgleda ovako:
URL url;
HttpURLConnection con = null;
try
{
url = new URL("http://www.fon.rs");
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(1500);
con.setReadTimeout(1000);
con.setRequestMethod("GET");
con.setDoInput(true);
con.connect();
BufferedReader
reader
=
new
InputStreamReader(con.getInputStream(), "UTF-8"));
String odgovor = null;
String rezultat = "";
while((odgovor = reader.readLine())!=null) {
rezultat += odgovor;
}

BufferedReader(new

reader.close();
TextView tv = new TextView(this);
tv.setText(rezultat);
setContentView(tv);
}
catch (Exception e)
{
}
finally {
if(con != null)
con.disconnect();
}
Primer slanja podataka sa HTML forme:
public static String excutePost(String targetURL, String urlParameters)
{
URL url;
142

Razvoj aplikacija za operativni sistem Android


HttpURLConnection connection = null;
try {
//Create connection
url = new URL(targetURL);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" +
Integer.toString(urlParameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream ());
wr.writeBytes (urlParameters);
wr.flush ();
wr.close ();
//Get Response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if(connection != null) {
connection.disconnect();
}
}
}
...
The urlParameters is a URL encoded string.
String urlParameters =
"fName=" + URLEncoder.encode("???", "UTF-8") +
"&lName=" + URLEncoder.encode("???", "UTF-8")

143

Razvoj aplikacija za operativni sistem Android


Da bi se InputStream pretvorio u sliku, trebalo bi koristiti sledei kod:
Drawable d = Drawable.createFromStream(myInputStream, "imeslike");

10. Lokacije i mape


Primena informacija o lokaciji korisnika, Google mapa se veoma esto koriste u mobilnim
aplikacijama. Kljuna klasa koja se odnosi na ubacivanje ovih funkcionalnosti u Android aplikaciju je
android.location package i eksterna Google map biblioteka.

10.1.

Lokacijski servisi

Android omoguava pristupa lokacijskim servisima podranim na ureaju kroz


android.location package. Centralna komponenta lokacijskog okvira je
LocationManager sistemski servis, koji obezbeuje API za odreivanje lokacije.
Kao i ostali sistemski servisi, LocationManager se ne instancira direktno, nego se
zahteva
instanca
od
sistema
pozivom
metode
getSystemService(Context.LOCATION_SERVICE). Metoda vraa obradu nove
LocationManager instance. Kada aplikacija pozove LocationManager, aplikacije je
sposobna da uradi tri stvari:

Zahteva listu svih LocationProviders za poslednju poznatu


korisnika

Zatrai periodian update trenutne korisnikove lokacije od location


provajdera

Zatrai od odreenog Intenta da bude pokrenut ako ureaj doe na


odreenu lokaciju

lokaciju

Za odreivanje lokacije korisnika, odnosno ureaja, Android aplikacija moe


koristiti GPS, ali i Network Location Provider. Iako je GPS precizniji, on funkcionie
samo napolju, brzo troi bateriju i ne vraa rezultat dovoljno brzo. Sa druge
strane, Network Location Provider odreuje lokaciju pomou wireless signala ili
bazne stanice, funkcionie i unutar objekata, bre daje rezultat. Odreivanje
lokacije korisnikovog ureaja moe biti kompleksan zadatak:

Viestruki izvor odreivanja lokacije

Kretanje korisnika

Preciznost lokacije

Podaci o lokaciji se trae pomou LocationManager pozivom metode


requestLocationUpdates(), tako to se LocationManager alje ka LocationListener.
LocationListener mora implementirati nekoliko callback metoda koje Location
Manager poziva kada se lokacija korisnika promeni ili kada se status servisa
promeni:
144

Razvoj aplikacija za operativni sistem Android


// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
0, 0, locationListener);
Prvi parametar u metodi requestLocationUpdates() je tip location providera koji
e se koristiti (Network Location Provider). Frekvencijameme kojom e listener
prihvatati update se definie pomou drugog i treeg paramtera (2.parametar
minimalni vremenski interval izmeu notifikacija; 3.parametar minimalna
promena rastojanja izmeu dve notifikacije). Ukoliko se oba parametra stave na
0, znai da se podaci auriraju to je mogue ee. Poslednji parametar je
LocationListener, koji prihvata callback za svako auriranje lokacije. Da bi se
zahtevale informacije o lokaciji od GPS provajdera, potrebno je izmeniti
GPS_PROVIDER umesto NETWORK_PROVIDER.
Izbor tipa provajdera se moe definisati na sledei nain:
Criteria kriterijum = new Criteria();
kriterijum.setAccuracy(Criteria.NO_REQUIREMENT);
kriterijum.setPowerRequirement(Criteria.POWER_LOW);
// dobili provajder lokacije koji najvie odgovara traenim kriterijumima
String best = lokacija.getBestProvider(kriterijum, true);

Da bi se prihvatili podaci o promeni lokacije, neophodno je zatraiti odgovarajue


permisije u Android manifest fajlu (ACCESS_COARSE_LOCATION Network
provider ili ACCESS_FINE_LOCATION GPS provajder)
<manifest ... >
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
...
</manifest>
Ponekad je korisno upotrebiti poslednju poznatu lokaciju korisnika:

145

Razvoj aplikacija za operativni sistem Android


LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
// Or use LocationManager.GPS_PROVIDER
Location lastKnownLocation =
locationManager.getLastKnownLocation(locationProvider);

Slika 10.1. Tok praenja promene lokacije tokom rada aplikacije


Da bi se u emulatoru definisala lokacija, potrebno je u okviru Eclipse na putanji
Select Window > Show View > Other > Emulator Control, postaviti odgovarajue
parametre (latitude i longitude) ili preko kontrolne konzole:
telnet localhost <console-port>
geo fix -121.45356 46.51119 4392
Primer:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Acquire a reference to the system Location Manager
LocationManager locationManager = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location loc) {
// Called when a new location is found by the network location provider.
loc.getLatitude();
loc.getLongitude();
String Text = "My current location is: " + "Latitud = " +
loc.getLatitude() +"Longitud = " + loc.getLongitude();
Toast.makeText( getApplicationContext(),Text,
Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
146

Razvoj aplikacija za operativni sistem Android


public void onProviderEnabled(String provider) {
Toast.makeText( getApplicationContext(), "Gps
Enabled",Toast.LENGTH_SHORT ).show();
}
public void onProviderDisabled(String provider) {
Toast.makeText( getApplicationContext(), "Gps
Disabled",Toast.LENGTH_SHORT ).show();
}
};
// Register the listener with the Location Manager to receive location
updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, locationListener);
}

10.2.

Google Map eksterna biblioteka

Klase u okviru com.google.android.maps package omoguavaju preuzimanje,


renderovanje i keiranje elemenata Mape, kao i mnotvo opcija i kontrola za
prikaz.
Kljuna
klasa
u
okviru
Maps
package
je
com.google.android.maps.MapView, podklasa klase ViewGroup. MapView
prikazuje mapu sa podacima iz GoogleMaps servisa. Kada MapView ima fokus, on
je u mogunosti da hvata pritisak na dugmre ili pokrete kojima se mapa zumita
automatski, ukljuujui upravljanje zahtevima za dodatnim elementima mape.
Istovremeno, aplikacija moe koristiti i metode MapView klase da bi programerski
kontrolisala MapView i iscrtavala razliite tipove Overlay-a u okviru mape.
MapView obezbeuje omota oko Google Maps API koji omoguava aplikaciji da
manipulie Google mapama putem definisanih metoda, kao i da upravlja
podacima sa mapa isto kao sto svaki drugi View moe da prikae podatke.
Google Map biblioteka nije obuhvaena standardnim Android bibilotekama u
okviru SDK. Neophodno je dodati je kao ddodatak na Android SDK.
Budui da je Android u vlasnitvu Google-a, obezbeena je kvalitetna podrka za
jednostavno korienje popularnog Google-ovog servisa Google Maps-a. U ovom
odeljku emo pokazati kako je mogue jednostavno manipulisati mapom u okviru
nae aktivnosti.
Da bi koristili Google Maps, moramo jo pri kreiranju aplikacije u Eclipse-u da
izaberemo jedan od Google API-ja umesto nekog od obinih API-ja koje smo
koristili do sada. Razlog za ovo je to je kod za manipulaciju mapama vlasnitvo
Google-a pa nije deo standardnih API-ja; za svaku standardnu verziju API-ja (npr.
2.2) postoji i odgovarajua verzija Google API-ja i moe se skinuti iz Android SDK
Manager-a.
147

Razvoj aplikacija za operativni sistem Android

Pored ovoga, potrebno je da i ureaj na kom nameravamo da pokrenemo


nau aplikaciju takoe koristi istu verziju Google API-ja:

148

Razvoj aplikacija za operativni sistem Android

U manifest aplikacije treba specificirati da e se koristiti odreivanje


lokacije i internet, kao i da e se koristiti dodatna googleova biblioteka za
mape:
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
...
<uses-library android:name="com.google.android.maps" />
...
<application/>

Aktivnost u kojoj emo prikazivati mapu mora da nasleuje MapActivity


umesto obine Activity klase; takoe, u layoutu mora da ima MapView:
<com.google.android.maps.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="kljuc"
android:clickable="true" />

Da bismo mogli da koristimo Google Maps, moramo da dobavimo


odgovarjui API key, u ovom sluaju klju koji e biti specifino namenjen
emulatoru; za izdavanje aplikacije na marketu potrebno je nabaviti
drugaiji klju.
Prvo treba nai debug.keystore fajl koji se nalazi na nekoj od sledeih
putanja:
- Windows Vista: C:\Users\<user>\.android\debug.keystore
Windows
XP:
C:\Documents
and
Settings\<user>\.android\debug.keystore
- OS X and Linux: ~/.android/debug.keystore
Zatim treba pronai keytool.exe fajl koji se obino nalazi na sledeoj
putanji:
C:\Program Files\Java\<JDK_version_number>\bin
Korienjem ovog programa treba izgenerisati tzv. fingerprint koji e se
koristiti za dobijanje apija. To se postie izvrenjem sledee naredbe u
komandnoj liniji:
keytool.exe
-list
-alias
androiddebugkey
-keystore
"putanja_do_fajla\debug.keystore" -storepass android -keypass android

149

Razvoj aplikacija za operativni sistem Android

Po izvrenju dobiete tzv. Fingerprint koji treba kopirati:

I uneti na lokaciji:
http://code.google.com/android/maps-api-signup.html
Ovime ete konano dobiti API key koji moete da ubacite u xml layoutu:
android:apiKey="dobijeni_kljuc"

Jednostavan prikaz mape na ekranu:


public class MapsActivity extends MapActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.mapaview);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}

Sada moemo da ubacimo kod za manipulaciju mapom u nau aktivnost:


private MapController kontroler;
private MapView mapa;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapa = (MapView) findViewById(R.id.map);
kontroler = mapa.getController();
mapa.setSatellite(true); //setStreetView(true)
mapa.setBuiltInZoomControls(true);
150

Razvoj aplikacija za operativni sistem Android


final MyLocationOverlay overlay = new MyLocationOverlay(this, mapa);
overlay.enableMyLocation();
//overlay.enableCompass(); // kompas ne radi u emulatoru
overlay.runOnFirstFix(new Runnable() {
public void run() {
// Zoom in to current location
kontroler.setZoom(8);
kontroler.animateTo(overlay.getMyLocation());
}
});
mapa.getOverlays().add(overlay);
}

Prvo to radimo je da uzmemo reference na mapu i na MapController


objekat pomou koga moemo da pomeramo i zumiramo mapu. Metodom
setSatellite se prebacujemo u prikaz satelitskog snimka a metodom
setBuiltInZoomControls prikazuje kontrole za zoom in/out. Ove kontrole se
mogu ugasiti (ako ne elimo da korisnik koristi zum, ako sami
implementiramo neki metod zumiranja itd.)
Ako elimo da prikaemo korisnikovu lokaciju na mapi dobijenu preko GPSa ili nekog drugog provajdera lokacije, pravimo MyLocationOverlay objekat
koji je zaduen za kontinualno iscrtavanje korisnikove tekue pozicije.
Pozivom metode enableMyLocation nad tim objektom, ukljuujemo
praenje korisnikove pozicije. Metoda runOnFirstFix nam dozvoljava da
definiemo ta e se uraditi kada sistem dobije poziciju na kojoj se
nalazimo; u ovom primeru podeavamo zum i pomeramo lokaciju mape.
Na kraju, dodajemo MyLocationOverlay objekat meu Overlay-e koji e se
iscrtavati nad mapom.
Ako elimo da iscrtamo neke druge lokacije na mapi i da ih oznaimo
nekim naim markerima, koristimo Overlay klasu. Na mapu moemo da
dodamo vie overlay objekata, a svaki od njih moe da definie vie
lokacija i markera kojima e biti obeleeni. MyLocationOverlay koji smo
koristili za iscrtavanje pozicije korisnika je takoe usko specijalizovani
Overlay.

151

Razvoj aplikacija za operativni sistem Android

Korienjem Overlay objekata moemo da nacrtamo bilo kakvu sliku iznad


mape. Potrebno je definisati svoju klasu koja nasleuje Overlay objekat, a
onda u njenoj metodi onDraw iscrtati neto. U ovom primeru uzimamo
neku fiksnu taku i iscrtavamo ikonicu androida na toj poziciji.
private class MyOverlay extends com.google.android.maps.Overlay {
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
if (!shadow) {
Point point = new Point();
GeoPoint geoPoint = new GeoPoint(52334822, 4668907);
mapView.getProjection().toPixels(geoPoint, point);
Bitmap bmp
R.drawable.ic_launcher);

BitmapFactory.decodeResource(getResources(),

int x = point.x - bmp.getWidth() / 2;


int y = point.y - bmp.getHeight();
canvas.drawBitmap(bmp, x, y, null);
}
}
}

152

Razvoj aplikacija za operativni sistem Android

153

Você também pode gostar