Android Skripta 1-10
April 27, 2017 | Author: Dragiša Vlajković | Category: N/A
Short Description
Android Skripta 1-10...
Description
UNIVERZITET U BEOGRADU FAKULTET ORGANIZACIONIH NAUKA LABORATORIJA ZA ELEKTRONSKO POSLOVANJE
RAZVOJ APLIKACIJA ZA OPERATIVNI SISTEM ANDROID
Beograd, oktobar 2012.
Sadržaj
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 okruženje Android Runtime (Dalvik Virtual Machine)..............20
1.3.4.
Application Framevork.......................................................................21
1.3.5.
Integrisani pretraživač.......................................................................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 okruženja................................................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 korisničkog 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 kretajućeg kontekstualnog menija.....................................88
5.3.4.
Iskačući meni..................................................................................... 89
5.3.5.
Kreiranje meni grupa.........................................................................89
5.4.
Događaji u okviru korisničkog interfejsa..................................................91
5.4.1. 5.5.
Event listeners................................................................................... 92
Rad sa obaveštenjima – 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 beležnice.............................................................................. 109
6.2.
7.
Intents primeri....................................................................................... 114
6.2.1.
Slanje podataka novoj aktivnosti.....................................................116
6.2.2.
Vraćanje 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.
Skladištenje podataka.................................................................................. 125 8.1.
Zajednička podešavanja........................................................................125
8.2.
Interne memorije................................................................................... 127
8.3.
Skladištenje podataka na spoljašnoj 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
4
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 zatražio stvaranje Open Handset Alliance (OHA) udruženja, koja je sada angažovana u pružanju podrške i dalji razvoj sistema. Android je zasnovan na izmenjenoj verziji Linux jezgra. Prema istraživanjima kompanije Gartner iz prve polovine 2012.god., najveći udeo na tržištu imaju: Android, Symbian OS, iOS, RIM (slika 1).
Slika 1.1. Tržišno učešće mobilnih OS (Gartner, Jul 2012.) U Avgustu 2012. Android je dostigao tržišni udeo od 66%. Danas je preko 400 miliona Android mobilnih uređaja aktivno na tržištu Više od 200 uređaja različitih proizvođača koji rade na Android OS : HTC, Samsung, Motorola, LG, Sonny Ericsson. Android OS se sastoji od 12 miliona linija koda, uključujući 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 uključuje operativni sistem, posrednički softver kao i ključne aplikacije 5
Razvoj aplikacija za operativni sistem Android
za normalno funkcionisanje. Android SDK obezbeđuje alatke i API koji su neophodni za dalji razvoj aplikacija na Android platformi koristeći JAVA programski jezik. Prvobitno razvijen od strane Android kompanije. Prva zvanična verzija Android OS, razvijena u saradnji Google i OHA, lansirana je 2007 zajedno sa osnivanjem Open Handset Alliance, udruženja 78 kompanija posvećene unapređenju otvorenih standarda za mobilne uređaje. Gugl je veći deo Android koda objavio pod Apache licencom, licencom slobodnog softvera i licencom otvorenog koda. Shodno svojoj politici programskog okruženja:
OHA
ističe
sledeće
karakteristike
Android
• otvorenost - programeru omogućava potpunu slobodu u razvoju novih i već postojećih aplikacija, a proizvođaču uređaja slobodno korišćenje i prilagođavanje platforme bez plaćanja autorskih prava; • sve aplikacije su ravnopravne - što znači da ne postoji razlika između osnovnih jezgarnih aplikacija uređaja i dodatnih aplikacija. Svim aplikacijama omogućen je ravnopravni pristup resursima pokretnog uređaja što daje mogućnost prilagođavanja uređaja specifičnim potrebama individualnog korisnika; • automatsko upravljanje životnim ciklusom aplikacije omogućava nadzor pokretanja i izvršavanja aplikacija na sistemskom nivou optimizovanim korišćenjem memorije i snage uređaja. Krajnji korisnik više ne brine o gašenju određenih aplikacija pre pokretanja drugih; • uklanjanje granica "klasičnih" aplikacija - mogućnost razvoja novih i inovativnih aplikacija zasnovanih na međusobnoj kolaboraciji tehnologija; • brz i jednostavan razvoj aplikacija - omogućen je bogatom bazom korisnih programskih biblioteka (eng. libraries) i alata za izradu aplikacija; • visokokvalitetni grafički prikaz i zvuk - podržana 2D vektorska i 3D OpenGL (engl. Open Graphics Librari) grafika, te ugrađeni kodeci svih često korišćenih audio i video formata; • kompatibilnost sa većinom sadašnjeg i budućeg hardvera uključuje prenosivost Androidovih aplikacija na ARM, k86 i ostale arhitekture, te prilagodljivost sistema ulaznim i izlaznim komponentama.
6
Razvoj aplikacija za operativni sistem Android
1.1.Istorija razvoja Android sistema Jula 2005, Gugl kupuje malu kompaniju “Android Inc.” sa sedištem 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 uđe na tržište mobilnih telefona. Sve do 5. Novembra 2007. razvoj novog operativnog sistema za mobilne uređaje od strane Gugl korporacije svodilo se na špekulacije i nagađanja šta su prave namere Gugl korporacije, mada se sa izvesnom dozom sigurnosti znalo da Gugl priprema novi operativni sistem za ulazak na mobilno tržište. Tog dana svetu je predstavljena “Open Handset Alliance” (OHA) koja je predstavljala konzorcijum više kompanija koje su predstavljale značajne “igrače” na tržištu 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 doživeo na telefonu kompanije HTC, koja je u sradnji sa kompanijom Gugl razvila telefon koji će uspešno realizovati početne 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 dečjih bolesti, te je Gugl šest meseci kasnije izbacio novu verziju sistema koja je ispravila par “kritičnih problema”, podršku za glasovnu pretragu, mogućnost plaćenih aplikacija u onlajn prodavnici (“Market”), ispravljene probleme u vezi sa servisom “Gmail” i još nekoliko sitnih prepravki. Ova ažurirana 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 inženjerima zaduženim za razvoj sistema, a i korisničkih aplikacija.
7
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 uređaje, Android 1.5 koji je imao kodni naziv “Cupcake” (mala torta). Od ove verzije Gugl je svakoj novijoj verziji dodeljivao naziv nekog slatkiša, a skoriji dolazak nove verzije bio bi najavljivan postavljanjem skulpture sledeće “poslastice” ispred sedišta firme. Nova verzija donela je značajna poboljšanja sistema u vidu novih mogućnosti kao što su:
Android 1.5 Cupcake
-
snimanje video sadržaja podrška za stereo blutut slušalice
-
podesiva tastatura
-
prepoznavanje glasa
-
mogućnost koja je pružena programerima da kreiraju sopstvene aplikacije za početni ekran (“Home Screen”), koje se nazivaju Vidžeti (“Widgets”).
Nova verzija sistema koja se prvobitno pojavila kao nadogradnja za postojeći HTC Dream, privukla je i druge proizvođače, 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 proizvođača mobilnih uređaja, koje je izazvala pojava verzije 1.5 bilo je neophodno održati korak sa konkurencijom koja je napredovala na svakom polju. Gugl je bio svestan stanja na tržištu mobilnih uređaja i nastavio strategiju konstantnog poboljšanja i uvođenja novih mogućnosti svog sistema. Android 1.6 (“Donut”)
Nova verzija nazvana “Krofna” (“Donut”), donela je brojna poboljšanja već široko prihvaćenog operativnog sistema. Promene u verziji 1.6 predstavljale su jasan znak da je Gugl ceo projekat shvatio veoma ozbiljno. Najznačajnija poboljšanja u verziji 1.6 su: 8
Razvoj aplikacija za operativni sistem Android
-
Novi izgled Onlajn Prodavnice (“Market”) koji je omogućio korisnicima lakši pristup i bržu pretragu željenih aplikacija Kameru i video kameru integrisanu u Galeriju, koja je sada omogućavala izbor više datoteka za istovremeno brisanje
-
Podršku za nove tehnologije kao što su: CDMA/EVDO, 802.1x i “textto-speech”
-
Podršku za navigacione aplikacije
-
Razna poboljšanja po pitanju brzine, pretrage grafičkog interfejsa, itd.
Pored svih pozitivnih strana nove verzije sistema, polako je do izražaja dolazio problem koji će pratiti Android operativni sistem sve do današnjih verzija. Kako je Gugl za telefon za razvoj sistema izabrao HTC Dream i sistem razvijao na osnovu mogućnosti koje je taj telefon posedovao, prvi u redu za ažuriranje sistema bio je upravo HTC Dream. Međutim, problem se javio pošto je veliki broj saradnika izbacio na tržište svoje telefone sa do tada aktuelnom verzijom sistema 1.5. Kako je svaki proizvođač prilagodio Android okruženje svojim potrebama, odnosno izmenio okruženje tako da odgovara mogućnostima svojih modela, lako ažuriranje nije bilo moguće, jer nova verzija sistema nije mogla da se primeni bez dodatne manipulacije od strane proizvođača. 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 vremešni HTC Dream je polako zaostajao za konkurencijom po pitanju tehničkih mogućnosti, naime imao je preslab hardver za vreme koje je dolazilo. Imajući u vidu dinamiku razvoja tržišta Gugl u saradnji sa HTC korporacijom započinje razvoj novog telefona koji će služiti 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 uređaj 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 značajne promene kako po pitanju izgleda grafičkog interfejsa, tako i po pitanju brojnih novih mogućnosti koje je nova verzija uključivala.
9
Razvoj aplikacija za operativni sistem Android
Promene koje je nova verzija donela su mnogobrojne, ali kao najbitnije se mogu istaći: -
-
Podrška za “Microsoft Exchange” koji omogućava povezivanje mobilnog telefona sa serverom koji kroz ovaj protokol omogućava lakšu komunikaciju između npr. firme i zaposlenog (mail, calendar, outlook...) Podrška za “Facebook” koja integriše ovu socijalnu mrežu u kontakte telefona
-
Poboljšanja veb pretraživača
-
Potpuno nova aplikacija za pretraživanje mapa (“Google Maps”), po prvi put ova aplikacija omogućava pregled satelitskis snimaka na mobilnom telefonu
-
Novi Jutjub (“Youtube”) vidžet koji omogućava brzo postavljanje svojih snimaka na servere Jutjuba
-
Novi način upravljanaj kontaktima koji omogućava znatno lakši pristup opcijama nego do tada...
Motorola Droid koja je imala procesor tek prosečne snage, imala je zavidan grafički procesor, tako da su značajne firme na polju 3D igara polako počele da svoje naslove prilagođavaju sve jačim Android uređajima.
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 omogući razvojnom timu kompanije Gugl, ali i ostalim programerima da dalje unapređuje 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, podržavao je microSD kartice veličine 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 zadržan 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 sledećem periodu. Ova verzija sistema je masovno prihvaćena od svih proizvođača telefona koji su bili uključeni u Android projekat i predstavlja prvu sledeću “masovnu” verziju nakon verzije 1.5. I ako mnogi proizvođači nisu vršili nadogradnju 1.5 verzije na 1.6 ili pak 2.0 verziju operativnog sistema Android, ovog puta pripremali su nadogradnju za već realizovane mobilne uređaje na verziju 2.1. Poboljšanja koja su razdvajala Andorid 2.0 od verzije 2.1 su sledeća: -
Poboljšana ukupna brzina sistema Podrška za nove veličine ekrana i rezolucije istih
-
Novi grafički interfejs web pretraživača i podrška za HTML5
-
Podrška za blic za kameru
-
Digitalni zum
-
Podršku za registrovanje pokreta više prstiju od jednom, tzv. “Multitouch”
-
Poboljšana tastatura
-
Podrška za blutut verzije 2.1 (blutut transfer datoteka)
-
“Live Wallpapers”...
Nakon pojavljivanja “Google Nexus One” telefona, nastala je prava bujica novih modela gde je vodeću ulogu imala kompanija HTC. Ponovo do izražaja dolazi nemogućnost centralizovanog ažuriranja sistema od strane Gugla, već je nova verzija ponovo morala da prođe proces prilagođavanaj od strane drugih proizvođača. Ovaj nedostak uslovio je da i do danas mnogi modeli nisu doživeli svoju premijeru na novom operativnom sistemu, koji je sada ciljao mnogo moćnije telefone nego što je do tada bio slučaj. Nova verzija operativnog sistema donela je značajna poboljšanja po pitanju 3D tehnologije, odnosno aplikacija. Pojavljivanje Android 2.0 koji je pokrenuo razvoj kompleksnih 3D aplikacija za mobilne uređaje, bio je dodatno ubrzan pojavom Android 2.1 sistema. Po prvi put se ispred sedišta firme jedna skulptura zadržava duže od par meseci, po prvi put prošlo je 7 meseci pre nego što je Gugl predstavio novu verziju, što je značilo samo jedno – veliko poboljšanje sistema.
11
Razvoj aplikacija za operativni sistem Android 1.1.5.Android 2.2 (“Froyo”)
Nakon dužeg perioda bez ikakvih vesti o novoj reviziji operativnog sistema Android, ispred sedišta firme, zvanično je postavljena skulptura smrznutog jogurta (“Froyo”) što je značilo da je nova verzija sistema spremna i da je Guglov uređaj (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 tržištu mobilnih telefona. Android 2.2 predstavljen na Gugl samitu u Maju 2010. godine, sadržao je najveću listu poboljšanja koja je neka verzija sa svojom pojavom donela, ali možda najzačajniju od svih, ono poboljšanje koje je Android distanciralo od Android 2.2 (“Froyo”) konkurentskih operativnih sistema jese podrška za fles animacije (“Flash animation”) koja je implementirana u saradnji sa kompanijom Adobe. Poboljšanaj koja su uključena u novoj verziji su: -
Veliko povećanje ukupne brzine sistema, optimizacija korišćenja memorije Dodatno povećanje procesiranja aplikacija koja je ostvarena primenom “JIT” (“Just in Time”) skripte
-
Integracija “Chrome” V8 JavaScript u veb pretraživač
-
Poboljšana podrška za “Microsoft Exchange”
-
Mogućnost deljenja internet konekcije sa drugim uređajima putem USB ili WiFi konekcije (“Tethering”)
-
Opcija za brzo isključivanje mobilne mreže
-
Nova onlajn prodavnica (“Market”) sa mogućnošću automatske nadogradnje aplikacija
-
Podrška za “upload” preko veb pretraživača
-
Podrška za instaliranje aplikacija na proširivu memoriju (microSD)
-
Podrška za Adobe Flash 10.1
-
Podrška 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 označila pojava Adobe Flash playera na mobilnim uređajima, koja je bila pokretana od strane grafičkog procesora. Ova podrška je izazvala burne reakcije od strane konkurenata, pre svega američke kompanije Apple, koja nije želela da u svoje uređaje implementira podršku za flash. Tada je nastao svojevrsni medijski rati na relaciji Apple-Adobe i Apple-Google. Proces koji je započet verzijom 2.1, nastavljen je proces migracije starih verzija na aktuelnu. Ovog puta Gugl je imao nešto drugačiji pristup, u saradnji sa ostalim proizvođačima pronađen je način da se beže vrši nadogradnja postojećih 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 omogućio prodaju telefona isključivo programerima koji su radili na razvoju aplikacija za njihov operativni sistem. Konačno, Android je bio dovoljno konkurentan operativnom sistemu kompanije Epl (“Apple”), tako da je velikom brzinom počeo da grabi tržišno učeće. Da bi krajem iste godine došao na lidersku poziciju i trenutno zauzima najveći procenat aktivnih verzija Android mobilne platforme, a Android lidersku poziciju na tržištu mobilnih operativnih sistema uopšte.
13
Razvoj aplikacija za operativni sistem Android
1.1.6.Android 2.3 (“Gingerbread”)
Ponovo se Gugl povlači i primiruje narednih 6 meseci, pre nego što se skulptura izložena krajem Maja 2010. godine, ne zameni. 6. Decembra 2010. godine osvanula je nova maskota ispred prostorija firme, nova verzija je bila spremna. Uzmajući u obzir sve veće zahteva mobilnog tržišta i dolaska u prvi plan želje korisnika koje su nekad bile marginalne (poput 3D igrica), Gugl u saradnji sa južno korejskom kompanijom Samsung razvija novi telefon u svrhe razvoja sistema i aplikacija. “Google Android 2.3 (“Gingerbread”) Nexus S” je rođen.Iako je prethodne verzije tzv. Gugl telefona razvijao tajvanski HTC, Gugl je ovaj put izabrao Samsung kako ne bi favorizovao nijednog od postojećih poslovnih partnera koji učestvuju u konzorcijumu “OHA”.
“Google Nexus S” predstavljen je zajedno sa najnovijom verzijom operativnog sistema Android 2.3, koji nosi kodni naziv Medenjak (“Gingerbread”). Izneverivši mnoga očekivanja i špekulacije, Android “Gingerbread” nije došao sa oznakom 3.0 kako su mnogi očekivali, već 2.3. Verzija 3.0 kako će se kasnije saznati bila je rezervisana za ulazak Androida na novo tržište, trošte tablet Google Nexus S uređaja. Poboljšanaj koja su došla sa novom verzijom, u odnosu na prethodnu su brojna, najznačajnija su sledeća: -
Redizajniran grafički interfejs (“UI”) Podrška za ekrane rezolucije veće od 800x480 VOIP podrška Podrška za WebM/VP8 video Podrška za NFC (“Near Field Communication “) Unapređena “copy/paste” funkcija Nova “multitouch” tastatura Audio, video i grafička unapređenja namenjena za programere i razvojne timove video igara Dodata podrška za nove senzore poput žiroskopa 14
Razvoj aplikacija za operativni sistem Android
-
Poboljšana kontrola energije i aplikacija Podrška za više kamera Zamena “YAFFS” “EXT4” sistemom datoteka...
Do samita u Barseloni koji je završen 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 završava predstavljanje aktuelnih verzija operativnog sistema za mobilne uređaje – Android, u sledećem poglavlju biće opisane nove najavljene verzije ovog sistema, kako za mobilne telefone, tako i za tablet uređaje. 1.1.7.Android 2.4 (“Gingerbread”, “Ice-Cream”?)
Android 2.4 ?
Android 2.3 još nije pošteno zaživeo na mobilnim uređajima (uređaji koji podržavaju ovu verziju se mogu nabrojati na prste jedne ruke), Gugl već najavljuje novu verziju svog operativnog sistema namenjenim za mobilne telefone. Nagađanja govore da će nova verzija najverovatnije zadržati isti kodni naziv kao i prethodna, ili da će se nazivati Sladoled (“Ice-Cream”), a da će se izmene pre svega odnositi na podršku aplikacija koje su namenjene za Android 3.0.
Podrška se odnosi na mogućnost pokretanja aplikacija koje su namenjene za procesore sa više jezgara, da se uspešno izvršavaju na procesorima sa jednim jezgrom, pošto trenutna verzija to ne podržava. Ipak, nova verzija se neće pojaviti do Aprila 2011. godine tako da se sve informacije svode na špekulacije i nagađanaja. 1.1.8.Dalji razvoj Android sistema
Pojavom novih uređaja na tržištu mobilnih uređaja, pre svega tablet uređaja čija erupcia je nastala pojavom Eplovog (“Apple”) “iPad” rešenja, sve veći pritisak na Gugl vršili su poslovni partneri kojima je bilo neophodno rešenje operativnog sistema prilagođenog za rad na znatno većim ekranima od onih koji su se nalazili na mobilnim telefonima. Neki partneri nisu čekali na Gulg da prilagodi svoj sistem potrebama tablet uređaja, 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 prilagođenim interfejsom posebno za tablet. 15
Razvoj aplikacija za operativni sistem Android
Iako je Gugl tvrdio da dosadašnje verzije nisu prilagođene za rad sa tablet uređajima, Galaxy Tab doživljava veliki tržišni uspeh, što dodatno pritiska Gugl da ubrza razvoj novog sistema za te uređaje. 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 Saće (“Honeycomb”) . Za sada dostupan samo kao test verzija, ali se već pojavljuju uređaji pokretani ovim operativnim sistemom. Promene koje donosi novi operativni sistem se odnose pre svega na prilagođenost većim ekranima i sanžnijim konfiguracijama Android 3.0 (“Honeycomb”) tablet uređaja: -
Novi grafičko interfejs namenjen tablet uređajima Radna površina u tri dimenzije (3D) sa novim, redizajniranim vidžetima Novi način simultanog izvršavanja aplikacija (“Multitasking”) Veb pretraživač napravljen posebno za potrebe tablet uređaja Podrška za video ćaskanje (“Chat”) koristeći Gugl aplikaciju “Google Chat”) Interfejs koji se izvršava na nivou grafičkog procesora (“Hardware Acceleration”) Podrška za proceore sa više jezfara...
Motorola Xoom
1.1.10.
Prvi uređaj koji koristi novu verziju operativnog sistema Android, 3.0 “Honeycomb” je Motorola Xoom. Ovaj uređaj poseduje procesor sa dva jezgra, “nVidia Tegra2” proceor koji podržava puštanje videa u pravoj HD rezoluciji 1080p. Uređaj ima i prednju kameru namenjenu za video razgovore. Sve ovo bi trebalo da predstavi očigledne prednosti u odnosu na konkurentski “Apple iPad” koji ima nedostatak ovih mogućnosti.
Android 3.1
Objavljen u Maju 2011., podržava dodatne tipove ulaznih uređaja, USB host mode direktno sa kamera i drugih uređaja, 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 različite veličine ekrana, učitavanja 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: otključavanje telefona na osnovu lica, upravljanje komunikacijom preko mreže, upravljanje aktivnostima na drustvenim mrežama na jednom mestu, poboljšano 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 uređajima – OS prilagođava izgled različitim tipovima uređaja i kompatibilian je sa 2D, 3D grafičkim bibliotekama
Skladištenje podataka – SQL lite relaciona baza podataka za upravljanje podacima
Konektivnost – Android podržava 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 pišu u Java programskom jeziku, Dalvik virtuelna mašina
Podrška 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 tag), Adobe Flash Streaming (RTMP), HTTP Dynamic Streaming
Dodatna harderska podrška - kamera, touchscreen, GPS, brzinometar, žiroskop, magnetometar, senzori udaljenosti i pritiska, termometri
Okruženje za razvoj – Android Development Plugin
Tržište – GooglePlay je online katalog aplikacija koje se mogu preuzeti i instalirati na Android uređaje, bez potrebe za računarom.
Multi-touch – mogućnost uređaja da prepozna tri različite pozicije „ulaznih dodira“
Bluetooth
Video poziv
Multitasking – multitasking aplikacija
Funkcionalnosti zasnovane na glasu – Pozivanje, pretraga, navigacija pomoću glasa
Tethering – Android telefon može 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 korišćenje jezgra operativnog sistema Linux je dokazana pogonska podrška (eng. driver model), mogućnost upravljanja memorijom i procesima, sigurnosni model, mrežni sistem, te dokazana robusnost, konstantni razvoj i unapređivanje sistema. Slika 1.2 prikazuje arhitekturu Android sistema. Sloj aplikacije Kontakti
Standardne aplikacije
Aplikacije proizvođača
Pretraživač
...
Okvir aplikac. (Framework) Upravljanje aktivnostima
Upravljanje prozorima
Provajderi sadržaja
Upravljanje obaveštenjima
Upravljanje paketima
Upravljanje resursima
Upravljanje lokacijama
XMPP servis
Android Runtime
Biblioteke Surface Manager
SQLite
FreeType
Biblioteke jezgra
WebKit
SSL
OpenGL| ES
Dalvik virtuelna mašina
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
Najvažniji elementi jezgra su: pogonski program za međuprocesnu komunikaciju između 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 sledeći sloj u arhitekturi sistema. Neke od značajnijih su: UI - program za upravljanje grafičkim interfejsom (eng. Surface Manager) - biblioteka odgovorna za pravilno iscrtavanje različitih aplikacionih komponenti u vremenu i prostoru; OpenGL ES (eng. OpenGL for Embedded Sistems) - biblioteke koje se koriste za hardversku 3D akceleraciju (ukoliko je podržana) ili za 3D rasterizaciju; SGL (eng. Scalable Graphics Librari) - predstavlja 2D biblioteke na kojima je zasnovana većina aplikacija. Spomenimo još da se 2D i 3D elementi mogu kombinovano prikazivati u jednom korisničkom interfejsu; Media Framevork - grupa kodeka za snimanje i reprodukciju audio formata, video formata i nepomičnih slika. Omogućena je od strane PacketVidea; FreeTipe - biblioteka koja služi za vektorsku rasterizaciju oblika pisma (eng. font); SSL (eng. Secure Socket Laier) - omogućava rezervnu komunikaciju preko Interneta; SKLite - programska biblioteka koja implementira bazu podataka (eng. database engine); VebKit - Jezgro pretraživača koji podržava JavaScript i ostale standarde na malom uređaju; 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 okruženje Android Runtime (Dalvik Virtual Machine)
Naredni sloj u arhitekturi Androida je radno okruženje (eng. Android runtime) kojeg čine virtuelni mašina Dalvik (DVM, eng. Dalvik Virtual Machine) i jezgrene biblioteke (eng. core library). DVM je registarski bazirana virtuelna mašina, dok je klasična Javina virtuelna mašina (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 slično. 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 uređajima, Google je razvio sopstvenu virtuelnu mašina za Android. DVM Je najverovatnije razvijen kako bi se zaobišla problematika s dozvolama korišćenjem Sunovog J2ME. Svaki pokretni uređaj koji u sebi sadrži J2ME mora kod Suna licencirati bilo kakvu promenu izvornog koda J2ME-a. Virtuelna mašina Dalvik dobila je ime po istoimenom Islandskom gradu u kojem su živeli preci glavnog developera DVM-a Dan Bornstein. Osnovna razlika između Sun Java virtuelnih mašina i DVM-a je u tome što su prvo spomenuti virtualni uređaju bazirani na steku, dok je DVM registarski baziran virtuelni mašina. Međukod (eng. bitecode) Dalvik virtuelne mašine transformiše se pomoću 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. Međukod koji izvršava DVM nije Javin međukod, nego upravo spomenuti .dex oblik. Transformacija formata omogućava bolju prilagođenost za rad na manjim procesorima boljim iskorišćavanjem raspoložive memorije i procesorske snage. Rezultat svega je mogućnost višestrukog instanciranja same virtuelne mašine što znači da se svaka Android aplikacija pokreće kao zasebni proces, s vlastitom instancom virtuelne mašine Dalvik. 1.3.4.Application Framevork
Sloj aplikativnih okvira (eng. Application Framevork) napisan je u programskom jeziku Java i sadrži proširiv skup programskih komponenti kojeg koriste sve aplikacije uređaja. Framework podržava mnogobrojne open source jezike kao što su openssl, sqlite i libc. Takođe podržava i jezik Android jezgra. Sa gledišta sigurnosti, framework se bazira na UNIX file
21
Razvoj aplikacija za operativni sistem Android
system ovlašćenjima koja osiguravaju da aplikacije poseduju samo one mogućnosti koje im je vlasnik telefona dao pri instalaciji aplikacije. Neki od važnijih elemenata su: upravljanje aktivnostima (eng. Activiti Manager) - upravljanje životnim ciklusom aplikacije, upravljanje programskim paketima (eng. Package Manager) sadrži informaciju o aplikacijama instaliranim na sistemu upravljanje prozorima (eng. Window Manager) - upravljanje aplikacionim prozorima, upravljanje pozivima (eng. Telephone Manager) - sadrži API-je koji se koriste pri izradi aplikacija za upravljanje pozivima, pružaoci sadržaja (eng. Content Providers) - omogućavaju zajedničko korišćenje podataka od strane više aplikacija, upravljanje resursima (eng. Resource Manager) - služi za skladištenje delova aplikacije koji nisu kod (npr. slike), sistem grafičkog prikaza (eng. Viev Sistem) - sadrži bazu gotovih grafičkih prikaza i alata (eng. vidget), upravljanje lokacijski zasnovanim uslugama (eng. Location Manager) i upravljanje notifikacijama (eng. Notification Manager) - upravljanje notifikacijama i događajima (npr. dospeće poruke, nadolazeći sastanak). Aplikativni sloj je poslednji sloj u arhitekturi sistema Android i čine ga korisničke aplikacije uređaja. Predstavlja sloj vidljiv krajnjem korisniku. Uključuje neke od standardnih sistemskih aplikaciJa kao što su Veb pretraživač, lista kontakata, telefon, itd. 1.3.5.Integrisani pretraživač
Google je napravio pravi potez izborom WebKit kao open source web pretraživača. Ubacili su dva veoma bitna poboljšanja, two pass layout i frame flattening. Two pass layout otvara stranicu bez čekanja na blokirajuće elemente, kao što su eksterni CSS ili eksterni JavaScript, ali posle kraćeg perioda ponovo otvara stranicu sa svim podacima na strani. Frame flattening konvertuje postojeće okvire stranice u jedan okvir i taj okvir pokazuje na ekranu. Ova poboljšanja pospešuju 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 moguće 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 pucačka 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 više nego pogodan za platformu kao što je Android. Postoji veliki broj karakteristika koje zavise od hardvera, kao što su velika količina multimedijalnih fajlova, podrška konekcija, GPS, unapređena podrška 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 uređaj, 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 podešava dozvole za sve fajlove u okviru aplikacije, tako da samo aplikacija sa određenim user id može da im pristupi
Svaki proces poseduje sopstvenu virtualnu mašinu, tako da jedna aplikacija može da se izvršava nezavisno od drugih
Svaka aplikacija se izvršava u okviru svog Linux procesa
Aplikacija može zahtevati pristup podacima na urešaju kao što su: skladište podataka, korisnički kontakti, SMS poruke, Bluetooth, itd.
1.4.1.Komponente aplikacija
Osnovni elementi svake Android aplikacije su njene komponente, koje određuju ponašanje i karakteristike aplikacije. Sistem može 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 korisničkim interfejsom. Na primer email aplikacija može imati jednu aktivnost koja prikazuje listu novih mejlova, druga aktivnost omogućava pisanje mejla, a treća aktivnost služi za čitanje mejlova. Iako su aktivnosti u okviru jedne aplikacije komponovane i koordinirane tako da predstavljaju logičku celinu, svaka od njih je nezavisna. U skladu sa tim, različite aplikacije mogu da startuju akitvnosti iz drugih aplikacija. Na primer aplikacija za rad kamere, može startovati aktivnost iz email aplikacije kako bi omogućila deljenje fotografija na društvenoj mreži. Svaka aktivnost se implementira kao podklasa klase Activity. Servisi (Services) Servis je komponenta koja se izvršava u pozadini kako bi se omogućila realizacija dugotrajnih operacija, kao i izvršavanje udaljenih procesa. Servis ne pruža korisnički interfejs. Na primer, servis može da pušta muziku u pozadini dok se korisnik nalazi u nekoj drugoj aplikacija. Aktivnost može da pokrene servis Provajderi sadržaja (Content providers) Provajder sadržaja upravlja deljenim setom podataka aplikacije. Podaci se mogu skladištiti u fajl sistemu, bazi, na vebu ili bilo kojoj perzistentnoj lokaciji kojoj aplikacije može da pristupi. Preko provajdera sadržaja aplikacija može da vrši upit nada podacima. Na primer, Android pruža provajdera sadržaja koji upravlja informacijama o imeniku na telefonu. Svaka aplikacija sa odgovarajućim permisijama, preko provajdera sadržaja može da pristupi kontaktima u imeniku. Broadcast receivers Ova komponenta aplikacije je vezana za prenos sistemskih objava i notifikacija. Većina broadcast receiver-a potiče iz sistema – obaveštenje da je baterija slaba, ili da je slika napravljena i sl. Ova komponenta ne učestvuje u korisničkom interfejsu, ali može da se pojavi kao notifikacija lampice i sl. Jedinstvena karakteristika Android OS je u tome što svaka aplikacija može startovati komponente iz neke druge aplikacije. Komponente aplikacije se aktiviraju preko asinhrone poruke – intenta. Sve komponente jedne aplikacije se definišu u okviru AndroidManifest.xml fajla. Svaka Android aplikacija osim koda sadrži i odgovarajuće resurse, kao što su slike, audio fajlovi, stilovi, itd.
24
Razvoj aplikacija za operativni sistem Android
2. Instalacija i postavljanje razvojnog okruženja Za razvoj aplikacija za Android operativni sistem potrebno je instalirati sledeće programe navedenim redosledom:
Java SDK Eclipse IDE Android SDK Android Development Tools Plugin za Eclipse Potrebne verzije Android platformi za Android SDK
Android SDK podržava Windows, Linux i Mac OS operativne sisteme. Za pisanje Android aplikacija koristi se programski jezik Java. Programer može da izabere proizvoljno razvojno okruženje. Potrebno je napomenuti da je najjednostavnije razvijati Android aplikacije u Eclipse razvojnom okruženju, pošto je Google za njega obezbedio najbolju podršku u vidu dodataka (plugins). Rad u ostalim okruženjima je komplikovaniji, zato što nisu integrisana sa Android SDK-om, te je neophodno pokretati odgovarajuće alate iz konzole (komandne linije). U daljem tekstu biće opisan postupak postavljanja Android razvojnog okruženja za operativni sistem Windows. Navedeni postupak se neznatno razlikuje za Linux i MacOS operativne sisteme. Prvi korak pri postavljanju razvojnog okruženja jeste instalacija Java Development Kit paketa (JDK). Ukoliko je na računaru prethodno već instaliran Java Runtime Environment paket (JRE), neophodno je instalirati i JDK, pošto on sadrži kompajlere i alate za rad sa izvornim kodom, koji nisu prisutni u JRE paketu. Java Development Kit je moguće 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, otvoriće se stranica gde je moguće 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, započeće sesa procesom preuzimanja. Po završetku preuzimanja i startovanju fajla, krenuće 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 Sledeći korak jeste instalacija Eclipse Integrated Development Environment-a (razvojno okruženje). Njega je moguće besplatno preuzeti sa adrese http://www.eclipse.org/downloads/. Eclipse razvojno okruženje podržava Windows, Linux i MacOS X operativne sisteme, kao i čitav niz programskih jezika. Moguće je koristiti bilo koju verziju Eclipse-a koja podržava Java programski jezik. Pošto na sajtu za preuzimanje Eclipse razvojnog okruženja postoji veliki broj različitih verzija, odlučićemo se za najjednostavniju verziju koja podržava 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 okruženja Nakon izbora verzije Eclipse-a, treba izabrati i mirror sajt sa koga će se preuzimanje izvšiti. Od izabranog načina preuzimanja jedino zavisi brzina samog download-a, te ovaj izbor nije od presudne važnosti. Možete izabrati prvi preporučeni 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 uspešnog preuzimanja, dovoljno je raspakovati tu arhivu u željeni folder (npr. C:\, tako da će konačna 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 okruženja Pošto Eclipse IDE nije instaliran na uobičajeni način, raspakivanjem nisu postavljene prečice izvršnog fajla na radnu površinu i u Start meni. To je moguće uraditi ručno. Najpre treba otići u folder C:\eclipse (odnosno u folder gde je Eclipse raspakovan) i kliknuti na fajl eclipse.exe desnim tasterom miša, a zatim izabrati opciju Copy. Potom treba kliknuti na prazan deo radne površine desnim tasterom miša i izabrati opciju Paste shortcut. Sledeći korak jeste instalacija Android Software Development Kit-a (SDK). Njega je moguće besplatno preuzeti sa sajta http://developer.android.com/sdk/index.html . Na navedenom sajtu je potrebno izabrati verziju za željeni operativni sistem. U slučaju Windows-a, preporučljivo je preuzeti exe datoteku, pošto je to verzija SDK sa ugrađenim 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 moguće 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 završetku instalacije, startovaće se SDK Manager. Ovde je moguće izabrati verzije Android API-a koje se mogu preuzeti.
Slika 2.10 – SDK Manager Izbor verzije Android API-a veoma je važan, zato što od toga direktno zavisi da li će aplikacija raditi na određenom mobilnom telefonu ili tablet uređaju. Na primer, ako se izabere verzija 3.0 API-a, aplikacija svakako neće raditi na starijim Android telefonima. Nove verzije API-a imaju naravno više funcionalnosti, ali manju kompatibilnost sa starijim uređajima. Izborom opcije Accept All (Slika 2 .10) i klikom na taster Install započeće se preuzimanje i instalacija svih verzija API-a, prateće dokumentacije i primera. Verzija API-a za koju će se kreirati aplikacija bira se naknadno. 30
Razvoj aplikacija za operativni sistem Android Nakon završenog preuzimanja potrebnih fajlova, instalirane komponente je moguće videti u odeljku Installed Packages. Naknadno je moguće 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 uključuju 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 moguće je kreirati i podesiti virtuelne Android mobilne uređaje, koji se koriste prilikom testiranja aplikacije. Potrebno je izabrati opciju Virtual Devices. Ovde se prikazuje spisak podešenih virtuelnih Android uređaja. Klikom na taster New moguće je kreirati novi uređaj (Slika 2 .12).
31
Razvoj aplikacija za operativni sistem Android
Slika 2.12 – Virtuelni uređaji U novootvorenom prozoru moguće je podesiti parametre virtuelnog uređaja. U pitanju su sledeći parametri:
Name – proizvoljan naziv virtuelnog uređaja. Target – verzija Android API-a koju koristi uređaj. SD Card – podešavanja virtuelne memorijske kartice. Ukoliko se izabere opcija Size, moguće je zadati veličinu nove virtuelne memorijske kartice. Ukoliko se izabere opcija File, moguće je učitati sadržaj image fajla kao virtuelnu memorijsku karticu. Snapshot – ukoliko se izabere opcija Enabled, omogućiće se pamćenje stanja virtuelnog uređaja i kasnije učitavanje tog stanja prilikom ponovnog uključivanja virtuelnog uređaja. Opcija Snapshot je slična opciji Hibernate u Windows operativnom sistemu. Skin – predstavlja rezoluciju ekrana virtuelnog uređaja. Može se izabrati neka od predefinisanih standardnih rezolucija (Built-in) ili se može zadati proizvoljna vrednost rezolucije (Resolution). Hardware – prilikom kreiranja virtuelnog uređaja, može se izabrati virtuelni hardver koji uređaj sadrži (na primer GPS prijemnik, memorijska kartica, kamera i drugo).
Na primer, kreiraćemo novi virtuelni uređaj sa parametrima kao na slici 2.13. Nakon unosa vrednosti parametara, kliknućemo na taster Create AVD, čime će novi Android virtuelni uređaj biti sačuvan.
32
Razvoj aplikacija za operativni sistem Android
Slika 2.13 – Kreiranje novog Android virtuelnog uređaja Sada treba izaći iz SDK Manager-a i pokrenuti Eclipse razvojno okruženje. Prilikom prvog startovanja ovog okruženja, potrebno je izabrati lokaciju workspace-a. Workspace u stvari predstavlja folder u kome će se nalaziti projekti rađeni u Eclipse razvojnom okruženju. Workspace se obično nalazi u okviru ličnog 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 okruženja. Nakon ovog podešavanja treba kliknuti na taster OK.
Slika 2.14 – Izbor lokacije workspace-a Sada je neophodno instalirati dodatak koji omogućava 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 Otvoriće 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 započeo proces instalacije dodataka za Eclipse. Ukoliko se pojavi prozor koji obaveštava korisnika da sadržaj koji se preuzima nema digitalni potpis, potrebno je kliknuti na taster OK, čime se omogućava instalacija (Slika 2 .21).
Slika 2.21 – Obaveštenje o nepotpisanom sadržaju
Nakon završetka instalacije, potrebno je ponovo pokrenuti Eclipse razvojno okruženje (Slika 2 .22).
Slika 2.22 – Obaveštenje 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 – Podešavanje dodatka za Eclipse IDE
Ovime je završen proces podešavanja Android razvojnog okruženja i sada je moguće kreirati aplikacije za Android platformu!
2.1.Kreiranje nove Android aplikacije Kreiranje nove Android aplikacije korišćenjem Eclipse razvojnog okruženja dosta je jednostavno. Nakon startovanja okruženja, 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 sledećem koraku, pojaviće se novi ekran gde programer može da unese odgovarajuće parametre vezane za Android projekat (Slika 2 .25). Navedeni parametri su:
Project Name – Proizvoljan naziv novog Eclipse projekta. Contents – Sadržaj projekta. Postoji tri različite opcije parametra Contents: o Create new project in workspace – kreiranje potpuno novog projekta. o Create project from existing source – uvoz postojećeg koda u novokreirani projekat. o Create project from existing sample – korišćenje 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 uređaju. o Package Name – Naziv Java paketa u okviru koga će se pisati klase projekta. o Create Activity – Ukoliko je opcija izabrana, kreiraće se nova prazna aktivnost u okviru projekta. U tom slučaju, neophodno je uneti i naziv te aktivnosti. Više o aktivnostima možete pročitati 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 početak, nećemo kreirati Android aktivnost. O tome će više reči biti u poglavlju 3.2.
38
Razvoj aplikacija za operativni sistem Android
Slika 2.25 – Parametri novog Android projekta
Nakon uspešno podešenih parametara, potrebno je kliknuti na taster Finish. Ovime je kreiran novi Android projekat. Kreiranjem novog Android projekta, generišu se određeni 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 biće više reči u narednom poglavlju.
39
Razvoj aplikacija za operativni sistem Android U sledećoj tabeli prikazana je organizacija strukture Android projekta po folderima: Folder src/ bin/ jni/ gen/ assets/ res/ libs/
Opis Sadrži fajlove sa izvornim kodom. U ovom folderu se nalaze sve kreirane aktivnosti (u okviru odgovarajućeg paketa). Ovde se nalaze kompajlovani fajlovi projekta, kao što su konačni apk fajlovi (varijanta jar fajla za instalaciju na Android uređaju). Sadrži izvorni kod razvijen korišćenjem alata Android NDK (Native Development Kit). Ukoliko se ne koristi NDK, ovaj folder ne postoji. Sadrži generisane fajlove, čiji sadržaj ne treba ručno menjati. Ovde se nalaze dodatni materijali koji se koriste u projektu. Na primer, to mogu da budu podaci koje koristi aplikacija. Na početku 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 korisničkog 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 sadrži opšta podešavanja 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 sadrži neophodne informacije o aplikaciji i o Android sistemu. Ove informacije sistem mora da poseduje pre početka izvršavanja aplikacije. Neke od funkcija manifest fajla su:
Sadrži 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 sadržaja. Dakle, manifest fajl sadrži nazive klasa u kojima su opisane komponente aplikacije. Na primer, aplikacija se neće startovati ukoliko u manifest fajlu nije navedena njena početna aktivnost, čak ni u slučaju da fajl sa Java izvornim kodom te aktivnosti postoji. Određuje koji procesi će biti domaćini komponentama aplikacije. Definiše koje privilegije (permissions) aplikacija mora da poseduje da bi mogla nesmetano da funkcioniše. Takođe definiše koje privilegije moraju druge aplikacije da poseduju da bi mogle da koriste komponente aplikacije. Definiše minimalnu verziju Android API-a koji zahteva aplikacija. Definiše listu biblioteka koje aplikacija koristi
Izuzetno je bitno pravilno konfigurisati manifest fajl, zato što u protivnom aplikacija neće dobro funkcionisati. U primeru 2.1 prikazan je izgled jednog manifest fajla.
40
Razvoj aplikacija za operativni sistem Android
. . . . . . . . .
41
Razvoj aplikacija za operativni sistem Android
Primer 2.1 – Struktura Android Manifest fajla U primeru 2.1 prikazani su osnovni elementi datoteke AndroidManifest.xml, a to su:
– opisuje akciju dodeljenu elementu. Obavezan
deo polja. Ukoliko se ne definiše, Intent objekti ne prolaze kroz filter. – obavezni deklarišući element za svaku aktivnost aplikacije.Podržava podelemente kojima se specificiraju pojedine namere aktivnosti. Pokretanje aktivnosti koja nije definisana u AndroidManifest.xml datoteci rezultuje pojavom greške pri izvođenju (eng. runtime error). – zamenska aktivnost. Ciljanu aktivnost predstavlja kao nezavisni entitet sa sopstvenim skupom filtera namera koji umesto definisanja namera za direktno pokretanje ciljane aktivnosti određuju namere koji je pokreću preko zamenske aktivnosti. – koreni element sa opisom dubine stabla koga čine komponente paketa. Takođe može da sadrži globalne i/ili unapred zadate atribute aplikacije, kao što su tema, ikona, dozvole itd. Manifest fajl može da sadrži samo jedan element ove vrste. – vrsta kategorije Intent filtera. Sadržan u bloku . – određuje vrstu podatka Intent filtera. To mogu biti opcioni, ali međusobno zavisni atributi MIME ili URI. Sadržan u bloku . – određuje garantovane dozvole podskupova podataka pružaoca sadržaja. Sadržan u bloku . – deklariše koje su instrumentacione komponente raspoložive za testiranje funkcionalnosti paketa. Sadržan u bloku . – određuje vrstu namere na koju reaguju aktivnost, usluga iliBroadcast Receiver. Sadržan u blokovima , , i . – definiše komponente, bezbednosne postavke i klase za testiranje koje čine aplikaciju. Ovo je osnovni element AndroidManifest.xml fajla. – par ime-vrednost dodatnih metapodataka koji mogu biti isporučeni roditeljskoj komponenti. Sadržan u blokovima , , i . – deklariše bezbednosne dozvole nad komponentama kojima pristupaju druge aplikacije. – određuje grupu povezanih dozvola. – određuje stablo dozvola. – definiše pružaoca sadržaja. Sadržan u . – definiše Broadcast Reciever koji omogućava prihvatanje namera i u slučaju kada aplikacija i njene komponente nisu pokrenute.
42
Razvoj aplikacija za operativni sistem Android
– definiše usluge. Sadržan u bloku, a može da
sadrži i . – definiše biblioteku sa kojom aplikacija mora biti povezana.Sadržan u bloku. – deo bezbednosnog modela koji sadrži bezbednosne dozvole dodeljene od strane korisnika, a odnose se na funkcije aplikacije. Dozvole se definišu prilikom instaliranja aplikacije. – definiše nivo Android API-ja na kojima se može izvršavati aplikacija.
Dozvole se definišu zbog hardverski ograničenog pristupa memoriji jednog procesa od strane drugog, te zato što je svakoj aplikaciji dodeljen specifični ID korisnika. Neke od najčešće korišćenih dozvola su:
INTERNET– pristup Internetu. READ_CONTACTS–dozvola za čitanje podataka kontakata. WRITE_CONTACTS– dozvola za pisanje podataka kontakata. RECEIVE_SMS– nadzor pristigle SMS poruke. ACCESS_COARSE_LOCATION– grubo bežično lociranje ili lociranje preko bazne
stanice.
ACCESS_FINE_LOCATION– finije lociranje korišćenjem npr GPS-a.
FajlAndroidManifest.xmlmože ručno da se uređuje, pisanjem XML koda ili može da se koristi ugrađeni uređivač koji dolazi kao deo ADT-a.
3.
Aktivnosti i klasa Activity
Aktivnost (Activity) predstavlja komponentu aplikacije koja se uglavnom može poistovetiti s jednim konkretnim prozorom aplikacije u kojem je korisnik u mogućnosti da izvrši određenu radnju. Na primer, aktivnost služi da bi korisniku mobilnog telefona omogućila pozivanje određenog broja, slikanje fotografije korišćenjem ugrađene kamere, slanje e-mail poruke, pregled mape i dr. Aplikacija može da sadrži jednu ili više definisanih aktivnosti, pri čemu je jedna od aktivnosti uvek definisana kao primarna aktivnost. Prelaz između aktivnosti odvija se tako što aktuelna aktivnost poziva novu. Iako više aktivnosti čini jedan kompaktan korisnički interfejs, treba imati na umu da su one međusobno nezavisne. Svaka aktivnost implementira se kao zasebna klasa koja nasleđuje klasu Activity, pa je sama odgovorna za čuvanje svog stanja u životnom ciklusu aplikacije. Klasa aktivnosti je glavni deo svake Android aplikacije. Programer veći 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 označene u manifest fajlu da se pokrenu
43
Razvoj aplikacija za operativni sistem Android pri određenim okolnostima. Ovim sekundarnim ulaznim tačkama se upravlja pomoću Android manifest fajla određenim filterima. Aplikacije mogu biti prekinute zbog raznih događaja višeg prioriteta, kao što je telefonski poziv. U jednom trenutku može postojati samo jedna aktivna aplikacija. Android aplikacije su odgovorne za upravljanje njihovim stanjem, kao i njihovom memorijom, resursima i podacima. Android operativni sistem može isključiti aktivnost koja je na pauzi, stopirana ili uništena kada je memorija slaba. Ovo znači da svaka aktivnost koja nije u prvom planu mora biti isključena. Drugim rečima, Android aplikacija mora održavati stanje i biti spremna da bude prekinuta ili čak isključena u svakom trenutku.
3.1.Životni ciklus aktivnosti Životnim ciklusom aktivnosti jedne Android aplikacije upravlja se implementacijom odgovarajućih 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 tekuća aktivnost i dalje pokrenuta i vidljiva. Na primer, druga aktivnost je u prvom planu, dok je tekuća aktivnost vidljiva, ali ne zauzima ceo ekran. Aktivnost čije je stanje paused je potpuno „živa“ (objekat klase Activity se nalazi u memoriji, zadržava sva stanja i ostaje u window manager-u), međutim ova aktivnost može da bude „ubijena“ u slučaju 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 više ne nalazi u okviru window manager-a. Ovu aktivnost više ne vidi korisnik i u slučaju potrebe za memorijom sistem može da je „ubije“.
Životni ciklus jedne aktivnosti prikazan je na slici 4.1. Dakle, kao što je napomenuto na početku ovog poglavlja, fazama životnog ciklusa aktivnosti upravljaju metode onCreate(), onRestart(), onStart(),onResume(), onPause(), onStop() i onDestroy(). Životni ciklus aktivnosti započinje metodom onCreate(), a završava se zajedno sa metodom onDestroy(). U okviru metode onCreate(), programer bi trebalo da definiše izgled i globalno stanje aktivnosti, kao što je raspored elemenata korisničkog interfejsa. Implementacijom metode onDestroy() trebalo bi osloboditi korišćene resurse. Na primer, ukoliko vaša 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) između poziva metoda onStart() i onStop(). Dok je aktivnost vidljiva, korisnik je vidi na ekranu i može da vrši interakciju sa njom (npr. da unosi podatke). Metoda onStop() se poziva kada se startuje nova aktivnost, a tekuća aktivnost više nije vidljiva. Aktivnost je fokusirana (u prvom planu) između poziva metoda onResume() i onPause(). Tada se ta aktivnost nalazi ispred svih ostalih aktivnosti. Aktivnost može često da prelazi iz prvog plana u pozadinu i obrnuto. Na primer, metoda onPause() se poziva kada uređaj pređe 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 prosleđuje se objekat tipa Bundle koji sadrži 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 može da bude onResume() u slučaju da aktivnost prelazi u prvi plan, ili onStop() u slučaju da postaje sakrivena. Poziva se neposredno pre nego što aktivnost započne interakciju sa korisnikom. Poziva se neposredno pre nego što sistem nastavi izvršavanje druge aktivnosti. Ova metoda se obično koristi da sačuva podatke, zaustavi animacije i prekine sa izvršavanjem procesa koji koriste procesorsko vreme. Ova metoda se mora izvršiti što je brže moguće, zato što sledeća aktivnost neće biti nastavljena dok se ova metoda završi. Metoda koja se poziva posle ove može da bude onResume() u slučaju da aktivnost prelazi u prvi plan, ili onStop() u slučaju da postaje sakrivena. Poziva se kada korisnik više ne vidi aktivnost. Ovo se može dogoditi kada je u toku uništavanje aktivnosti ili zbog nastavljanja izvršavanja neke druge aktivnosti. Metoda koja se poziva posle ove može da bude onRestart() ukoliko je potrebna ponovna interakcija aktivnosti i korisnika ili onDestroy() u slučaju da aktivnost više nije potrebna. Poziva se neposredno pre uništavanja aktivnosti. Ovo je poslednji poziv koji će aktivnost da primi. Metoda onDestroy() može biti pozvana kada se završava sa izvršavanjem aktivnosti (neko je pozvao metodu finish()) ili zato što sistem privremeno uništava instancu aktivnosti da bi oslobodio prostor. Pomoću metode isFinishing() može se napraviti razlika između ova dva scenarija.
Može da se „ubije“ posle?
Sledeća 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 „Može da se „ubije“ posle?“ označava da li sistem sme da „ubije“ proces koji omogućava pokretanje aktivnosti bilo kada nakon završetka izvršavanja 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 više nije vidljiva (sada je u stanju "stopped"). } @Override protected void onDestroy() { super.onDestroy(); // Aktivnost se uništava. } }
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 nasleđuje klasu Activity (ili njenu izvedenu klasu). U novokreiranoj klasi, neophodno je implementirati metode opisane u prethodnom poglavlju (vidiPrimer 3.2). Najvažnije 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 najčešće nalazi sa leve strane u Eclipse razvojnom okruženju najpre treba izabrati folder src, a zatim kliknuti desnim tasterom miša na paket koji je kreiran zajedno sa Android projektom. U našem slučaju, 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 odgovarajuća podešavanja, a to su:
Source folder – folder u kome se čuvaju izvorni fajlovi projekta. Obično 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 slučaju, to je net.myelab.android.mojaaplikacija. Name – naziv klase. Ovde unosimo željeni naziv aktivnosti koju kreiramo. U našem slučaju, 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 – nadređena klasa. Za aktivnost, to bi trebalo da bude android.app.Activity.
Slika 3.29 – Podešavanja nove klase Nakon unetih vrednosti, potrebno je kliknuti na taster Finish. Sada je potrebno implementirati neke od ranije pomenutih metode. Aktivnost koju smo kreirali predstavljaće 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 početku se poziva metoda onCreate() nadređene klase (klasa Activity), kojoj se prosleđuje parametar tipa Bundle. Zatim se kreira novi pogled ( View). Pogled u stvari predstavlja osnovnu jedinicu korisničkog interfejsa Android aplikacije. Android aktivnost može da koristi više različitih pogleda, a o njima će biti reči u narednom poglavlju. Tekstualni sadržaj se ubacuje korišćenjem metode setText(). Konačan 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:
Primer 3.5 – Manifest fajl projekta
Tag omogućava android aplikaciji da „zna“ da navedena klasa predstavlja aktivnost, s obzirom da je moguće koristiti i pomoćne klase. U okviru taga definisano je koja aktivnost predstavlja početnu aktivnost u aplikaciji. Sada je moguće startovati aplikaciju. Izborom opcije Run -> Run As -> Android Application startuje se aplikacija na odgovarajućem Android virtuelnom uređaju. 50
Razvoj aplikacija za operativni sistem Android Startovanje virtuelnog uređaja predstavlja dug proces koji može potrajati i više od 5 minuta. Proces kreiranja Android virtuelnog uređaja opisan je u poglavlju 1.4. Ukoliko je napravljeno više Android virtuelnih uređaja, željeni uređaj je moguće izabrati pomoću 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 uređaja Ukoliko je fizički Android uređaj povezan sa računarom korišćenjem USB porta, izborom opcije Run neće doći do startovanja virtuelnog uređaja, već će se aplikacija instalirati na fizički uređaj i potom automatski startovati na njemu. Uspešno startovana aplikacija na virtuelnom uređaju prikazana je na sledećoj slici:
51
Razvoj aplikacija za operativni sistem Android
Slika 3.31 – Aplikacija na virtuelnom uređaju
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 ponaša na neki zahtev. Ovde spadaju svi algoritmi koji pokreću 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 definiše developer unutar fajlova Android projekta i tačno su određeni za neku aplikaciju. Resursi sistema su standardni resursi koje definiše Android platforma i dostupni su svim aplikacijama kroz Android SDK. Resursi aplikacije se prave i čuvaju unutar Android projekta u /res direktorijumu. Koristeći 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. Takođe na njih se mogu odnositi resursi drugih resursa aplikacija. Svaki put kad se sačuva fajl sa resursima u Eclipsu, R.java klasa fajl se ponovo sastavlja kako bi se ubacile nove izmene. Ako nije korišćen pravi direktorijum ili pravila o nazivu fajla, pojaviće se greška u kompajleru u prozoru Eclipse Problems. Resursima aplikacije se može pristupiti programerski koristeći generisu klasu koja se zove R.java. Kako bi se dodala referenca na resurs, mora se doći do objekta resursa aplikacije koristeći klasu getResources() i tako napraviti odgovarajući 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 više aplikacija zbog običnog izgleda i osećaja.Na primer, klasa resursa Android 53
Razvoj aplikacija za operativni sistem Android
sistema (android.R.string) sadrži stringove za reči kao što su OK, Cancel, Yes, No, Cut, Copy i Paste. Sistemski resursi se čuvaju u android paketu. Postoje klase za svaki od većih tipova resursa. Na primer, klasa android.R.string sadrži string sistemskog resursa. Kako bi se dobio string sistemskog resursa za OK prvo se mora koristiti statičkia komanda klase Resursa getSystem() kako bi se doveo globalni sistemski objekat Resource. Onda se poziva komanda getString() sa odgovarajućim string imenom resursa.
4.1.Upravljanje i pristup resursima U ovom poglavlju biće prikazano kako Android aplikacije skladište i pristupaju važnim resursima kao što su stringovi, grafika i ostali podaci. Takođe će biti prikazano kako da organizujete Android resurse u okviru projekta kako bi se na najlakši način mogla izvršiti lokalizacija i prilagođavanje aplikacija za različite konfiguracione uređaje. Kako bi se omogućila kompatabilnost sa različitim uređajima potrebno je resurse organizovati u folderima(direktorijumima) i podfolderima kako bi se svaki deo android aplikacije mogao održavati nezavisno od ostalih delova aplikacije. Podrazumevani stil prikazivanja aplikacije čuva se na putanji res/layout/ međutim možete podesiti u konfiguracionom fajlu da kada se aplikacija pokrene na neki uređaj koji ima drugačiju rezoluciju ekrana, npr koristi Landscape orijentaciju, da tada poziva funkcije za prikaz is foldera res/layout-land/ gde će na ovaj način sama aplikacija zavisno od rezolucije uređaja prikazati adekvatan sadržaj.
Slika 3.1. Različit prikaz za raličitu rezoluciju uređaja Korišćenje resursa koristeći Eclipse razvojno okruženje sa dodatkom Android Asset Packaging Tool je veoma jednostavno, nije potrebno kompajlirati resurse, to će Eclipse sam uraditi, međutim ako koristite neko drugo razvojno okuženje potrebno je sve resurse komplajlirati iz komandne linije ili pak možete napisati skriptu koja će to uraditi, potom tu skriptu možete koristiti za sve vaše aplikacije. 54
Razvoj aplikacija za operativni sistem Android
Definisanje podataka aplikacije kao resursa je dobra vežba programiranja. Grupisanje resursa aplikacije i njihovo spajanje u paket aplikacije ima sledeće koristi: -
Kod je jasniji i lakši za čitanje, što dovodi do manje grešaka. Resursi su organizovani po tipovima i sigurno su jedinstveni Resursi su dobro smešteni za prilagođavanje telefonima
55
Razvoj aplikacija za operativni sistem Android
4.2.Tipovi resursa Android aplikacije koriste veliki broj različitih tipova resursa kao što je tekst, grafika, šeme u boji za dizajn korisničkog interfejsa itd. Ovi resursi se nalaze u res/ direktorijumu vaše android aplikacije. Fajlovi resursa sačuvani u /res direktorijumu moraju da poštuju sledeća pravila: -
Imena fajlova resursa moraju biti napisani malim slovima Imena fajlova resursa mogu sadržati samo slova, brojeve, donju crtu, i tačke Imena fajlova resursa (i XML atributi imena) moraju biti jedinstveni.
U narednoj tabeli prikazano je kako se čuvaju resursi koje podržava Andoird SDK. Tip resursa
Naziv
XML tag
Strings Niz stringova
Potreban direktorijum /res/values/ /res/values/
strings.xml strings.xml
Boolenas Colors Dimensions Integers Mešovit 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
, ,
/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/
main.xml styles.xml themes.xml Primer. sekvenca1.xml sekvenca2.xml
,
Tabela 3.1. Kako organizovati resurse u Android projektu 56
Razvoj aplikacija za operativni sistem Android
4.3.Rad sa resursima U ovom delu biće prikazano kako možete upravljati resursima u vašoj Andoird aplikaciji, koji formati su podržani i u kom formatu se čuvaju. Neke vrste resursa kao što su tekst, boja itd. su veoma dobro podržane od strane Eclipse editora i Andoird Plug-in Resource Editor, dok drugi kao što su animirane sekvence, nisu i sa njima je lakše raditi direktno editovanjem u XML datotekama. 4.3.1.Rad sa stringovima
String resursi su najjednostavniji tip resursa sa kojima može da radi Developer. Stringove možete promeniti ili dodati editovanjem xml datoteke strings.xml. String se cuva u okviru taga . U prilogu sledi primer kako izgleda strings.xml Moja prva aplikacija Test 1,2,3 Test 4,5,6 Bold,Italic,Line U narednoj liniji koda prikazano je kako možete određenom 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 podržava rad sa nizom stringova. Ovo je veoma pogodno kada želite da u nekoj padajućoj listi prikažete više opcija. Niz stringova se u XML fajlu definiše na putanji rez/values/ i kompajlira se u trenutku izvršavanja aplikacije. Niz stringova u XML-u se čuva u okviru tagova i tagom za predstavljanje elemenata niza . U nastavku možete videti kako se u xml fajlu na putanji rez/values/arrays.xml čuva niz stringova: Elektronsko poslovanje Internet tehnologije Mobilno poslovanje 57
Razvoj aplikacija za operativni sistem Android
Marijana Zrakic Despotovic Bozidar Radenkovic Pristup resursima je veoma jednostavno, u konkretnom primeru pristup resursu predmeti radimo na sledeći način: 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: true false Kada se želi resursu pristupiti iz Android aplikacije to se radi na sledeći način: boolean podrzanIzborJezika getResources().getBoolean(R.bool.podrzanIzborJezika);
=
Na sličan način 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. 25 3 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 skladišti vrednosti RGB boje, što automatski obezbeđuje da se te boje primene i na druge elemente ekrana. Vrednosti koje se čuvaju, mogu se iskoristiti za podešavanje boje teksta ili pozadine ekrana apliakcije. Vrednosti za boje čuvaju se u XML fajlu na putanji rez/values/colors.xml. Android podržavaja rad sa sledećim 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 skladištenja boja: #006400 #FFE4C4 Sledeća linija koda vraća vrednost određene 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 sačuvati u /res/drawable direktorijumu projekta. Ovi tipovi resursa se onda sastavljaju u paket aplikacije i dostupne su aplikaciji. Najčešći resursi koji se crtaju su bitmap slike, kao što su PNG i JPG fajlovi. Ovi fajlovi se često koriste kao ikonice aplikacije i slike dugmića ali se mogu koristiti i za veliki broj komponenti korisničkog interfejsa. Resursi slika su u klasi BitmapDrawable. Kako bi se pristupilo grafičkom resursu koji se zove /res/drawable/logo.png, treba se koristiti komanda getDrawable(), po sledećem redosledu: BitmapDrawable logoBitmap (BitmapDrawable)getResources().getDrawable(R.drawable.logo);
=
Većinu vremena, međutim, grafika ne mora da se otvara direktno. Umesto toga, može se koristiti identifikator resursa kao atribut za kontrolu kao što je kontrola ImageView. 59
Razvoj aplikacija za operativni sistem Android
Sledeći 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); Takođe se može kreirati specijalni XML fajl kako bi se opisale druge Drawable podklase, kao što je ShapeDrawable. Može 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 podržava rad sa menijima, meni se kao i ostali resursi skladište u direktorijumu rez/menu/. Svaki resurs menija, koji predstavlja skup pojedinačnih stavki menija, se skladipti kao posebno formatirana XML datoteka i kompajliraju se u vreme izvršavanja aplikacije. U nastavku sledi prikaz jednostavnog menija koji je skladišten u rez/menu/speed.xml koji predstavlja meni jedne proste aplikacije : 60
Razvoj aplikacija za operativni sistem Android
61
Razvoj aplikacija za operativni sistem Android
Meni se može kreirati i korišćenjem Eclipse dodatka koji može pristupati konfiguracionim atributima za svaku stavku menija. U predhodnom primeru smo direktno u xml fali postavili naziv stavke menija, inače ti stringovi se takođe mogu izdvojiti iz tog fajla i kasnije lokalizovati na više jezika. Primer menija gde su definisani samo nazivi resursa, gde se vrednost resursa uzima kasnije iz konkretnog xml fajla. Da bi se koristio predhodno napisan meni potrebno je u aplkaciji pozvati resurs koji je skladišten na putanji rez/menu/speed.xml tako što se overajduje metoda nadređene 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 dobiće se meni koji je gore definisan. Postoji veliki broj atributa koji se može dodeliti nekoj stavki menija, spisak svih stavki možete pogledati u zvaničnoj 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 sadržati fajlove kao resurse. Ovi fajlovi mogu biti u bilo kom formatu. Međutim, neki formati su pogodniji nego drugi. XML fajl format je dobro podržan na Android platformi. Proizvoljni XML fajlovi mogu biti uključeni kao resursi. Ovi XML fajlovi se čuvaju u /res/xml direktorijumu. XML fajlovi su preferirani format za bilo koje strukturisane podatke koje aplikacija traži. Kako se formatira XML fajl zavisi od developera. Različiti XML alati su dostupni za Android platformu. Primer xml fajla: XML resursu iz aplikacije može se pristupiti na sledeći način: XmlResourceParser mojiPredmeti getResources().getXml(R.xml.mojiPredmeti);
=
Aplikacija može sadržati .raw fajlove kao resurse. Raw fajlovi koje aplikacija može koristiti sadrži audio, video i druge fajlove. Svi raw fajlovi resursa bi trebali biti sačuvani u /res/raw direktorijum. Nema pravila ili ograničenja 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 podržani za traženi mobilni telefon. Isto važi i za bilo koji drugi format koji treba da se ubaci u resurse aplikacije.Ako format fajla koji treba da se koristi nije podržan u početnom Android sistemu, aplikacija će možda zatražiti da sama odradi proveru fajlova. Da bi se pristupilo raw fajlu programerski, jednostavno treba koristiti komandu openRawResource(). Na primer, sledeći 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)
Većina korisničkih interfejsa Android aplikacija se definišu koristeći 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 definišu ceo ekran i povezani su sa određenom aktivnošću, ali i ne moraju da budu. Resursi rasporeda takođe mogu definisati deo ekrana i mogu biti deo nekog drugog rasporeda. Ovo je običan raspored, koji se zove main.xml, koji se pravi sa svakom Android aplikacijom. Ovaj layout file opisuje korisnički interfejs jedine aktivnosti u aplikaciji. Sadrži kontrolu LinearLayout koja se koristi kao skup za sve druge kontrole korisničkog interfejsa. U ovom slučaju to je kontrola TextView. Main.xml layout fajl sadrži i druge resurse: string resurs @string/hello, koji je definisan u strings.xml resurs fajlu koji sadrži tekst Moja prva Android aplikacija! Nakon pokretanja aplikacije, izgled ekrana je sledeći:
64
Razvoj aplikacija za operativni sistem Android
Slika 3.2. Prikaz pokrenute Android aplikacije. Postoje dva načina da se formiraju resursi rasporeda. Najjednostavniji način je da se koristi Layout Resource Editor u Eclipsu da bi se dizajnirali layout fajlovi. Takođe se mogu direktno menjati XML layout fajlovi. 4.3.9.Rad sa stilovima
Korisnički interfejs Andoird aplikacije, dizajneri mogu uređivati korišćenjem stilova. Kontrola rasporeda elemenata izvedena je iz View klase, koja ima veliki broj korisnih osobina. Stilovi se označavaju tagom koji su smešteni u direktorijum rez/values/ . Stilovi se takođe definišu u XML fajlu a potom se kompajliraju u vreme izvršavanja aplikacije. Stilovi se ne mogu pregledavati korišćenjem Eclipse Resource designer-a ali se ispravno prikazuju na emulatoru kao i na samom uređaju. U nastavku sledi jednostavan primer kako se koriste stilovi koji su smešteni 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 biće predstavljena crvenom bojom i veličinom slova 14p koja će biti boldovana, dok opciona plja biće predstavljena belom bojom, iskošena i veličina 12p. #e4101a 14pt bold 65
Razvoj aplikacija za operativni sistem Android
#FFFFFF 12pt italic
4.3.10.
Rad sa temama
Tema predstavlja skup stilova koji se primenjuju na sve elementu neke aktivnosti. Teme se definišu na isti način kao i stilovi, koristi se tag koji se čuva u rez/values/ direktorijumu. Jedina razlika što temu od stilova izdvaja jeste to što tema mora de se definiše kao atribut aktivnosti u AndoirdManifest.xml fajlu.
66
Razvoj aplikacija za operativni sistem Android
4.4.Referenciranje sistemskih resursa Sistemski resursi se koriste na isti način kao i resursi same aplikacije. Android paket sadrži sve vrste resursa, koje možete pretraživati u android.R podklasu. U ovoj podklasi mogu se naći sledeći 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 greškama, Kreiranje rasporeda elemenata kao i crtanje jednostavnih elemenata. Referncijaranje sistemskih resursa je na isti načina 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 način kako se pristupa resursima aplikacije. android.R.string.ok
67
Razvoj aplikacija za operativni sistem Android
5. Elementi korisničkog interfejsa Postoje dva načina dizajniranja korisničkog 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 grafičkog korisničkog interfejsa uglavnom koristi XML.Primer 3.4 predstavlja primer proceduralnog dizajna. Kreiranjem interfejsa aktivnosti dobijaju svoju funkcionalnost, tj. vidljivost na ekranu uređaja i na taj se način omogućava interakciju sa korisnikom. Osnovne jedinice korisničkog interfejsa su objekti pogled (View) i grupe pogleda (ViewGroup):
pogled – objekat čija prenos struktura u sebi nosi zapis izgleda i sadržaja određenog pravougaonog područja na ekranu, upravlja iscrtavanjem elemenata, pomeranjem sadržaja na ekranu (scrolling) i ostalim faktorima koji utiču na izgled definisanog dela ekrana. U hijerarhijskom stablu objekti pogled su listovi stabla. Android raspolaže sa već gotovim skupovima objekata ove vrste kao što su dugmad, kvadratići za odabir (eng. checkbok) i slično. Ovi objekti nasleđuju klasu View; grupe pogleda – posebna vrsta objekta pogled koja sadrži i upravlja grupom zavisnih objekata pogleda i grupe pogleda čime je omogućena kompleksnost prikaza korisničkog interfejsa. Objekti ove vrste su inastance klase ViewGroup.
Slika 5.32 – Hijerarhijski prikaz elemenata korisničkog interfejsa
68
Razvoj aplikacija za operativni sistem Android Iscrtavanje elemenata stabla započinje od korena stabla tako što aktivnost prvo poziva svoju setContentView() metodu i Android operativnom sistemu predaje referencu na koreni objekat. Svaki podčvor iscrtava se sam pozivanjem draw() metode i to pod uslovom da čvor sam postavlja zahtev za lokacijom i veličinom, ali roditeljski čvor (grupa pogleda) donosi konačnu odluku o veličini prostora za iscrtavanje podčvora i njegovoj lokaciji na ekranu. Svaka grupa pogleda je odgovorna za renderovanje prikaza svojih podčvorova.
5.1.XML layout Naša prva Android aplikacija (Primer 3.4) koristila je najjednostavniji pogled TextView koji služi za prikaz teksta i bila je dizajnirana proceduralno, što znači da nije korišćen XML prilikom dizajniranja korisničkog interfejsa. S obzirom da je poželjno koristiti deklarativan dizajn prilikom kreiranja složenijeg korisničkog interfejsa, u daljem tekstu biće opisan postupak kreiranja Hello world aplikacijekorišćenjem XML tehnologije za dizajn korisničkog interfejsa. Jedna od najvećih prednosti deklarativnog dizajna jeste potpuna odvojenost dizajna korisničkog interfejsa od aplikacione logike. To znači da male promene u kodu neće uticati na dizajn aplikacije i obrnuto. Deklarisanje TextView pogleda pomoću XML-a obavlja se na sledeći način: Primer 5.6 – XML prikaz TextView pogleda
Ovo predstavlja XML layout fajl, u kome je opisan dizajn korisničkog interfejsa. Struktura ovog fajla je jednostavna. U pitanju je stablo sačinjeno 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 moguće je koristiti bilo koju klasu koja je izvedena (nasleđena) iz klase View, što podrazumeva i korisničke izvedene klase. U primeru 5.1 korišćen je samo jedan element TextView sa svojih pet atributa. Značenje ovih atributa prikazano je u sledećoj tabeli: Atribut xmlns:android
android:id
Značenje Ovo predstavlja naziv XML imenskog prostora. Pošto je vrednost ovog atributa android, to znači da će se koristiti atributi deklarisani u okviru Android imenskog prostora. Čvorovi najvišeg hijerarhijskog položaja u Android layout fajlu moraju da poseduju ovaj atribut. Ovaj atribut dodeljuje jedinstveni identifikator elementu TextView. Dodeljeni ID je moguće 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 određuje koliko će ovaj pogled da zauzme širine ekrana. U ovom slučaju, ovo je jedini pogled koji se koristi, te je moguće zauzeti čitav ekran, što označava vrednost atributa "fill_parent". Ovaj atribut se ponaša slično 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 prikaže. 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 preporučuje se korišćenje resursa, a ne direktni unos vrednosti stringova. Ovo je dobra praksa zato što omogućava lokalizaciju aplikacije, odnosno mogućnost višejezičnosti, bez imena koda layout fajla.
Tabela 5.3 – Značenje 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 načiniti odgovarajuće izmene. Najpre je potrebno otvoriti fajl /res/layout/main.xml, u njega ubaciti kod prikazan u primeru 5.1 i sačuvati izmene. Zatim treba otvoriti fajl /res/values/strings.xml. Ovde se nalaze vrednosti stringova koji se koriste u aplikaciji. Potrebno je ubaciti sledeći kod: Hello world! Hello world application 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 uređaju. Sada je potrebno promeniti sadržaj 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,
odgovarajućim
XML
layout-ima
se
pristupa
pozivanjem
atributa
R.layout.naziv_layouta, što predstavlja reprezentaciju kompajlovanog objekta
odgovarajućeg
XML layout-a. Ovi objekti se /gen/paket/R.java, koji ne treba ručno modifikovati.
čuvaju
u
okviru
fajla
Izmenjenu aplikaciju je sada moguće pokrenuti na standardni način. U daljem tekstu biće prikazano više grupa pogleda (layouta) i pogleda (views) koji se mogu koristiti prilikom dizajniranja korisničkog interfejsa. Uz svaki pogled priložen je izvorni kod odgovarajućeg primera.
5.2.Layouts 5.2.1.LinearLayout LinearLayout predstavlja grupu pogleda koja prikazuje više pogleda, horizontalno
ili vertikalno. Ukoliko se koristi ugnježdavanje više LinearLayout-a, bolje je umesto njega koristiti RelativeLayout.
Slika 5.33 – LinearLayout
Sadržaj fajla res/layout/main.xml: Primer 5.9 – Sadržaj fajla res/layout/main.xml
U opisu ovog layout-a postoji koreni element LinearLayout. On definiše vertikalnu orijentaciju i ima dva izvedena čvora tipa LinearLayout. Prvi čvor je horizontalne orijentacije, a drugi vertikalne. Svaki od ovih čvorova poseduje svoje izvedene TextViewčvorove koji prikazuju neki sadržaj. Sada je potrebno kreirati početnu 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 može pokrenuti.
73
Razvoj aplikacija za operativni sistem Android
5.2.2.RelativeLayout RelativeLayoutpredstavlja grupu pogleda koja prikazuje više View elemanata
korišćenjem relativnih pozicija. Pozicije su relativne u odnosu na element istog nivoa hijerarhije ili u odnosu na celo područje RelativeLayout-a.
Slika 5.34 – RelativeLayout
Sadržaj fajla res/layout/main.xml: Primer 5.11 – Sadržaj fajla res/layout/main.xml
Dakle, za opisivanje pozicije elemenata koriste se atributi layout_alignParentRighti layout_toLeftOf.
layout_below,
Sada je potrebno kreirati početnu aktivnost projekta i podesiti manifest fajl. U sledećem 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
Sadržaj fajla res/layout/main.xml:
76
Razvoj aplikacija za operativni sistem Android Primer 5.13 – Sadržaj fajla res/layout/main.xml
Primećujemo da način formiranja tabele u ovom layout-u podseća na formiranje tabele u HTML-u. Element TableLayout analogan je tagu u HTML-u, a 77
Razvoj aplikacija za operativni sistem Android element TableRow analogan je elementu . Kao ćelije tabele mogu se koristiti bilo koji View elementi. U ovom slučaju se koristi TextView. Na kraju, ostaje kod početne 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
mreži sa mogućnošću skrolovanja. Elementi se ubacuju pomoću ListAdapter-a. U ovom primeru biće prikazano kreiranje mreže sa malim slikama (thumbnails). Kada se izabere neka od njih, toast poruka će prikazati poziciju slike.
Slika 5.36 – GridView
Sadržaj fajla res/layout/main.xml: Primer 5.15 – Sadržaj fajla res/layout/main.xml
Zatim je neophodno kreirati podrazumevanu aktivnost. Njena onCreate() metoda prikazana je u sledećem 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 podešavanja podrazumevanog (main) layout-a za prikaz sadržaja, aplikacija odgovarajući GridView pogled preuzima iz layout-a uz pomoć metode findViewById(int). Metoda setAdapter() postavlja odgovarajući izvor podataka koje će prikazati GridView. U ovom primeru se koristi ImageAdapter. Klasa ImageAdapter biće definisana u narednom koraku. Da bi bilo moguće reagovati na događaj kada se izabere stavka mreže, poziva se metoda koja osluškuje te događaje. Njen naziv je setOnItemClickListener(), a prosleđuje joj se događaj OnItemClickListener. U ovom primeru, prilikom samog poziva metode kreira se instanca tog događaja. Konačno, definiše se prikaz toast poruke sa indeksom izabranog elementa. Sada je potrebno definisati klasu ImageAdapter koja definiše način popunjavanja mreže: 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() vraća ukupan broj elemenata ovog adaptera. Metoda getItem() vraća
element koji se nalazi na prosleđenoj poziciji. Metoda getItemId() vraća id reda elementa. U ovom primeru se ove metode ne koriste (vraćaju respektivno null i 0). Metoda getView() kreira novi pogled za svaku sliku iz ImageAdapter-a. Njoj se prosleđuje pogled za koji se proverava da li je null. Ukoliko jeste, ImageView je instanciran i konfigurisan. Ukoliko ova vrednost nije null, to znači da je ImageView ranije instanciran i u tom slučaju se koristi taj objekat. Metode setLayoutParams(), setScaleType() i setPadding() respektivno podešavaju dimenzije pogleda, tip skaliranja i razmak između 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 Korišćenje kartica (tabova) prilikom izrade korisničkog interfejsa veoma je popularno. Android platforma omogućava dva različita pristupa prilikom izrade ovakvog korisničkog 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 slučaju, neophodno je korišćenje klasa TabHostiTabWidget. TabHost predstavlja koreni čvor layout-a. U okviru njega nalaze se elementi TabWidget za prikaz dostupnih kartica i FrameLayout za prikaz sadržaja izabrane kartice.
Slika 5.37 – TabLayout
U ovom primeru, svakoj kartici biće dodeljena različita aktivnost. Najpre je neophodno kreirati tri različite aktivnosti. To su ArtistsActivity, AlbumsActivity iSongsActivity. Svaka od njih će biti prikazana u posebnoj kartici. Za početak, svaka aktivnost će prikazivati određenu 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 uočiti da aktivnosti ne koriste XML layout, već pomoću 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 slučaju 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 sledeći: Primer 5.19 – Fajl ic_tab_artists.xml
U fajl koji opisuje layout (res/layout/main.xml) treba ubaciti sledeći kod:
83
Razvoj aplikacija za operativni sistem Android Primer 5.20 – Sadržaj fajla res/layout/main.xml
Ovaj layout će prikazati kartice i omogućiti navigaciju između svih ranije kreiranih aktivnosti. Element TabHost zahteva elemente TabWidget i FrameLayout unutar sebe. U zavisnosti od željenog rasporeda ovih elemenata, mogu se koristiti različiti layout-i za njihovo pozicioniranje. Na primer, za njihovo vertikalno pozicioniranje može se koristiti LinearLayout. Element FrameLayout trenutno je prazan zato što se sadržaj trenutne kartice uzima iz tekuće 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. Može se izabrati njen proizvoljan naziv, ali je važno da se u Manifest fajlu definiše da je u pitanju početna aktivnost. Ova aktivnost će se razlikovati od ostalih, ranije spominjanih aktivnosti, zato što ona nasleđuje klasu TabActivity. U nastavku je dat skraćeni kod početne 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 – Početna aktivnost aplikacije sa karticama
84
Razvoj aplikacija za operativni sistem Android Poslednja linija koda podešava koja kartica predstavlja početnu karticu u aplikaciji.
5.2.6.ListView ListViewpredstavlja
grupu pogleda koja kreira listu sastavljenu od više elemenata, sa mogućnošću skrolovanja. Elementi kojima se lista popunjava definišu se pomoću ListAdapter-a.
Slika 5.39 – ListView
Prvo je potrebno napraviti layout. Fajl sa sledećim sadržajem treba snimiti kao fajl /res/layout/list_item.xml. Navedeni layout definiše izgled svakog elementa pojedinačno u listi. Primer 5.22 – Sadržaj fajla res/layout/main.xml
Zatim treba kreirati početnu aktivnost, koja umesto klase Activity nasleđuje klasu ListActivity. Priloženom 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(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
Primetićemo da navedeni kod ne učitava layout fajl vezan za aktivnost, što se obično radi metodom setContentView(). Umesto toga, metoda setListAdapter() omogućava prikaz pogleda ListView preko čitavog ekrana tekuće aktivnosti. ArrayAdapter omogućava popunjavanje liste elementima određenog 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 prikažemo u ovoj listi. U ovom slučaju, taj niz se zove COUNTRIES i kreiran je posle metode onCreate(), u klasi aktivnosti. Metodom setTextFilterEnabled() omogućuje se filtriranje liste. Ukoliko je vrednost postavljena na true, omogućava se filtriranje liste kada korisnik aplikacije ukuca deo naziva određenog elementa. Zatim se osluškuju onItemClick() događaji. Ukoliko nastupi ovaj događaj (korisnik izabere određeni element liste), prikazuje se toast poruka. Ovime je završena aplikacija koja prikazuje listu. Ubacivanje vrednosti ključnih varijabli u kod nije dobro rešenje. Mnogo je bolje vrednost niza koji popunjava listu ubaciti u neki XML fajl u okviru resursa. Na primer, možemo kreirati fajl res/values/strings.xml, sa sledećim sadržajem: Srbija Madjarska
86
Razvoj aplikacija za operativni sistem Android Bugarska Rumunija Italija Primer 5.24 –Sadržaj 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(this, R.layout.list_item, COUNTRIES));
Umesto te linije, potrebno je ubaciti sledeći kod: String[] countries = getResources().getStringArray(R.array.countries_array); setListAdapter(new ArrayAdapter(this, R.layout.list_item, countries)); Primer 5.25 – Kod za referenciranje resursa iz eksternog XML fajla
Ovim kodom omogućava se uzimanje resursa iz definisanog XML fajla. Sadržaj i funkcionalnosti aplikacije se ovim neće promeniti.
5.3.Meniji Meniji su sastavni deo korisničkog interfejsa u većini aplikacija. Za prezentovanje korisničkih akcija i drugih opcija u aktivnostima potrebno je koristiti android.view.Menu klasu. Za sve tipove menija Android pruža standardni XML format za definisanje menija. Meniji se ne definišu u kodu aktivnosti već se meniji sa svim stavkama i podstavkama definišu u vidu XML datoteke u folderu res/menu/ a zatim uključuju u aktivnost. Korišćenjem menija kao resursa omogućeno je razdvajanje menija od koda kao i kreiranje alternativnih menija za različite Android verzije, različite veličine ekrana, itd. Da bi definisali meni potrebno je u okviru projekta kreirati XML dokument u res/menu direktorijumu. Obavezni delovi menija su: Ovaj element je koreni element sadrži jedan ili više i elementa. Kreira stavku menija. Ovaj element može sadržati ugnježden element I na taj način se formira struktura podmenija.
87
Razvoj aplikacija za operativni sistem Android Ovo je opcioni, nevidljivi kontejner za element. Omogućava kategorizaciju stavki menija u cilju deljenja zajedničkih karakteristika kao što su vidljivost ili aktivno stanje. Primer menija moj_meni.xml: element ima podršku za nekoliko atributa koji se koriste za definisanje ponašanja i načina pojavljivanja stavki menija. Stavke menija iz prethodnog primera sadrže i atribut android:showAsAction koji obezbeđuje 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 moguće dodati stavku menija koja predstavlja novi meni. Na primer: Da bi se meni koristio u aktivnosti potrebno je ubaciti meni kao resurs korišćenjem 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 pretraživaču na Android 2.3. Ukoliko se aplikacija razvija za verziju Android 2.3 ili nižu sadržaj menija opcija se pojavljuje na dnu ekrana nakon klika na dugme Menu. Ovaj meni sadrži do 6 stavki menija i ukoliko postoji više stavki Android ostale stavke smešta 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 moguće 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 niže 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 događaja
Kada korisnik selektuje stavku menija iz menija opcija sistem poziva onOptionsItemSelected() metod unutar naše aktivnosti. Ovaj metod prosleđuje selektovanu stavku menija. Identifikacija stavke je moguća pozivom getItemId(), koja vraća jedinstveni ID stavke menija koji je definisan u android:id atributu (unutar menija kao resursa). Ispitivanjem vrednosti ovog atributa moguće je izvršavati različite 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 uspešno obrađena odgovor je TRUE u suprotnom je potrebno pozvati onOptionsItemSelected() implementaciju superklase. 5.3.1.2.
Promena menija opcija tokom izvršavanja
Nakon što sistem pozove metodu onCreateOptionsMenu(), zadržava instancu napunjenog menija i više 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 događajima koji se dešavaju tokom životnog ciklusa aktivnosti koristi se metod onPrepareOptionsMenu(). Ovaj metod prosleđuje Menu objekat u trenutnom stanju pa je moguće vršiti izmene kao što su dodavanje, brisanje novih stavki ili onemogućavanje određenih stavki. U Android 2.3.x i nižim verzijama sistem poziva onPrepareOptionsMenu() svaki put kada korisnik otvori meni opcija (pritisne Menu dugme). 5.3.2.Kreiranje kontekstualnih menija Kontekstualni meni je kretajući meni koji se pojavljuje kada korisnik izvršava produženi klik na elementu. Omogućava akciju nad selektovanim sadržajem ili okvirom u kojem se kontekst pojavljuje.
90
Razvoj aplikacija za operativni sistem Android
Prikaz kretajućeg kontekstualnog menija (leva slika) i kontekstualnog action bar-a (desna sllika). Kontekstualni meni je moguće obezbediti za bilo koji pogled ali se najčešće koristi za elemente u ListView i GridView-u. Postoje dva načina za obezbeđivanje kontekstualnih akcija:
Kretajući kontekstualni meni. Meni se pojavljuje kao pokretna lista stavki menija. Korisnik može da izvrši kontekstualnu akciju nad jednim po jednim elementom.. Kontekstualni action mode. Kontekstualni action bar se pojavljuje na vrhu ekrana sa elementima koji utiču na selektovani element. Korisnici mogu da izvršavaju akcije nad više elemenata istovremeno (ukoliko to aplikacija dozvoljava). Ova opcija je omogućena samo na verzijama Android 3.x i višim.
5.3.3.Kreiranje kretajućeg kontekstualnog menija 1) Registruje se pogled (View) sa kojim će kontekstualni meni biti povezan pozivom registerForContextMenu() i prosleđivanjem odgovarajućeg 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 događaj dugog klika sistem poziva onCreateContextMenu() metodu. Tamo su definisane stavke menija obično 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 omogućava da se kontekstualni meni ubaci iz resursa menija. Parametri callback metode uključuju pogled koji je korisnik selektovao a objekat ContextMenu.ContextMenuInfo obezbeđuje dodatne informacije o selektovanom elementu. Ukoliko aktivnost ima nekoliko pogleda koje obezbeđuju različite 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 uzvršile određene 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, tačnije u android:id atributu. Ukoliko se stavka menija neuspešno obradi potrebno je stavku menija proslediti superklasi. 5.3.4.Iskačući meni Popup meni prikazuje listu stavki u vertikalnoj listi koja je povezana sa pogledom koji poziva meni. Akcije u iskačućem meniju ne bi trebalo da utiču odgovarajući sadržaj za to su zadužene kontekstualne akcije. Iskačući meniji se koriste za dodatne akcije koje se odnose na delove sadržaja unutar akrivnosti.
Iskačući meni u Gmail app povezan sa overflow dugmetom (gore desno). Iskačući meni je dostupan od verzije Android 3.x i više. 92
Razvoj aplikacija za operativni sistem Android 5.3.5.Kreiranje meni grupa Meni grupa je skup stavki menija koje imaju određene osobine. Sa grupom je moguće: Prikazivanje ili skrivanje svih stavki sa setGroupVisible() Omogućavanje ili onemogućavanje svih stavki sa setGroupEnabled() Definisati da li je sve stavke moguće čekirati pomoću setGroupCheckable() Grupu je moguće kreirati gnježđenjem elemenata unutar elementa u resursima menija ili definisanjem grupnog ID elementa korišćenjem add() metode. Primer kako je moguće unutar resura menija obuhvatiti grupu:: Stavke koje se u grupi pojavljuju na isptom nivou su braća i sestre. Moguće je promeniti osobine dve stavke iz grupe referenciranjem grupnog ID-a i korišćenjem prethodno opisanih metoda ali sistem neće nikada razdvojiti grupisane stavke. Na primer ukoliko se deklariše 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.
Korišćenje stavki menija koje se čekiraju
Ovaj meni je veoma koristan kada je u pitanju interfejs pomoću kojeg se neka opcija uključuje ili isključuje ili za grupu međusobno isključivih opcija.
93
Razvoj aplikacija za operativni sistem Android
Prikaz podmenija koji sadrži stavke koje se čekiraju. Moguće je definisati da neka stavka menija ima čekirajuću osobinu korišćenjem android:checkable atributa u elementu, ili da cela grupa ima tu osobinu korišćenjem android:checkableBehavior atributa u elementu. Na primeru je prikazano da su sve stavke iz grupe u formi radio dugmeta koje se može čekirati: android:checkableBehavior atribut prihvata samo sledeće osobine: single – Samo jedna stavka iz grupe može biti selektovana (radio dugme) all – Sve stavke mogu biti čekirane (checkboxes) none – Nijednu stavku nije moguće čekirati Moguće je primeniti podrazumevano stanje na stavku korišćenjem android:checked atributa u elementu i pšromene u kodu korišćenjem setChecked() metode. Kada je stavka koju je moguće čekirati selektovana sistem poziva odgovarajuću (za tu stavku) callback metodu (kao što je onOptionsItemSelected()). Obavezno je da se izvrši 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) pomoću isChecked() metode i onda postaviti stanje pomoću 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 način onda se vidljivo stanje stavke neće promeniti kada ga korisnik selektuje. Sa druge stanje kada se stanje postavi na prethodno opisan način aktivnost čuva čekirano stanje i prilikom ponovnog otvaranja menija novočekirano stanje je vidljivo korisniku.Stavke menija koje se čekiraju se koriste samo po sesiji i neće biti sačuvane kada se sesija uništi.
5.4.Događaji u okviru korisničkog interfejsa Obrada događaja u okviru korisničkog interfejsa se zasniva na hvatanju događaja u okviru specifičnog 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 događaje. Android frejmwork poziva ove metode kada se god desi neka akcija nad definisanom klasom, odnosno objektom. Na primer, kada korisnik dodirne određeni View (na primer Button), poziva se onTouchEvent() metoda nad tim objektom. Da bi se ovaj događaj obradio, neophodno je proširiti odgovarajuću klasu i realizovati override metode. Međutim, proširivanje svakog pojedinačnog tipa View-a da bi se obradio događaj, nije najbolje rešenje. S tim u vezi, klasa View sadrži kolekciju ugneždenih interfejsa sa callbacks koji se jednostavnije definišu. Ovi interfejsi se zovu event listeners. 5.4.1.Event listeners Event listener je interfejs u okviru View klase koji sadrži 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 sledeće 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 događaje koji se odnose na zadržavanje ulaznog dodira/fokusa i sl. nad određenim 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 pušta dugme na telefonu. onTouch() Iz View.OnTouchListener. Bilo koja aktivnost na ekranu kategorizovana kao dodir, obuhvatajući pritisak, puštanje 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 ugneždene interfejse u okviru Aktivnosti ili ih definisati kao anonimne klase. Nakon toga, šalje se instanca implementiranog interfejsa ka odgovarajućem View. Set…Listener (na primer poziva se setOnClickListener() a njemu se prosleđuje 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 može 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 događaja. Umesto korišćenja OnClickListener-a za dugme u okviru aktivnosti, moguće je dodeliti odgovarajući metod dugmetu u okviru XML layouta. Na primer: Kada korisnik klikne na dugme Android će automatski pozvati metodu mojametoda. View koji se prosleđuje predstavlja referencu ka vidžetu 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 specifičan view koji sadrži poruku za korisnika. Toast view se prikazuje kao kretajući natpis iznad aplikacije i nikad ne dobija fokus. Ideja je da se korisnik ne uznemirava dok nešto radi, ali da mu se ipak prikaže određena informacija. Jedan od primera je podešavanje jačine zvuka ili obaveštenje da su podešavanja sačuvana.
Sledeći primer ilustruje obradu događaja nad poljem za unos teksta: 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 iščitao 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; }
Sledeći primer se odnosi na obradu selektovanja checkbox elementa: U okviru Aktivnosti potrebno je ubaciti implementaciju odgovarajuće 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(); } }
Sledeći primer se odnosi na obradu selektovanja radiobutton elementa: U okviru Aktivnosti potrebno je ubaciti implementaciju odgovarajuće 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 okruženje omogućava praćenje 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 može podesiti svoju dostupnost za fokus pomoću metode setFocusable(), odnosno ispitati fokus pomoću metode isFocusable(). Pomeranje fokusa se zasniva na algoritmu najbližeg suseda (objekta View na ekranu) u datom pravcu. U slučaju kada je potrebno izmeniti default pomeranje fokusa, mogu se iskoristit sledeći XML atributi u okviru lazout fajla: nextFocusDown, nextFocusLeft, nextFocusRight, and nextFocusUp. Na primer 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, omogućena 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 određeni View poziva se funkcija requestFocus().
5.5.Rad sa obaveštenjima – Notifications Postoje situacije kada je potrebno obavestiti korisnika da se desio neki događaj u okviru aplikacije, iako aplikacija može da bude u pozadini u tom trenutku. Na primer:
Kada se u pozadini preuzima neki fajl sa Interneta u momentu završetka downloada, trebalo bi porukom obavestiti korisnika da je proces završen Ako aplikacija radi u pozadini, ali je u nekim momentu potrebno da korisnik definiše dalje korake, javlja se notifikacija o tome Ukoliko aplikacija nešto radi dok korisnik čeka, potrebno je obavestiti korisnika o napretku ili vremenu čekanja E-mail aplikacija može 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 načina: 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 obaveštenja, jer dolaze do potrebnih informacija bez da pokrenu aplikaciju. Međutim, postoji granica između dobrog obaveštajnog sistema i onog koji preteruje sa notifikacijama, ne treba korisnika stalno uznemiravati. Svako obaveštenje treba da bude urađeno tako da na korisnika deluje samo pozitivno. Android platforma nudi nekoliko načina kako se mogu obaveštavati korisnici. Obaveštenje se često prikazuje u statusnoj liniji u gornjem delu ekrana. Obaveštenje može da podrazumeva: Tekstualne informacije Grafika Zvuk Vibracija uređaja Kontrola nad svetlosnim indikatorom Napomena: prilikom rada sa notifikacijama bitno je da se zna da ne podržavaju svi android uređaji npr rad sa vibracijom ili sfetlosnim efektima telefona. 5.5.1.Toast notifikacije
Ova notifikacije predstavlja poruku na površini prozora. Na kratko popunjava jedan deo ekrana, a korisnikova aktivnost ostaje aktivna i vidljiva sve vreme. Notifikacija tuomatski isčezava sa ekrana i ne prihvata događaje. Može 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 može da upozori korisnika i putem zvuka, vibracije ili svetla na mobilnom uređaju. Najčešće se koristi kada akitvnost ili servis nešto radi u pozadini i ima potrebu da komunicira sa korisnikom u nekom momentu.
5.5.3.Dialog notifikacije Dijalog notifikacija se najčešće javlja u okviru trenutno aktivne aktivnosti. Dijalog od aktivnosti preuzima interakciju sa korisnikom. Dijalozi su objašnjeni u sekciji 5.6.
5.6.Dijalozi Android omogućava prikazivanje interaktivnih dijaloga koji u sebi mogu da sadrže bilo koje elemente korisničkog interfejsa. Neke vrste dijaloga dolaze sa predefinisanim izgledom i namenom, a moguće je definisati i spostveni layout za dijalog ili čak napraviti sopstvenu klasu na osnovu klase Dialog koja predstavlja zajedničku nadklasu za sve vrste dijaloga.
102
Razvoj aplikacija za operativni sistem Android Bez obzira na klasu dijaloga, potrebno je obratiti pažnju na način njihovog kreiranja. Najjednostavniji način je da se dijalog kreira u samom kodu, tamo gde je potrebno i zatim prikaže pozivanjem metode show() nad objektom dijaloga. Ovaj pristup je problematičan, jer se o takvom dijalogu moramo sami starati u slučaju promene konfiguracije telefona (tipično: u slučaju rotacije iz Portrait u Landscape i obrnuto). Dialog mojDijalog = new MojaKlasaDijaloga() mojDijalog.show();
Bolja varijanta je da staranje o dijalogu prepustimo našoj 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 slučaja 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 traži (npr. dijalog sa IDjem 1 je upozorenje korisniku da se greška desila, a dijalog sa IDjem 2 mu nudi izbor OK/CANCEL), pa zavisno od toga kreiramo odgovarajući dijalog i vraćamo ga kao rezultat. Ova metoda će automatski biti pozvana kada korisnik prvi put pozove metodu showDialog(int) ili showDialog(int, bundle). Pri sledećim pozivanjima će biti upotrebljen postojeći, već kreirani dijalog. Ako dođe 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 drugačijio tekst greške), onda možemo 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 Vrši se pomoću klase AlertDialog.Builder. Može se odrediti tekst poruke koja će biti prikazana metodom setMessage, kao i broj dugmića (1/2/3), tekst na njima i listeneri koji će reagovati na klik. Dugmići i njihovi listeneri se dodaju metodama setNeutralButton, setPositiveButton i setNegativeButton. Sve navedene metode vraćaju referencu na samog Buildera pa je omogućeno pozivanje više 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");
Korišćen layout (moj_lejaut.xml):
104
Razvoj aplikacija za operativni sistem Android
5.6.3.Druge vrste dijaloga Druge, specifične vrste dijaloga je uglavnom dovoljno samo kreirati uz odgovarajuće parametre pri konstrukciji pošto im je izgled predefinisan. Primeri drugih vrsta dijaloga:
6.
Intents Tri ključne komponente svake aplikacije – aktivnosti, servisi i broadcast risiveri se aktiviraju preko poruka – intents. Razmena poruka preko intenta omogućava kasno povezivanje tokom izvršavanja između između komponenata u okviru iste ili različitih aplikacija. Objekat Intent je pasivna struktura podataka koja drži apstraktan opis operacija koje treba da se izvrše, ili u slučaju broadcast risivera, opis nečega š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 postojeća aktivnost da uradi nešto novo (Takođe, Intent može 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. Slično, intent može biti poslat ka Context.bindService() da bi se uspostavila veza između komponente koja poziva i ciljnog servisa. Opciono može 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 slučaju, Android sistem pronalazi odgovarajuću aktivnost, servis ili broadcast risiver kao odgovor na intent poruku. Android poseduje pravila za mapiranje intenta sa komponentama, odnosno na koji način se određuje 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. Sadrži 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 sadrži (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 pomoću setComponent (), setClass() ili setClassName(), a čita se pomoću getComponent (). Action String koji definiše akciju koju treba realizovati, ili u slučaju broadcast Intenta, akciju koja se desila i o kojoj se izveštava. Intent klasa definiše veći broj konstanti, obuhvatajući sledeće: Konstanta Ciljna Akcija komponent a ACTION_CALL activity Iniciranje poziva ACTION_EDIT activity Prikaza podataka za editovanje korisniku ACTION_MAIN activity Započni kao inicijalnu aktivnost u okviru aplikacije, bez ulaznih i izlaznih podataka ACTION_SYNC activity Sinronizuj podatke na serveru sa podacima na mobilnom uređaju. ACTION_BATTERY_LOW broadcast Obaveštenje da je baterija pri kraju. receiver ACTION_HEADSET_PLU broadcast Slušalice su utaknute ili istaknute iz G receiver uređaja ACTION_SCREEN_ON broadcast Ekran je uklljučen receiver ACTION_TIMEZONE_CH broadcast Podešavanja za vremensku zonu su ANGED receiver promenjena Akcija u velikoj meri definiše kako je struktuiran ostatak intenta, posebno polja data i extras. Akcija u Intent objektu se postavlja pomoću metode setAction() , a čita se pomoću getAction(). 106
Razvoj aplikacija za operativni sistem Android Neki od primera uređenog 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 brojčanik I prikazuje navedeni
ACTION_EDIT content://contacts/people/1 – Vrši izmenu podataka o osobi čiji je identifikator "1". ACTION_VIEW content://contacts/people/ -- Prikazuje listu osoba kroz koju korisnik može da pretražuje. Selektovanjem osobe za detaljniji prikaz otvara se novi intent. Data Podaci o URI-ju na kome se nalaze podaci i MIME tip podataka. Različite akcije su uparene sa različitim tipovima podataka. Ukoliko je action polje ACTION_EDIT data polje će sadržati 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 upućuje navedeni URI. Kada se uparuju intenti i komponente koje su sposobne da obrađuju 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 može zaključiti i iz URI-ja naročito iz content: URI koji ukazuje da su podaci smešteni na uređaju i kontrolisani od strane dobavljača sadržaja. Međutim tip podataka se može 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 moguće dobiti pomoću getData() a podatke o tipu pomoću getType() metode. Category Kategorija je string koji sadrži dodatne informacije o komponenti koja treba da obradi Intent. Intente klasa definiše nekoliko predefinisanih kategorija neke od njih su: Kategorija
Značenje
CATEGORY_BROWS ABLE
Ciljana aktivnost se može pozvati iz browser-a za prikaz podataka koji su referencirani linkom (slika ili e-pošta).
CATEGORY_GADGE T
Aktivnosi mogu biti ugrađene u druge aktivnosti koje hostuju alate (gadget)
CATEGORY_HOME
Aktivnost prikazuje početni ekran tj. Prvi ekran koji korisnik vidi kada je uređaj uključen i dugme Home je pritisnuto.
107
Razvoj aplikacija za operativni sistem Android Metoda addCategory() smešta kategoriju u Intent objekat, removeCategory() briše prethodno dodatu kategoriju i getCategory() uzima skup svih kategorija koje su trenutno u objektu. Extras Predstavljaju uređene parove koji nose dodatnu vrednost za komponentu koja obrađuje Intent. Kao što su neke akcije uparene sa specifičnim 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 slušalice uključene ili isključene kao i "name" extra koji definiše tip slušalica. Intent objekat ima više put...() metoda za ubacivanje različitih tipova extra podataka i analogne get...()methoe za čitanje ovih podataka. Flags Android sistemu je moguće zadati instrukcije u slučaju 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 definišu u Intent klasi.
6.1.Vrste Intent-a Intente možemo odeliti u dve grupe: Eksplicitne intente – određuju ciljnu komponentu po imenu. Korišćenje imena komponente nije dobar način za korišćenje komponente iz drugih aplikacija pa se ovaj pristup koristi za interne poruke aplikacije (za pokretanje podređenog 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 isporučuje eksplicitne intent-e instanci dizajnirane klase. Ništa osim imena komponente nije bitno za određivanje komponente koja obrađuje Intent. Eksplicitni Intenti se najčešće 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 definiše naziv akcije koju treba realizovati i opciono URI koji treba upotrebiti za akciju. Na primer sledeći intent govori Android OS-u da prikaže 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 pošalje Androidu, on pretražuje sve komponente registrovane za određenu akciju i tip podataka. Ukoliko Android pronađe samo jednu komponentu, on je direktno startuje. Međutim, ako Android identifikuje više komponenata registrovanih za taj intent, otvara se dijalog koji traži od korisnika da definiše komponentu pomoću koje će biti obrađen intent. Komponenta koja prihvata intent može preuzeti informacije iz intenta preko metoda getAction() i getData(). Komponenta koja kreira intent može dodati podatke na intent preko metode putExtra(). Extras su parovi ključ/vrednost; a ključe je uvek String. Kao vrednost se može 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, može uzeti podatke pomoću 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 pronaći najbolju komponentu za obradu Intent-a – jednu aktivnost, servis da izvrši traženu radnju ili skup broadcast prijemnika kao odgovor na broadcast objavu. To se vrši upoređivanjem sadržaja Intent objekta i intent filters-a – strukture povezane sa komponentama. Filteri oglašavaju mogućnosti komponente i razdvajaju Intent-e na one koji mogu i koji ne mogu da obrade zahtev. Filteri objašnjavaju koje implicitne intent-e komponente mogu da obrade. Ukoliko komponenta nema intent filter ona može da obrađuje samo eksplicitni intent. Komponente sa filterima mogu da obrađuju 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 rešavanje problema koja komponenta može da obradi Intent 6.1.1.Intent filteri Njihov zadatak je da informišu sistem koje implicitne filtere mogu da obrade. Aktivnosti, servisi i broadcast prijemnici mogu da imaju jedan ili više Intent filtera. Svaki filter opisuje mogućnosti komponente odnosno set Intenta koji je komponenta spremna da obradi. Na ovaj način filteri blokiraju neželjene Intente ali samo neželjene implicitne intente. Eksplicitni intenti se uvek isporučuju bez obzira na sadržaj, odnosno filter se u ovim slučajevima uopšte ne posmatra. Impicitni intenti se isporučuju komponenti samo ukoliko prođu jedan filter komponente. Komponente imaju različite filtere za svaki posao koji može da obavi. Na primer, NoteEditor aktivnost (opisana kasnije) Note Pad aplikacije ima dva filtera – jedan za pokretanje određene beleške koju korisnik može pregledati ili izmeniti i drugi za pokretanje nove, prazne beleške koju korisnik može popuniti i sačuvati. Filteri i sigurnost Oslanjanje na filtere kada je sigurnost u pitanju nije dovoljna. Iako otvara komponentu samo za određene zahteve od strane impicitnih filtera ne čini ništa da zaštiti komponente od eksplicitnih intenta. Intent filter je instanca IntentFilter klse. Međuti s obzirom da Android sistem mora znati mogućnosti komponente pre nego što je pokrene, intent filteri se ne postavljaju u Java kodu nego u manifest fajlu aplikacije (AndroidManifest.xml) kao element. Filter ima polja koja su zadužena za action, data i category polja Intent objekta. Implicitni intent se testira filterima iz sve tri oblasti. Da bi se isporučio komponenti mora proći sva tri testa odnosno filtere iz sve tri oblasti. Ukoliko ne prođe bar jedan filter Android sistem ga neće isporučiti komponenti. Međutim ukoliko komponenta ima više intent filtera u svakoj oblasti dovoljno je da zadovolji bar jedan filter iz oblasti kako bi ga sistem isporučio komponenti. Svaki od ova tri testa su detaljnije objašnjeni u tekstu koji sledi. Action test Element u manifest fajlu prikazuje listu action elemenata u formi taga: ... Lista ne može biti prazna, filter mora sadržati barem jedan element, u suprotnom će blokirati sve intente. Da bi prošao 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 sledeći:
Ukoliko filter nema navedenu nijednu akciju ne postoji ništa sa čime intent može 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 sadrži barem jednu akciju
Category test Element prikazuje listu kategorija kao podelemente. Na primer: ... 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. Slično i string "android.intent.action.EDIT" korespondira sa ACTION_EDIT konstantom. Da bi intent prošao test kategorije svaka kategorija u intent objektu mora se poklapati sa kategorijom u filteru. Filter može imati i dodatne kotegorije ali mora sadržati sve koje su u intent-u. Iz tog razloga Intent objekat bez kategorija uvek prolazi test bez obzira šta je u filteru. Međutim postoji jedan izuzetak. Android sve implicitne intent-e koji su prosleđeni ka startActivity() metodi tretira kao da sadrže barem jednu kategoriju i to "android.intent.category.DEFAULT" (CATEGORY_DEFAULT konstantu). Iz tog razloga aktivnosti koje žele da primaju implicitne intente moraju uključiti "android.intent.category.DEFAULT" u svoje intent filtere. Filteri sa "android.intent.action.MAIN" i "android.intent.category.LAUNCHER" podešavanjima su izuzeci. Oni označavaju aktivnosti koje počinju nove zadatke i koji se prikazuju na početnom ekranu. One mogu uključivati "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 može se pojavljivati više puta. Na primer: ...
111
Razvoj aplikacija za operativni sistem Android Svaki element može 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, sledfeći 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 ignoriše. Svaki od ovih atributa je opcion ali nisu nezavisni među 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 definiše samo scheme, svi URI-ji sa tom šemom se poklapaju sa filterom. Samo path specifikacija u filteru može sadržati specijalne znakove pomoću kojih se omogućuje delimično poklapanja path-a. Atribu type u elementu definiše MIME tip podataka i mnogo se češće 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 sledeća: a. Intent objekat koje ne sadrži ni URI ni tip podataka prolazi test samo ukoliko filter ne specificira nikakve URI ni tipove podataka. b. Intent objekat koji sadrži URI a ne sadrži nikakav tip podataka (i tip podataka se ne može zakljućiti 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 sadrži tipove podataka ali ne sadrži URI prolazi test samo ukoliko filter definiše isti tip podataka a ne specificira URI. d. Intent objekat koji sadrži i URI i tip podataka (ili se tip podataka može zaključiti 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 podržava content: i file:. Poslednje pravilo odražava očekivanje 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 kao u primeru govori Androidu da komponenta može da uzme sliku od content dobavljača i da je prilaže: S obzirom da se većina podataka dobavlja od strane content dobavljača filteri koji određuju tip podataka a ne definišu URI su najčešći. Filteri koji definišu scheme i tip podataka su takođe veoma česti. Na primeru je prikazan element koji govori Androidu da komponenta može da dopremi video materijal sa mreže i da ga prikaže: Ukoliko veb pretraživač sledi link ka nekoj veb stranici on prvo pokušava da prikaže sadržaj te stranice i uspeva ukoliko je reč o HTML stranici. Međutim ukoliko ne može da prikaže podatke on sastavlja implicitni intent sa scheme i tipom podataka i pokreće aktivnost koja može da obradi zahtev. Ukoliko nema nikoga da obradi zahtev on aktivira preuzimača datoteka kako bi preuzeo podatke. Nakon toga ga preuzima content provider odnosno mnogo više aplikacija može da odgovori na taj zahtev. Sledeća specifikacija prijavljuje aktivnost za intent koji se poziva kada neka komponenta zatraži otvaranje veb stranice: Primer definisanja aktivnosti za intent koji traži ACTION_SEND za text/plain tip podataka Mnoge aplikacije započinju 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 definišu i kategoriju "android.intent.category.LAUNCHER": 113
Razvoj aplikacija za operativni sistem Android Korišćenje 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 nečega o setu komponenti instaliranih na uređaju. Na primer: Android sistem popunjava application launcher, tj. početni ekran koji prikazuje sve aplikacije koje su dostupne korisniku za pokretanje pronalaženjem 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 način pronalazi home ekran traženjem svih aktivnosti koje imaju "android.intent.category.HOME" u svom filteru. Svaka aplikacija može veoma jednostavno koristiti uparivanje intent-a. PackageManager klasa ima skup query...() metoda koje vraćaju sve komponente koje mogu da prihvate određeni intent i skup sličnih resolve...() metoda koje određuju komponentu koja najbolje odgovara zadatom intent-u. Na primer: queryIntentActivities() vraća listu svih aktivnosti koje mogu da obrade intent koji je prosleđen kao parametar a queryIntentServices() vraća listu svih servisa koji mogu da obrade intent koji je prosleđen kao parametar dok metod, queryBroadcastReceivers(), vraća listu broadcast receiver-a. Ove metode ne aktiviraju komponente nego ih samo izlistavaju one koje mogu da obrade zahtev. 6.1.2.Primer beležnice Aplikacija Beležnica (Note Pad) omogućava korisnicima da pregledaju listu beležaka, da pogledaju detalje o određenoj belešci, da menjaju beleške, ali i da dodaju nove beleške u listu. Ovaj primer prikazuje upotrebu intent filtera koji su prethodno deklarisani u manifest fajlu. Ukoliko su pomoću Android SDK managera instalirani i odgovarajući primeri, izvorni kod ovog primera nalazi se u folderu /samples/NotePad/index.html, gde je putanja do foldera gde se nalazi instaliran Android SDK. Izvorni kod je takođe moguće pronaći i na Internetu, u odeljku Tutorials and Sample Code, odnosno ovde. U svom manifest fajlu, aplikacija Beležnica deklariše tri aktivnosti, a svaka od njih poseduje najmanje po jedan intent filter. Takođe se deklariše i provajder sadržaja (content provider) koji upravlja podacima o beleškama. Naredne linije koda prikazuju definisan manifest fajl:
114
Razvoj aplikacija za operativni sistem Android 115
Razvoj aplikacija za operativni sistem Android Prva aktivnost, NotesList, razlikuje se od ostalih aktivnosti tako što ona upravlja direktorijumom (listom) beležaka, a ne pojedinačnim beleškama. Ona praktično služi kao početni korisnički interfejs aplikacije. Omogućava izvršenje tri akcije, definisane pomoću tri intent filtera: Ovaj filter deklariše glavnu ulaznu tačku aplikacije Beležnica. Standardna MAIN akcija predstavlja ulaznu tačku koja ne zahteva bilo koju drugu informaciju sa Interneta (npr. specifikaciju podataka). Kategorija LAUNCHER definiše da ova ulazna tačka treba da bude u pokretaču (launcher) aplikacije. Ovaj filter deklariše akcije koje aktivnost može da izvrši nad direktorijumom beležaka. On omogućava korisniku da pregleda ili edituje direktorijum (pomoću akcija VIEW i EDIT) ili da uzme odgovarajuću belešku iz direktorijuma (akcija PICK). Atribut mimeType elementa specifikuje tip podataka nad kojima se akcija izvršava. Označava da aktivnost može da dobije Cursor za nula ili više unosa (vnd.android.cursor.dir) od provajdera sadržaja koji čuva podatke aplikacije Beležnica (vnd.google.note). Objekat Intent koji startuje aktivnost treba da sadrži URI content: koji tačno definiše 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 sadrže DEFAULT kategoriju, uz dva izuzetka:
Intenti koji eksplicitno spominju ciljanu aktivnost Intenti koji sadrže akciju MAIN i kategoriju LAUNCHER
Dakle, kategorija DEFAULT je obavezna za sve filtere, osim za one koji sadrže akciju MAIN i kategoriju LAUNCHER.
116
Razvoj aplikacija za operativni sistem Android Ovaj filter opisuje mogućnost da aktivnost vrati belešku koju je korisnik izabrao, ali bez zahtevanja bilo kakve specifikacije direktorijuma iz koga korisnik treba da izabere određenu belešku. Akcija GET_CONTENT je slična akciji PICK. U oba slučaja, aktivnost vraća URI beleške koju je korisnik izabrao. (U oba slučaja, URI se vraća aktivnosti startActivityForResult() da bi se startovala aktivnost NoteList) Razlika je u tome što ovde pozivalac definiše koji tip podataka ga interesuje, a ne direktorijum podataka iz kog korisnik uzima podatke. Tip podataka vnd.android.cursor.item/vnd.google.note definiše tip podataka koji aktivnost može da vrati – URI iz jedne beleške. Iz vraćenog URI-a, pozivalac može da dobije Cursor za samo jednu stavku (vnd.android.cursor.item), i to od provajdera sadržaja koji poseduje podatke aplikacije Beležnica ( vnd.google.note). Drugim rečima, za akciju PICK iz prethodnog filtera, ovaj tip podataka definiše tip podataka koji aktivnost može da prikaže korisniku. Za filter GET_CONTENT, on definiše tip podataka koji aktivnost može da vrati pozivaocu. Zahvaljujući ovim mogućnostima, sledeći intenti rešavaju aktivnost NotesList: 1. 2.
3.
4.
5.
Akcija: android.intent.action.MAIN Opis: Pokreće aktivnost bez definisanih podataka. Akcija: android.intent.action.MAIN Kategorija: android.intent.category.LAUNCHER Opis: Pokreće aktivnost bez definisanih izabranih podataka. Ovo je intent koji se koristi od strane pokretača da popuni svoju glavnu listu. Sve aktivnosti sa filterima koji sadrže ovu akciju i kategoriju dodaju se na listu. Akcija: android.intent.action.VIEW Podaci: content://com.google.provider.NotePad/notes Opis: Traži od aktivnosti da prikaže sve beleške iz content://com.google.provider.NotePad/notes. Korisnik može da pregleda listu i da dobije sve informacije o njenim stavkama. Akcija: android.intent.action.PICK Podaci: content://com.google.provider.NotePad/notes Opis: Traži od aktivnosti da prikaže listu beležaka iz content://com.google.provider.NotePad/notes. Korisnik može da izabere belešku 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: Traži od aktivnosti da vrati jednu belešku iz podataka aplikacije Beležnica. 117
Razvoj aplikacija za operativni sistem Android Druga aktivnost, NoteEditor, prikazuje korisnicima jedan unos i omogućuje im njegovu izmenu. Ove dve akcije opisane su pomoću dva intent filtera: Prva i primarna svrha ove aktivnosti je da omogući korisnicima da vrše interakciju sa jednom beleškom, odnosno da vide i menjaju belešku. Intent bi sadržao URI podataka koji se poklapaju sa MIME tipom vnd.android.cursor.item/vnd.google.note, to je URI za jednu, specifičnu belešku. To bi tipično bio URI koji vraćaju akcije PICK ili GET_CONTENT aktivnosti NoteList. Kao i ranije, ovaj filter izlistava kategoriju DEFAULT, pa aktivnost može da se startuje pomoću intenta koji ne definišu eksplicitno klasu NoteEditor. Druga svrha ove aktivnosti je da omogući korisnicima da kreiraju novu belešku, koja će biti ubačena (INSERT) u postojeći direktorijum beležaka. Intent će sadržati URI podataka koji se poklapaju sa MIME tipom vnd.android.cursor.dir/vnd.google.note. To je URI direktorijuma u koji beleška treba da bude smeštena. Sledeći intenti su zaduženi za aktivnost NoteEditor: Akcija: android.intent.action.VIEW Podaci: content://com.google.provider.NotePad/notes/ID Opis: Traži od aktivnosti da prikaže sadržaj beleške sa određenim ID-om. 2. Akcija: android.intent.action.EDIT Podaci: content://com.google.provider.NotePad/notes/ID Opis: Traži od aktivnosti da prikaže sadržaj beleške određenog ID-a i omogućava korisniku da izmene ovakvu belešku. Ako korisnik sačuva promene, aktivnost će ažurirati podatke beleške kod provajdera sadržaja. 3. Akcija: android.intent.action.INSERT Podaci: content://com.google.provider.NotePad/notes Opis: Traži od aktivnosti da kreira novu, praznu belešku u listi beležaka, na lokaciji content://com.google.provider.NotePad/notes i omogućava korisniku da izvrši izmenu beleške. Ako korisnik sačuva belešku, URI će biti vraćen pozivaocu. 1.
118
Razvoj aplikacija za operativni sistem Android
Poslednja aktivnost, TitleEditor, omogućava korisniku da izmeni naslov beleške. Ovo je moguće implementirati direktnim pozivanjem aktivnosti (navođenjem imena aktivnosti u intentu), bez korišćenja intent filtera. Međutim, ovde ćemo prikazati kako je moguće objavljivanje različitih operacija nad postojećim podacima:
Ova
aktivnost
koristi
jedan
intent filter koji koristi posebnu akciju Trebalo bi da akcija bude izvršena nad specifičnom beleškom (tip podataka vnd.android.cursor.item/vnd.google.note), slično kao i kod VIEW i EDIT akcija. Ovde aktivnost prikazuje naslov koji se nalazi u podacima beleške, a ne sam sadržaj beleške. com.android.notepad.action.EDIT_TITLE.
Editor naslova osim klasične kategorije DEFAULT podržava i dve ostale standardne kategorije ALTERNATIVE i SELECTED_ALTERNATIVE. Ove kategorije identifikuju aktivnosti koje mogu da budu predstavljene korisnicima u meniju sa opcijama na sličan način kao što kategorija LAUNCHER identifikuje aktivnosti koje se predstavljaju korisniku prilikom startovanja aplikacije. Treba obratiti pažnju da filter takođe obezbeđuje i eksplicitnu labelu (pomoću 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 sledeći intent: 1.
Akcija: com.android.notepad.action.EDIT_TITLE Podaci: content://com.google.provider.NotePad/notes/ID Opis: Traži od aktivnosti da prikaže naslov beleške sa određenim ID-om. Omogućava korisniku da izmeni naslov.
6.2.Intents primeri Pozivanje dve aktivnosti pomoću 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 Manifest treba dopuniti sa: android:name="android.permission.CALL_PHONE"/>
View more...
Comments