Sveuciliste J. J. Strossmayera u OsijekuOdjel za matematiku
Vojislav Durackovic
Programiranje mobilnih aplikacijaza Android operativni sustav
Diplomski rad
Osijek, 2012.
Sveuciliste J. J. Strossmayera u OsijekuOdjel za matematiku
Vojislav Durackovic
Programiranje mobilnih aplikacijaza Android operativni sustav
Diplomski rad
Mentor: doc. dr. sc. Domagoj Matijevic
Osijek, 2012.
Sadrzaj
1 Uvod 4
2 Java programski jezik 7
2.1 Znacajke programskog jezika . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Primjer rada s klasama u Javi . . . . . . . . . . . . . . . . . . . . . . 8
3 Android 11
3.1 Povijesni razvoj Androida . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Nije Hello World aplikacija . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 Od pocetka do kraja jedne aktivnosti . . . . . . . . . . . . . . . . . . 22
3.5 Korisnicko sucelje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.6 Intents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4 Pracenje obavijesti Odjela za matematiku 32
4.1 JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2 JSONParser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.3 MathosMonitoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Literatura 43
Sazetak 44
Summary 45
Zivotopis 46
3
1 Uvod
Prvi pametni telefoni ili popularnije engl. smartphones kombinirali su funkcije osob-
nog digitalnog asistenta (engl. personal digital assistant) PDA i mobilnog telefona.
Danasnji modeli poboljsani su portabilnim medijskim playerima, ekranima osjetlji-
vim na dodir visoke rezolucije, kamerama takoder visoke rezolucije, internet pregled-
nicima, GPS navigacijom itd. Razvojem mobilnih komunikacija i mobilnog pristupa
internetu dolazi do razvoja mobilnih aplikacija.
Svakako treba istaknuti prisustvo razlicitih mobilnih operativnih sustava, koji
svaki za sebe zahtjevaju razlicite alate i programske jezike za programiranje mobil-
nih aplikacija koje ce biti instalirane na njima. Neki od najpoznatijih operativnih
sustava za mobitele su: Palm OS, Symbian, Windows Phone, RIM, iOS, Android i
mnogi drugi. Ukratko cemo izloziti prednosti i nedostatke danas dvaju najrasirenijih
operativnih sustava u svijetu, a to su Appleov iOS i Googleov Android.
iOS je operativni sustav razvijen od strane Apple Inc. za mobilni uredaj iPhone
te za prijenosni media player iPod Touch, a prvi put se pojavio 2007. godine. Za-
sigurno je velik broj pristasa ostavstine Stevea Jobsa 1 i neosporna je kvaliteta iOS
operativnog sustava. Ipak napomenimo kako je za jednog pocetnika u svijetu pro-
gramiranja mobilnih aplikacija, razvoj mobilne aplikacije za operativni sustav iOS
vrlo ogranicen. Naime, prve poteskoce ogledaju se u cinjenici da je gotovo nemoguce
programirati na racunalu koje nije iz obitelji Macintosha, odnosno racunala proizve-
dena od strane Applea. Apple je takoder postavio visoke kriterije za objavljivanje
aplikacije na njihovom marketu te ukoliko biste i napravili aplikaciju vrlo je upitno
bi li ta aplikacija zazivjela.
S druge pak strane Google Android je prvi otvoreni operativni sustav za mobilne
uredaje pokrenut od strane Google Inc. i voden od strane Open Handset Alliance o
kome ce biti nesto vise govora kasnije. Android Inc. su osnovali Andy Rubin, Rich
Miner, Nick Sears i Chris White u listopadu 2003. godine kako bi razvijali programe
za pametne mobilne uredaje. Nakon dvije godine rada Google kupuje Android Inc.
U studenom 2007. godine osnovana je Open Handset Alliance (OHA) grupa s ciljem
stvaranja javnog standarda za mobilne uredaje. OHA 5. studenog 2007. predstavlja
mobilnu platformu otvorenog koda baziranu na Linux kernelu – Android.
Android platforma dobro je odgovorila izazovu za uporabu na uredajima razlicitih
dimenzija ekrana te je tako rasprostranjena na mnogim pametnim uredajima koji
imaju 2D ili 3D graficku karticu temeljenu na OpenGL ES 2.0 specifikacijama. In-
teresantno je kako se za pohranu podataka koristi relacijski DBMS (engl. Database
Managment System) sustav za upravljanje bazom podataka tzv. SQLite. SQLite
1Steven Paul Jobs (1955. - 2011.) bio je jedan od najutjecajnijih ljudi u svijetu racunalne
industrije. Zajedno sa Steveom Wozniakom u garazi punoj jabuka napravio je prvo kucno racunalo
Apple.
4
software2 napisan je u C programskom jeziku i njegova knjiznica je svega 275 kB.
Android platforma dozivjela je razne promjene verzija, a Google se potrudi da svaka
verzija ima neko sebi svojstveno ime. Na sljedecoj slici prikazana je zastupljenost
razlicitih verzija Android operativnog sustava (podaci su relevantni za period do
rujna 2012. godine).
Slika 1: Zastupljenost razlicitih verzija Android operativnog sustava
Iako je vecina aplikacija pisana u Java programskom jeziku, na Android uredajima
ne postoji Java virtualni stroj (engl. Java Virtual Machine) pa tako nije moguce
izvrsiti Java binarni kod. Za pokretanje Java aplikacije, Android koristi Dalvik
virtualni stroj. O samom programiranju Java programskim jezikom nesto vise bit
ce govora kasnije. Najveca prednost Androida u odnosu na druge mobilne opera-
tivne sustave svakako lezi u otvorenom kodu i mogucnosti programiranja mobilnih
aplikacija neovisno o platformi stolnog racunala. Ako to nije bio dovoljno dobar
razlog za odabir Androida kao platforme za koju cemo dalje prouciti razvoj mobil-
nih aplikacija onda mozemo reci da imamo drugih petsto milijuna razloga. Do sada
je zabiljezeno kako je diljem svijeta aktivirano upravo petsto milijuna uredaja na
mobilnoj platformi Android.
Ovaj rad podijeljen je u cetiri poglavlja. Izuzev ovog uvodnog poglavlja izdvojim
i ostala poglavlja. Poglavlje Java programski jezik podijeljeno je na dva potpoglavlja
2engl. software - programska podrska, programska oprema
5
i u prvom redu bavi se Java programskim jezikom, znacajkama ovog objektno ori-
jentiranog programskog jezika, a zatim u nastavku donosimo i primjer rada u ovom
jeziku. Od izuzetne je vaznosti biti koliko-toliko “na ti” s nekim objektno orijen-
tiranim jezikom, a svakako je pozeljno da je to upravo Java. Glavni dio rada nosi
poglavlje Android. To je opsirnije poglavlje sastavljeno od sest manjih potpoglavlja,
a vodi nas od prvih povijesnih pocetaka Androida, preko odgovarajucih alata u svi-
jet programiranja mobilnih aplikacija za Android operativni sustav. Mozda pomalo
neuobicajeno namjera nam je citatelja zadobiti i aplikacijom koja nije obicna Hello
World aplikacija. Do kraja ovog poglavlja “upoznajemo” se s klasama i kodovima
na razini koja predstavlja dobar temelj za izradu i prelazak na implementaciju vlas-
tite aplikacije. Svakako treba izdvojiti potpoglavlja Korisnicko sucelje i Intents koji
su nezaobilazni u svijetu aplikacija, a narocito u svijetu mobilnih aplikacija nami-
jenjenih uredajima s Android operativnim sustavom. Cetvrto poglavlje Pracenje
obavijesti Odjela za matematiku donosi prakticnu primjenu znanja i informacija s
kojima smo se upoznali u prethodnim poglavljima. Kako je pracenje obavijesti
Odjela za matematiku uradeno putem prosljedivanja, tj. parsiranja (engl. parsing)
podataka u JSON obliku, najprije cemo nesto vise reci o tome, a zatim u nastavku
donosimo i samu aplikaciju.
Dakle, cilj ovog diplomskog rada je citatelja (a i nas same) upoznati s nacinom
izrade mobilne aplikacije za Android operativni sustav te svakako steceno znanje
primjeniti i implementirati vlastitu aplikaciju.
6
2 Java programski jezik
Kako smo vec najavili u ovom poglavlju pozabavit cemo se Java programskim je-
zikom. Najprije odgovorimo na pitanje kakav je to programskim jezik. Java je
potpuno objektno orijentirani programski jezik, sto znaci da se sve operacije odvi-
jaju iskljucivo kroz objekte, odnosno preko njihovih funkcijskih clanova (metoda).
Osim samog programskog jezika ujedno zaokuplja cijelo okruzenje u kojem se pro-
grami izvode te dolazi sa sirokom lepezom gotovih knjiznica i funkcija. Na taj nacin
programiranje je znatno ubrzano i efikasnije. Iako je Java jezik opce namjene naj-
znacajniju primjenu nalazi u programiranju aplikacija za Internet, mobilne telefone
i svakako poslovne aplikacije.
2.1 Znacajke programskog jezika
Sintaksu programskog jezika nije potrebno posebno stavljati pod povecalo jer je ba-
zirana na jezicima C i C++. Opsezna knjiznica koja omogucuje jednostavno mrezno
programiranje te programiranje grafickog sucelja naglasava snagu ovog programskog
jezika. Upravo tim knjiznicama Java programeru omogucuje visoku produktivnost
i efikasnost.
Za razliku od C++ izvorni kod pisan u Javi ne prevodi se u strojni kod maticnog
procesora, nego u Java binarni kod (engl. Java bytecode) kojeg Java virtualni stroj
(engl. Java Virtual Machine, JVM ) interpretira i izvodi. Ovakav pristup osigurava
izvodenje Java koda na bilo kojem racunalu s bilo kojim procesorom i operativnim
sustavnom. Jedini uvijet je da na tom racunalu postoji Java virtualni stroj. Moramo
spomenuti kako su zbog interpretiranja Java binarnog koda, a ne samog izvodenja
izravno, Java programi i do desetak puta sporiji od ekvivalentnih programa pisanih
u nekom drugom programskom jeziku (vidi [9]).
Java podrzava visenitnost (engl. multithreading), odnosno dijeljenje programa
na dvije ili vise operacija (engl. thread) koje se izvrsavaju istovremeno. Preop-
terecenje operatora nije podrzano, primjerice samo operator zbrajanja + definiran
je za primitivne tipove podataka (cijeli i realni brojevi) te za znakovni niz. Ukoliko
bismo definirali novu klasu Kompleksni brojevi zbrajanje je potrebno implementirati
preko metoda.
Cetiri vazna svojstva Javu cine objektno orijentiranim:
1. Apstrakcija – Program cine objekti koji su instance nekih klasa. Java kod
nalazi se unutar jedne ili vise klasa.
2. Enkapsulacija – Podatke i metode koje s njima rade slazemo u smislene cjeline,
odnosno klase.
3. Nasljedivanje – Odnosi se na cinjenicu da jedna klasa moze naslijediti dio ili
svu strukturu i “ponasanje” od druge klase.
7
4. Polimorfizam – Omogucuje opcoj klasi definiranje metoda koje ce biti za-
jednicke za sve klase koje su iz nje izvedene, ostavljajuci podklasama slobodu
predefiniranja spomenutih metoda.
2.2 Primjer rada s klasama u Javi
U sljedecem jednostavnom primjeru u sklopu projekta Automobili napravili smo
dvije klase, Automobil koja sadrzi osnovne karakteristike automobila i klasu Pro-
gram koja koristi metode klase Automobil i predstavlja glavni dio cijelog programa.
Pogledajmo kako izgledaju kodovi ovih dviju klasa:
public class Automobil {
private String proizvodjac;
private String model;
private int godiste;
private double brzina;
private double maxBrzina;
public Automobil(String pro, String mdl, int god){
proizvodjac = pro;
model = mdl;
godiste = god;
}
public void setMaxBrzina(double brz){
maxBrzina = brz;
}
public boolean setBrzina(double brz){
if(brz > maxBrzina)
return false;
brzina = brz;
return true;
}
public double getBrzina(){
return brzina;
}
public String getProizvodjac(){
return proizvodjac;
}
public String getModel(){
return model;
}
public int getGodiste(){
8
return godiste;
}
}
Klasa Automobil kao sto vidimo ima privatne varijable kojima mozemo pris-
tupiti samo metodama. Jedna od metoda koja je prva definirana je konstruktor
i kako vidimo on nosi naziv kao i sama klasa. Konstruktor je posebna vrsta me-
tode zaduzena za inicijalizaciju objekta njegove klase. Razlikuje se od metode po
tome sto ima isto ime kao i klasa te nema povratni tip (niti void). Konstruktoru
prosljedujemo varijable, nazive proizvodaca i model automobila te godiste auto-
mobila. U nastavku samog koda napravili smo razlicite metode set i get kojima
postavljamo ili dohvacamo trazene vrijednosti varijabli.
U klasi Program implementirana su dva objekta, odnosno dvije instance klase
Automobil. Na temelju usporedbe u if petlji odlucili smo ispisati svojstva brzeg
automobila. Pogledajmo kako izgleda sam kod:
public class Program {
private static void ispis(Automobil myCar){
System.out.println("Automobil: "+myCar.getProizvodjac()+ " "
+ myCar.getModel()+ " iz "
+myCar.getGodiste()+ ". godine razvija brzinu "
+myCar.getBrzina()+" km/h.");
}
public static void main(String [] args){
Automobil toyota = new Automobil("Toyota", "Camry", 2009);
Automobil ferrari = new Automobil("Ferrari", "F430", 2009);
toyota.setMaxBrzina(212);
toyota.setBrzina(200);
ferrari.setMaxBrzina(360);
ferrari.setBrzina(313);
if(ferrari.getBrzina() < toyota.getBrzina() ){
ispis(toyota);
}
else ispis(ferrari);
}
}
Na samom pocetku ove klase definirali smo metodu ispis kojoj se prosljeduje
instanca klase Automobil. Uocite kako smo u sklopu te metode pozivali i druge me-
tode koje pripadaju klasi Automobil : getProizvodjac(), getModel() i dr. Primjetite i
9
kako ova klasa sadrzi main3 metodu. Napomenimo kako za razliku od Jave, Android
nema main metodu.
Istaknimo jos neka svojstva vezana za programiranje u Javi, a koja su od velikog
znacaja i za samo programiranje mobilne aplikacije za Android operativni sustav.
Prilikom prosljedivanja parametra u Javi, ne radimo prosljedivanje reference, nego
vrijednosti varijable. Dobro je napomenuti i kako je prilikom programiranja u Javi
neophodno vrsiti promjenu tipa varijable tzv. kastanje (engl. cast). Time se jedan
tip varijable svodi na drugi kojim se na laksi nacin “njegovim” metodama pristupa
i manipulira vrijednostima varijable.
Za kraj ovog poglavlja i jedna zanimljivost, Oracle je tuzio Google zbog krade in-
telektualnog vlasnistva, konkretno zbog koristenja Jave, softwareske platforme koju
je Oracle dobio kupovinom Sun Microsystemsa. Iako je Java besplatna za koristenje
u optuznici je stojalo kako je Google prilikom razvijanja Android operativnog sus-
tava koristio dosta Sun Java API-ja (engl. Application Programming Interface).
Nezavisni programer Malcolm Barclay izjavio je:,,Bilo bi krajnje smijesno pomisliti
kako je koristenje API-ja krada intelektualnog vlasnistva za jednu otvorenu plat-
formu.”, (za vise informacija vidi [12]). Dodajmo kako je ipak Oracle izgubio spor
na radost mnogih programera.
3engl. main – glavna metoda, dio programa u kojem se pozivaju druge metode i njima upravlja
10
3 Android
U uvodu smo kratko spomenuli kako je zapocela prica s Androidom. Dakle, radi se
o prvom otvorenom operativnom sustavu za mobilne uredaje temeljen na Linuxovoj
jezgri. Primarno je dizajniran za uredaje s ekranima osjetljivim na dodir (engl.
touchscreen) kao sto su pametni mobiteli i tablet racunala (engl. tablet computers).
U nastavku cemo dati pregled povijesnog razvoja Androida.
3.1 Povijesni razvoj Androida
Kompanija Android osnovana je u listopadu 2003. godine u Palo Alto (California,
USA). Osnivaci su joj Andy Rubin, Rich Miner, Nick Sears i Crhis White. Nakon
samo dvije godine, Google je preuzeo Android i vec tada se naslucivalo kako Google
namjerava da se probije na trziste mobilnih telefona. U studenom 2007. godine u
cijelu pricu ukljucuje se Open Handset Alliance, konzorcijum informatickih kom-
panija koji broji preko osamdeset clanica, istaknimo neke od njih: Google, Sprint,
T-Mobile, Intel, Nvidia, Qualcomm, HTC, LG, Samsung i mnoge druge.
Cilj ovog udruzivanja bio je stvoriti javni standard za mobilne uredaje. U listo-
padu 2008. godine Android je predstavljen kao mobilna platforma otvorenog koda
pod Apache licencom. Nakon ovoga uslijedio je razvoj samog operativnog sustava,
koji navodimo kronoloski u tablici:
Verzija Datum distribucije API razina
1.5 Cupcake 30. travnja 2009. 3
1.6 Donut 15. rujna 2009. 4
2.0, 2.1 Eclair 26. listopada 2009. 7
2.2 Froyo 20. svibnja 2010. 8
2.3 Gingerbread 6. prosinca 2010. 9 – 10
3.0 Honeycomb 22. veljace 2011. 11 – 13
4.0 Ice Cream Sandwich 19. listopada 2011. 14 – 15
4.1 Jelly Bean 9. srpnja 2012. 16
Tablica 1: Kronoloski razvoj operativnog sustava Android
U nekoliko navrata spomenuli smo kako je jezgra Androida preuzeta iz Linuxa,
jezgra je pisana u C/C++ programskom jeziku. Ukoliko bismo detaljnije zadirali u
samu arhitekturu Androida treba izdvojiti nekoliko razina koje kao da su naslagane
jedna na drugu. Na samom dnu je svakako jezgra koja sadrzi drivere4 od kojih su
najvazniji driver za meduprocesnu komunikaciju IPC (engl. Inter-process communi-
cation) koji sluzi za izmjenu podataka izmedu razlicitih procesa ili niti (engl. thread)
4engl. driver – tehnicka podrska za fizicki dio racunala engl. hardware
11
unutar istog procesa te driver za upravljanje napajanjem (engl. Power Managment).
Iznad jezgre nalaze se knjiznice pisane u C/C++ programskom jeziku:
• Surface Manager – nadzire iscrtavanje grafickog sucelja
• OpenGL|ES – knjiznica za sklopovsko ubrzavanje 3D prikaza (ukoliko je moguce)
te za visoko optimiziranu 3D softversku rasterizaciju5
• SGL – 2D knjiznica koristena za vecinu aplikacija
• Media Framework – knjiznica koja podrzava snimanje i reproduciranje pozna-
tih audio i video formata
• FreeType – knjiznica namijenjena iscrtavanju fontova
• SSL (Secure Sockets Layer) – knjiznica za sigurnosnu komunikaciju putem
interneta
• SQLite – knjiznica za upravljanje bazama podataka dostupna svim aplikaci-
jama
• WebKit – pokretac web preglednika
• libc – sistemska C knjiznica prilagodena za ugradbene sustave zasnovane na
Linux operativnom sustavu
Gotovo na istoj razini nalazi se knjiznica Android Runtime koja sluzi pokretanju
aplikacija. Izuzetno je vazna i sastoji se od dvije knjiznice esencijalne za rad An-
droida. Core Libraries predstavlja knjiznice koje sadrze vecinu jezgrenih knjiznica
programskog jezika Java. Dalvik Virtual Machine pokrece aplikacije kao zasebne
procese, odnosno kao instance virtualnog stroja. Ono sto je za Javu bila JVM
to je za Android DVM. DVM pretvara Java kodove u svoj format .dex s ciljem
optimiziranja utroska memorije. Iznad toga nalazi se Aplikacijski sloj (engl. Appli-
cation Framework) koji programerima uveliko olaksava pisanje aplikacija, dozvoljava
upotrebu svih API-ja (engl. Application Programming Interface) koji su koristeni
za bazne aplikacije. Ponajvise smo mozda zahvalni na mogucnosti upravljanjem
zivotnim ciklusom aplikacije, pozivima, prozorima, resursima i sl. Na samom vrhu
i gotovo jedino vidljivo za korisnika jesu aplikacije. Kako to sve zajedno izgleda
mozemo bolje predociti slikom 2, a o svemu vise pogledati u [14].
5Rasterizacija (skeniranje) je proces prevodenja kontinualnih opisa grafickih primitiva u dis-
kretne opise preko pixela. Niz pixela treba da bude sto blize idealnoj liniji.
12
Slika 2: Arhitektura operativnog sustava Android
Sad kad smo samo zagrebali po povrsini, pogledajmo ipak malo dataljnije kako
izgleda put nastanka jedne Android mobilne aplikacije. Svakako krecemo od Java
koda koji se odgovarajucim kompajlerom (prevoditeljem engl. compiler) tzv. javac
prevodi u Java klasu odnosno Java binarni kod. Ako se sad vratimo na pricu o pro-
gramiranju u Java programskom jeziku rekli bismo da je tu kraj, medutim to nije
slucaj s Androidom. Naime, Java binarni kod se dx konverterom prebacuje u .dex
datoteku (engl. Dalvik executable) sto je svakako povezano sa DVM, nakon cega se
odgovarajucim programima za sazimanje (engl. archiver) sprema u zavrsnu dato-
teku .apk (engl. Android Package). Bilo kojim programom za sazimanje moguce
je pregledati sadrzaj datoteke .apk, izmedu ostalog nalaze se mape s resursima po-
trebni aplikaciji te sama aplikacija, ali ne i Java kodovi. Pogledajte shemu nastanka
Android aplikacije, Slika 3 preuzetu s predavanja [4].
13
Slika 3: Shematski prikaz nastanka Android aplikacije
3.2 Android SDK
Prije nego sto se bacimo na programiranje potrebni su nam odgovarajuci programi
za to. Iako je Android otvorena platforma stvari nisu tako jednostavne za pocetnika.
Citav jedan mali niz programa i “alata” je potrebno instalirati kako bi sve ispravno
funkcioniralo.
Prvi korak prema razvoju bilo koje aplikacije je instaliranje integrirane razvojne
okline (engl. integrated development environment) skraceno IDE. Jednostavno receno
radi se o programu koji pruza neophodne alate jednom programeru za razvoj apli-
kacija. Kada je rijec o Androidu preporuceni IDE je Eclipse, koji se izmedu ostalog
moze koristiti i za programiranje u Javi, C, C++, Ada i dr. Eclipse IDE moguce je
preuzeti sa sljedece web stranice: http://www.eclipse.org/downloads/. Uobicajeni
izgled ovog programa mozete vidjeti na slici 4.
Sljedeci vazan program je svakako Android SDK (engl. software development
kit) niz alata, medu kojima je i alat za otklanjanje gresaka ostalih programa tzv.
debugger, a treba izdvojiti i emulator koji uveliko pomaze pri testiranju aplikacija.
Android SDK mozete preuzeti na sljedecoj web stranici:
http://developer.android.com/sdk/installing/index.html
nismo naglasili, svi programi i alati su besplatni.
Netko bi pomislio kako ima sve potrebne alate i da se moze prepustiti programi-
ranju, ali to ipak nije tako. ADT skracenica od (engl. Android Development Tools)
je skup programa zaduzenih za povezivanje Eclipse IDE i Android SDK, odnosno
Eclipse IDE i debugger.
14
Slika 4: Eclipse IDE
Pomocu ADT u mogucnosti smo kreirati nove Android aplikacije, kompajlirati
ih, debuggirati, spremati aplikaciju u .apk dokument, izradivati digitalni certifikat
kojim zapravo potpisujemo nasu aplikaciju. Instaliranje ADT se odvija kroz Eclipse
IDE, o samom postupku instaliranja pogledati nesto vise u [10] str. 7.
Ukoliko ste sve dobro do sada ispratili i instalirali, preostao je jos jedan korak,
izrada emulatora. Android virtualni uredaj AVD (engl. Android Virtual Devices)
pruza mogucnosti izrade nebrojeno razlicitih emulatora, koji ne samo da simuli-
raju vizualno jedan Android uredaj, nego su cak i njegove hardwareske sposobnosti
nametnute od strane racunala. Drugim rijecima osjeti se razlika izmedu odabira An-
droid uredaja s verzijom operativnog sustava 1.5 i primjerice verzijom 2.3.3. Sama
izrada emulatora je jednostavna, a odgovarajuci AVD Manager mozete potraziti u
sklopu Android SDK prethodno instaliranih programa. Za kraj ovog poglavlja na-
vedimo samo da smo sve aplikacije testirali na emulatoru s operativnim sustavom
2.3.3 i API razinom 10, velicina SD kartice je 512 MB, a graficki prikaz je QVGA6.
6QVGA engl. Quarter Video Graphics Array uobicajeni naziv za grafiku prisutnu na “rucnim”
uredajima, pametnim mobitelima, tabletima i sl.
15
3.3 Nije Hello World aplikacija
Nakon sto smo instalirali sve potrebne alate mozemo krenuti s programiranjem.
Kako i sam naslov ovog poglavlja nagovjestava, odlucili smo kako prva aplikacija nece
biti uobicajena u svijetu programiranja Hello World aplikacija. No, ipak nastojat
cemo prvu aplikaciju ne zakomplicirati previse. Nasa prva aplikacija zvat ce se
Pozadina, imat ce nekoliko gumbica kojima ce korisnik dodirom na njih mijenjati
boju pozadine ekrana.
Koliko god je sam postupak instaliranja potrebnih programa bio “cupav”, upo-
raba istih je znatno jednostavnija. Od cega krecemo? Eclipse IDE je jedini program
potreban za programiranje nase prve aplikacije. Ukoliko ste otvorili Eclipse izra-
dimo novi Android projekt: File → New → Project → Android Application
Project. Prelazimo na korak imenovanja aplikacije i definiranja verzije Android
operativnog sustava na kojem ce se moci aplikacija pokrenuti. Ukratko opisimo
postupak izrade projekta, pogledajte Sliku 5.
Slika 5: Android projekt
16
Application Name oznacava naziv aplikacije, Project Name oznacava naziv pro-
jekta i naglasimo kako naziv projekta mora biti jedinstven kao i sam naziv paketa
Package Name kojim je sve objedinjeno. Build SDK je verzija operativnog sus-
tava za koji izradujemo nasu aplikaciju, a Minimum Required SDK kako i samo ime
nagovjestava postavlja najmanju verziju operativnog sustava koji moze pokrenuti
ovu aplikaciju. Nekon ovoga (Next) mozemo vrlo jednostavno odabrati i uredivati
ikonicu kojom cemo pokretati nasu aplikaciju. U konacnici postavimo jos naziv
nase prve Java klase Activity Name, osnovnu XML datoteku koja predstavlja po-
zadinu Layout Name te naziv aplikacije Title koji se prikazuje prilikom pokretanja
aplikacije. Mi smo trazene postavke uredili na sljedeci nacin (vidi Slika 6).
Slika 6: Android projekt
Finish gumbic je jedini koji je preostao kako bismo izradili nas prvi Android
projekt. Ukoliko je sve proslo u redu s lijeve strane u Eclipse pojavit ce Vam
odjeljak Package Explorer gdje se nalazi projekt Pozadina.
17
Slika 7: Mape i organizacija projekta
Na slici 7 prikazana je organizacija
jednog projekta. Istaknimo neke mape
kljucne za razumjeti kako cijela stvar
funkcionira. Mapa src (engl. source)
sadrzi sve Java klase koje se tijekom
projekta izrade, gen (engl. Generated
Java Files) okuplja Java kodove gene-
rirane neovisno o nasem programiranju.
Mapa res (engl. resources) sadrzi pod-
mape sa slikama, XML datoteke kojima
se izraduje korisnicko sucelje (engl. user
interface). U nasem slucaju rijec je o
datoteci main.xml smjestenoj u mapi
layout, u slucaju vise razlicitih XML
datoteka kojima se kreira korisnicko
sucelje, sve one bit ce smjestene u mapi
layout. Istaknimo odmah i datoteku
strings.xml u sklopu mape values, radi
se o “pomocnoj” datoteci, u njoj se pri-
mjerice definiraju stringovi koji se is-
pisuju u aplikaciji (npr. natpis na ne-
kom gumbicu). Iako u ovom projektu
nije bilo potrebe za uredivanjem, nikako
ne smijemo preskociti datoteku Andro-
idManifest.xml. Rijec je o datoteci u
kojoj cemo kreirati razlicite dozvole za
nasu aplikaciju, primjerice dozvolu apli-
kaciji za spajanje na internet ili pak kako
projekt bude postajao kompleksan uno-
sit cemo razlicite Java klase, za sad na to
gledajmo kao na neku vrstu evidencije.
AndroidManifest.xml datoteka je vrlo vazna i za samo predstavljanje aplikacije, tako
sadrzi podatke Version code verziju aplikacije, svaka nova verzija se inkrementira za
jedan. Za razliku od toga Version name je proizvoljan string, mozemo zapoceti sa
1.0, nova verzija 1.1, jos novija 1.2, a onda opet novu verziju samo prebaciti na 2.0.
Eclipse IDE je od velike pomoci prilikom uredivanja ovih postavki, nudi i graficku
manipulaciju, a svakako i tekstualno uredivanje XML datoteke. Kao sto smo vidjeli,
ovo je tipicna hijerarhija jednog Android projekta. Nakon sto izradimo korisnicko
sucelje, Java kod Pozadina koja je jedina klasa u ovom projektu ima implementirane
metode kojima prikazuje i manipulira proslijedenim korisnickim suceljem.
Pogledajmo kako izgleda main.xml datoteka kojom smo zapravo kreirali ko-
18
risnicko sucelje. Ona sadrzi cetiri gumbica, svaki gumbic ima jedinstveni id iden-
tifikacijski string, koji je zapravo pohranjen u obliku broja, ali u samostalno gene-
riranom Java dokumentu smjestenom u mapi gen. O samoj strukturi korisnickog
sucelja govorit cemo kasnije kada se budemo vise bavili izradom korisnickog sucelja.
main.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/izgled"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<Button
android:id="@+id/btnPlava"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Plava" />
.
.
.
</LinearLayout>
Kako se ne bi ponavljali, kod za ostale gumbice (engl. Button) je isti, osim
atributa id i text, koji su u nasem slucaju odnose jos na crvenu, zelenu i zutu boju.
Ukoliko sada samo pogledate Java kod Pozadina, ono sto treba istaknuti je sljedeci
dio koda:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Taj dio koda odnosi se upravo na prikaz korisnickog sucelja main.xml. U nastavku
cemo opisati sto smo implementirali u samu klasu, a potom cemo dati cijeli kod.
Prije svega imamo metodu OnClickListener koja je glavna metoda ove aplikacije i
u njoj na temelju odabira gumbica izvrsavat ce se promjena boje pozadine. Switch
case smo koristili za kontrolu izbora gumbica i to na temelju proslijedenih vrijednosti
identifikacijskih brojeva id. Neka Vas ne zamara organizacija paketa koje je potrebno
uvesti (engl. import) u klasu, Eclipse i tu priskace u pomoc: Source → Organize
Imports ili kraticama na tipkovnici Ctrl + Shift + O.
19
Pozadina.java
package com.example.pozadina;
import android.app.Activity;
public class Pozadina extends Activity implements OnClickListener{
Button btnPlava, btnCrvena, btnZelena, btnZuta;
LinearLayout izgled;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnPlava = (Button) findViewById(R.id.btnPlava);
btnCrvena = (Button) findViewById(R.id.btnCrvena);
btnZelena = (Button) findViewById(R.id.btnZelena);
btnZuta = (Button) findViewById(R.id.btnZuta);
izgled = (LinearLayout) findViewById(R.id.izgled);
btnPlava.setOnClickListener(this);
btnCrvena.setOnClickListener(this);
btnZelena.setOnClickListener(this);
btnZuta.setOnClickListener(this);
}
public void onClick(View v) {
switch(v.getId()){
case R.id.btnCrvena:
izgled.setBackgroundColor(Color.RED);
break;
case R.id.btnPlava:
izgled.setBackgroundColor(Color.BLUE);
break;
case R.id.btnZelena:
izgled.setBackgroundColor(Color.GREEN);
break;
case R.id.btnZuta:
izgled.setBackgroundColor(Color.YELLOW);
break;
}
}
}
20
Prostalo je jos samo kompajlirati i pokrenuti nasu prvu aplikaciju, u Eclipse po-
trazite: Run → Run ili jednostavnije Ctrl + F11.
Slika 8: Izgled pri pokretanju aplikacije
Slika 9: Odabrali smo zelenu pozadinu
21
3.4 Od pocetka do kraja jedne aktivnosti
Aktivnost (engl. Activity) fundamentalan je pojam kada govorimo o Android aplika-
cijama. Aktivnost predstavlja sve ono sto se pojavi na ekranu, ali u danom trenutku.
Dakle, ukoliko napravimo dodir i dode do promjene na ekranu, to je vec druga ak-
tivnost. To i nije u potpunosti istina uzmu li se u obzir dijaloski okviri koji su
dio dane aktivnosti. Svaka druga aktivnost odgovor je na neki poziv Java klase i
metoda koje ta klasa u sebi sadrzi. E sad stvar postaje malo komplicirana, ukoliko
prelazite iz jedne aktivnosti u drugu dobro je voditi racuna sto uciniti s prethodnom
aktivnosti. Upravo to pitanje vodi nas do pojma zivotnog ciklusa jedne aktivnosti7.
Svaka aktivnost u aplikaciji moze biti proslijedena nekom od sljedecih dogadaja:
• onCreate – inicijalizacija aktivnosti
• onStart – aktivnost je u “prvom planu”, odnosno vidljiva korisniku
• onRestart – aktivnost mijenja stanje iz zaustavljenog u radno
• onPause – radno stanje aktivnosti je pauzirano
• onResume – iz pauziranog stanja aktivnost prelazi u radno
• onStop – aktivnost je zaustavljena i nije vidljiva korisniku
• onDestroy – aktivnost je u potpunosti zaustavljena
Na temelju ovih dogadaja moze se razmatrati zivotni ciklus aktivnosti, odnostno
pocetak i kraj same aplikacije. Detaljan pregled mozete vidjeti na slici 10 ili potraziti
vise u [10] na str. 29.
Prisjetite se malo kako je organiziran projekt i koje sve mape sadrzi. Naime,
novu aktivnost moguce je kreirati u sljedecih nekoliko koraka:
1. Desni klik na paket u mapi src → New → Class
2. Desni klik na mapu layout → New → File
3. Dodati novi <activity> element u AndroidManifest.xml cime cemo evidenti-
rati novu aktivnost u nasoj aplikaciji.
7U engleskom jeziku ovaj pojam popularno se naziva Activity Lifecycle.
22
Slika 10: Zivotni ciklus aplikacije – Activity Lifecycle
3.5 Korisnicko sucelje
Korisnicko sucelje (engl. User Interface UI) je jedini element aplikacije vidljiv koris-
niku i pomocu njega korisnik ostvaruje interakciju sa samom aplikacijom. Android
nudi razne unaprijed kreirane UI komponente koje omogucuju laku izradu graficko
korisnickog sucelja za aplikaciju.
Svi elementi korisnickog sucelja u Android aplikaciji izradeni su pomocu View
i ViewGroup objekata (engl. View – pogled, glediste, stajaliste, vidik). View je
objekt prikazan na ekranu koji omogucava interakciju. ViewGroup je takoder objekt
koji sadrzi druge objekte View i ViewGroup kako bi se pravilno definirao izgled
korisnickog sucelja.
Najjednostavniji i najefektivniji nacin da se izradi korisnicko sucelje je s XML
datotekom. Naime, korisnicko sucelje moguce je izraditi na dva nacina: pomocu
23
XML datoteke ili programiranjem unutar Java klase. Zanimljivo je kako je ime
XML elementa preuzeto i jednako se koristi i unutar Java klase. Tako primje-
rice <TextView> element kreira TextView dodatak unutar naseg korisnickog
sucelja koji je zasluzan za prikaz teksta na ekranu. Nesto kompleksniji element je
<LinearLayout> koji kreira ViewGroup, odnosno vizualnu strukturu cjelokupnog
korisnickog sucelja.
Prednost izrade korisnickog sucelja pomocu XML datoteke je u mogucnosti odva-
janja prikaza korisnickog sucelja od samog Java koda. Jednostavno receno korisnicko
sucelje se nalazi izvan aplikacijskog koda, mozete ga mijenjati, uredivati, bez da se
mijenja izvorni kod aplikacije ili da se sama aplikacija rekompajlira. Ovo je zgodno
iskoristiti prilikom izrade razlicitih korisnickih sucelja cija se razlika temelji na raz-
likama u velicini ekrana samih uredaja za koje je aplikacija namijenjena.
Svaka datoteka s kojom se definira vizualni raspored (engl. Layout), odnosno
izgled, mora sadrzavati jedan korijenski element (engl. root element) koji cini View
ili ViewGroup. Najcesci vizualni rasporedi kojima se definira razpored objekata
su sljedeci: LinearLayout, RelativeLayout, ListView, FrameView, GridView, Table-
Layout i dr. Prilikom izrade korijenskog elementa definira se i XML shema koja ima
svoju strogu “Androidsku” konvenciju:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
Svaki View i ViewGroup objekt podrzava svoju paletu XML atributa. Tim
atributima definira se velicina teksta, boja pozadine, orijentacija, pozicija i sl. Svi
objekti mogu imati jedinstveni broj id kojima je omoguceno upravljanje tim objek-
tima. Ovaj atribut prilikom izrade korisnickog sucelja uzima se kao string, ali na-
kon kompajliranja aplikacije on je pohranjen kao cijeli broj. Primjerice, ukoliko
zelimo gumbicu za zatvaranje aplikacije dodijeliti jedinstveni id to mozemo uciniti
na sljedeci nacin:
android:id="@+id/buttonZatvori"
XML layout atributi obicno su deklarirani layout nesto i dva najcesca atri-
buta odnose se na sirinu i visinu objekta (layout width i layout height). Moramo
naglasiti kako definirati visinu i sirinu apsolutnim jedinicama kao sto je pixel nije
preporucljivo, prosto iz razloga u razlikama velicine ekrana. Puno je bolje koristiti
relativne mjere kao sto je density-independent pixel (dp), za velicinu teksta scaled
pixel (sp). U praksi, najcesce se atributima za sirinu i visinu pridruzuju sljedeci
izrazi:
• wrap content – velicina objekta, sirina ili visina, bit ce odredena velicinom
sadrzaja (tekstom) koji ispunjava taj objekt
• fill parent (preimenovano u match parent u API razine 8) – velicina objekta
je velika koliko je velik roditeljski element, a u slucaju korijenskog elementa,
velicina odgovara cijeloj visini ili sirini ekrana uredaja.
24
Prisjetite se kako smo u prethodnom poglavlju pokazali izradu aktivnosti u tri
koraka. Na sljedecem jednostavnom primjeru pogledajmo kako je napravljeno jedno
korisnicko sucelje kojim se prikazuje tekst i gumbic.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ukoliko vidite ovaj tekst na emulatoru?! :) " />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nas prvi gumbic!!!!! " />
</LinearLayout>
Na emulatoru biste trebali dobiti korisnicko sucelje slicno (ovisno o verziji emulatora)
kao na slici 11:
Slika 11: Prvo jednostavno korisnicko sucelje
25
Primjetite kako je orijentacija vertikalna android:orientation=”vertical” pa
su gradivni elementi poslagani linearno jedan ispod drugog. U slucaju da je orijen-
tacija horizontalna elementi bi bili poslagani s lijeva na desno. Rekli smo kako je
korisnicko sucelje XML datotekom odvojeno od aplikacijskog koda, no ipak moramo
reci i kako se u Java klasi poziva XML datoteka. Metodi setContentView() unutar
aktivnosti proslijedi se odgovarajuci resurs naseg XML dokumenta. Resurs je oblika
R.layout.naziv xml datoteke , prikaz korisnickog sucelja iz proslog primjera gdje
je XML dokument bio prviui.xml implementiran je na sljedeci nacin:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.prviui);
}
U nekoliko navrata smo govorili o View i ViewGroup objektima, krajnje je vri-
jeme i da kazemo kako se pravi instanca ovih klasa u Java kodu. Takoder smo
naglasili jednakost u nazivima XML elemenata kod XML datoteke i Java klase, kao
i nacin na koji cemo manipulirati pojedinim objektima. Ovo je trenutak kada se
na objekt pozivamo pomocu njegovog jedinstvenog id-a. Zapravo, metodi findVi-
ewById() proslijedujemo id zeljenog objekta. Ukoliko za gumbic iz prethodnog
primjera zelimo napraviti instancu u Java klasi PrviUI.java, dovoljno je u sklopu
metode onCreate() deklarirati objekt Button:
Button prviGumbic = (Button) findViewById(R.id.button);
Primjetite i kako smo napravili kastanje, jer metoda findViewById() prilagodena
je za sve vrste View objekta, a u nasem slucaju konkretno treba nam objekt klase
Button. U nastavku je moguce praviti pozive na ovaj gumbic, vrlo cesto moze se
vidjeti nesto ovako:
prviGumbic.setOnClickListener(this);
sto bi znacilo da se prilikom dodira gumbica poziva metoda onClick(). (Mozete
se vratiti na kod iz nase prve aplikacije i pogledati kako je implementirana metoda
onClick()).
Eclipse nudi siroku paletu standardnih vizalnih elemenata koji krase korisnicko
sucelje, kao sto su: TextView, Button, ChackBox, RadioButton, Spinner, Progres-
sBar i dr. Mnogi elementi mogu se implementirati tekstualno u XML datoteci, ali
mnoge je znatno lakse graficki pozicionirati. Naime, Eclipse nudi mogucnost auto-
matskog prikazivanja izrade korisnickog sucelja i mogucnost grafickog uredivanja,
koje se manifestira promjenama u XML datoteci. Za izradu korisnickog sucelja pri-
sjetimo se koliko su vazni resursi, odnosno izvori s zeljenim datotekama. Pogledajte
jos jednom kako je izgledala organizacija projekta Slika 7. Mapa res sadrzi podmape
drawable, layout, values i druge, a svaka od tih podmapa ima specificnu ulogu
26
prilikom izrade korisnickog sucelja. Tako su u mapi drawable smjestene slike koje
su optimizirane za prikaz u sklopu korisnickog sucelja, mapa layout kako smo u
vise navrata spomenuli sadrzi XML datoteke kojima su kreirane aktivnosti, a mapa
values sadrzi kompajlirane XML datoteke u razlicite resurse.
Prilikom izrade korisnickog sucelja treba voditi racuna i o sadrzaju koji nije una-
prijed odreden, odnosno sadrzaju cija je izmjena dinamicna. To moze biti sadrzaj
cije su promjene zasnovane na parsiranju (engl. parsing), prosljedivanju sadrzaja s
interneta ili primjerice ucitavanje slika s nekih drugih resursa. Upravo takav slucaj
bilo je potrebno implementirati u nasu aplikaciju za pracenje promjena na strani-
cama Odjela za matematiku, sto cete vidjeti u sljedecem poglavlju. Klasa Adap-
terView izradena je u svrhu upravljanja dinamickim sadrzajem, njezina podklasa
Adapter koristi se za vezivanje podataka na odgovarajuce mjesto u korisnickom
sucelju. Podklasa Adapter ima ulogu posrednika izmedu izvora podataka i klase
AdapterView koja se pak brine o samom prikazu tih podataka.
Medu vizualnim elementima koje smo prethodno spomenuli nasli su se i ListView
i GridView, njih sad izdvajamo iz razloga sto se s njihovim sadrzajima najcesce
upravlja preko Adaptera. ListView prikazuje sadrzaj stupcasto i ima mogucnost
pomicanja sadrzaja gore–dolje (engl. scroll), sto je kod opseznijih ispisa vrlo korisno.
GridView slicno kao i ListView prikazuje mrezu podataka (retci i stupci) i koristi se
primjerice za prikaz vise manjih slicica na jednom ekranu te takoder ima mogucnost
pomicanja gore–dolje.
Ukoliko imamo listu ciji sadrzaj dinamicki mijenjamo, sadrzaj mozemo dodavati
u listu u obliku mapa (vidjet cemo kako smo to radili s Hash mapama za nasu
aplikaciju), zatim pomocu klase ListAdapter uzimamo podatke i spajamo s izlazom,
tj. korisnickim suceljem. ListAdapter izradili smo pomocu konstruktora, kako je vec
predvideno:
public SimpleAdapter (Context context, List<? extends Map<String, ?>>
data, int resource, String[] from, int[] to)
Parametri konstruktora:
• context – pokazuje iz kojeg konteksta je povezana lista sa adapterom
• data – sadrzaj liste, tj. lista mapa, sadrzi podatke za svaki redak u ispisu
• resources – identificirati XML datoteku zaduzenu za prikaz ispisa.
• from – Vrijednosti pohranjene u stringovima.
• to – Ispis vrijednosti iz stringova, povezane sa id elemenata za ispis.
Na kraju jednostavnom metodom postavljamo ispis adaptera:
setListAdapter(ListAdapter)
27
3.6 Intents
Android aplikacija moze sadrzavati vise aktivnosti i upravo u ovom poglavlju go-
vorimo o tome kako pravilno upravljati, pozivati iz jedne aktivnosti neku drugu.
U Androidu pozivanje aktivnosti ostvaruje se namjerom. Intents (engl. namjera)
predstavlja jedan apstraktni okidac kojim se vrsi poziv aktivnosti uz niz drugih
mogucnosti.
Napomenimo i to kako Android aplikacija moze biti koncipirana na tri nacina;
kao aktivnost, kao servis (radi u pozadini) i kao svojevrsni prijemnik. Bilo kako da
je nasa aplikacija zamisljena, realizacija njezinih radnji odvijat ce se s namjerama.
Upravo preko intenta mi cemo pozivati novu aktivnost startActivity(Intent) ili
pokretati servis startService(Intent) ili za pozadinsku komunikaciju sa servisom
koristiti bindService(Intent, ServiceConnection, int).
Pokazimo na jednom jednostavnom primjeru s predavanja kako se namjerom po-
ziva aktivnost. Projekt s predavanja u paketu jedinstvenog imena
net.cs76.lectures.intents06 sadrzi dvije aktivnosti ili dva XML dokumenta main.xml
i thumbsup.xml s pripadnim Java klasama Code6.java i ThumbsUp.java.
package net.cs76.lectures.intents06;
import net.cs76.lectures.intents06.R;
public class Code6 extends Activity implements OnClickListener{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button yes = (Button)findViewById(R.id.yes);
Button no = (Button)findViewById(R.id.no);
yes.setOnClickListener(this);
no.setOnClickListener(this);
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.yes:
Intent i = new Intent(this, ThumbsUp.class);
startActivity(i);
finish();
break;
case R.id.no:
default:
finish();
}
}
28
}
Dio koji cemo izdvojiti iz koda odnosi se naravno na namjeru:
Intent i = new Intent(this, ThumbsUp.class);
startActivity(i);
Kao sto vidimo, najprije smo napravili objekt Intent pomocu konstruktora, primje-
tite kako se konstruktor sastoji iz dva dijela this odnosi se na klasu iz koje se poziva
nova aktivnost (mogli smo staviti i Code6.class), a ThumbsUp.class naziv je
klase, tj. aktivnosti koja se poziva. Metoda startActivity(i) pokrece izmjene u
aplikaciji.
Pogledajmo i kako izgleda klasa ThumbsUp.class:
public class ThumbsUp extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.thumbsup);
Button ok = (Button)findViewById(R.id.OK);
ok.setOnClickListener(this);
}
public void onClick(View v) {
finish();
}
}
Slika 12: Pozivanje aktivnosti pomocu Intenta
29
Lako se uoci kako u klasi ThumbsUp.class nema slicice, no ona se zapravo
poziva u XML datoteci, pravi primjer odvojenog korisnickog sucelja od aplikacijskog
koda. No isto tako napomenimo da se na slicicu samo referenciramo u XML datoteci,
naime slicica se nalazi u mapi drawable.
Vidjeli smo kako se pomocu namjere pokrece nova aktivnost, zelimo jos napo-
menuti kako se nerijetko zna dogoditi da se zaboravi nova aktivnost evidentirati
u AndroidManifest.xml datoteci. Bez evidencije nove aktivnosti, stvar nikako
nece raditi, a sto je najgore kompajler se nece buniti. Dovoljno je dodati unutar
elementa <application> element <activity>. Navedimo i za prethodni primjer
kako je izradena evidencija:
<activity android:name="net.cs76.lectures.intents06.ThumbsUp"></activity>
Atribut android:name elementa <activity> zahtjeva ime klase koja ce se pozivati,
nesto kraci zapis bio bi samo:
<activity android:name=".ThumbsUp"></activity>
cemu se jos mogu dodati razni atributi, primjerice android:label kojim se izraduje
naslov aktivnosti.
Prilikom promjene aktivnosti nerijetko se pomocu namjera prenose odredeni po-
daci u novu aktivnost. I taj slucaj vidjet cemo kako je raliziran u nasoj aplikaciji, za
sada samo opisimo kojim metodama se vrsi prijenos podataka. Najprije se objektu
namjere Intent u obliku stringa spremaju podaci:
Intent.putExtra(String name, String)
Intent sada prenosi podatke u novu aktivnost u sklopu koje se izvade podaci i dodijele
nekom stringu:
Intent.getStringExtra(String name)
Intent je vrlo mocan apstraktan objekt, na jedan intuitivan nacin povezuje niz ak-
tivnosti unutar aplikacije, cak povezuje i aktivnosti koje su izvan nase aplikacije.
Primjerice, odgovarajucim metodama moguce je iz nase aktivnosti pokrenuti inter-
net preglednik. Za te metode mozemo reci kao da dolaze u paru:
• action – akcija koja ce se izvrsiti, npr. ACTION VIEW, ACTION DIAL, . . .
• data – podaci s kojima Intent upravlja.
Pogledajmo jednostavan primjer Intent objekta koji je zaduzen za pozivanje internet
preglednika i otvaranje internet stranice Odjela za matematiku:
Intent preglednik = new Intent();
preglednik.setAction(Intent.ACTION_VIEW);
preglednik.setData(Uri.parse("http://www.mathos.unios.hr/"));
startActivity(preglednik);
30
Do sada smo obradili samo dijelove nuzne za izradu nase aplikacije i koji se go-
tovo uvijek javljaju u nekim drugim aplikacijama. Za vise informacija, svakako
preporucujemo pogledati stranicu (vidi [15]) namijenjenu programerima s detaljnim
popisom metoda i njihovim objasnjenjima.
S pricom o namjerama bismo zatvorili ovo poglavlje. Budite svjesni da smo se
samo na kratko dotakli osnovnih stvari koje ce nam biti neophodne u daljnjem radu.
Svaka aplikacija zahtjeva svoj tlocrt prije nego uopce i prijedete na programiranje.
Potrebno je zapitati se sto zelimo od nase aplikacije, a zatim u potrazi na odgovor
kako zelim – zaista to i uciniti. Nezaobilazna referenca je svakako stranica namije-
njena programerima za Android operativni sustav. Stranica broji mnostvo poucnih
primjera te svakako sadrzi klase s opisanim metodama koje su u njima implemen-
tirane i koje su programerima na raspolaganju. Korisno je najprije upoznati se s
klasom jer se u njoj upravo krije mnostvo metoda za koje nije potrebno dodatno
razbijati glavu i smisljati neke nove metode. I za kraj, stranice koje ne zelite zaobici:
• http://developer.android.com/develop/index.html
• http://developer.android.com/training/index.html
• http://developer.android.com/reference/packages.html
31
4 Pracenje obavijesti Odjela za matematiku
Korak po korak dosli smo i do nase aplikacije koja objedinjuje dosadasnje znanje na
jednoj visoj razini. Prije same izrade aplikacije vodeni smo idejom napraviti aplika-
ciju koja moze biti od koristi studentima i profesorima Odjela za matematiku. Jedna
od takvih ideja koju smo nastojali realizirati u nasem radu svodila se na brzu pris-
tupacnost nekim osnovnim obavijestima. Tako smo se odlucili pratiti obavijesti ve-
zane za Matematicki kolokvij i Seminar za optimizaciju i primjene. Obavijesti vezane
uz ova predavanja namijenjene su svim znanstveno-nastavnim djelatnicima, studen-
tima Sveucilista u Osijeku i mnogim drugima koji se u tome pronalaze. Takoder
smo pratili obavijesti s Odjela (Obavijesti iz referade), zatim obavijesti vezane za
kolokvije i ispite s ciljem uciniti ove obavijesti studentima znatno pristupacnijim.
Sad je vec sasvim izvjesno kako nasa aplikacija zahtjeva pristup internetu, od-
nosno obavijestima na internet stranicama Odjela za matematiku. Sigurno vec
naslucujete kako se u pozadini cijele price krije prosljedivanje podataka, popular-
nije nazvano parsiranje (engl. parsing). Na “prvu loptu” pomislili bismo kako se
radi u parsiranju HTML datoteka s cim treba biti jako oprezan kad je Android u
pitanju, jer Android zahtjeva cistu sintaksu datoteke s podacima koji se parsiraju.
Moramo priznati kako se u igri prvo nasao XML, no nakon istrazivanja i usporedbi
glavna uloga pripala je JSON-u (engl. JavaScript Object Notation). Na sva pi-
tanja o JSON-u vezana uz nasu aplikaciju, pokusat cemo odogovoriti u sljedecem
potpoglavlju.
4.1 JSON
JSON (engl. JavaScript Object Notation) predstavlja format za razmjenu podataka.
Format je tekstualnog oblika, razumljiv ljudima, a uredajima lak za parsiranje i
uredivanje. Iz samog imena zakljucujete da se temelji na podskupu JavaScript
programskog jezika. JSON je potpuno neovisan o programskom jezik, ali koristi
konvencije koje su poznate ljubiteljima C jezika, ukljucujuci C, C++, C#, Java,
JavaScript, Perl, Python i mnoge druge.
JSON je izgraden na dvije strukture:
• Kao skup parova oblika ime/vrijednost. U razlicitim programskim jezicim to
se realizira kao objekt, rekord, struktura, hash tablica, asocijativno polje i sl.
• Uredena lista vrijednosti. Ovo se pak realizira kao polje, vektor, popis i sl.
Ova univerzalna struktura podataka podrzana je i od strane Androida, izdvojimo
odmah klase koje su podrzane JSONArray, JSONObject, JSONStringer, JSONToke-
ner. Ipak, prije nego prijedemo govoriti kako smo parsirali JSON na nasu aplikaciju,
pokazimo jos kakav sve zapis podrzava JSON.
32
JSON objekt je neureden skup parova ime/vrijednost. Sintaksa je jednostavna,
parovi su umetnuti medu viticaste zagrade { , }, ime je od vrijednosti odvojeno
dvotockom : , a parovi su odvojeni zarezom , . Vidite shemu na Slici 13
Slika 13: JSON objekt
JSON niz je uredeni skup vrijednosti. Vrijednosti se nalaze unutar uglatih za-
grada [ , ], a razdvojene su zarezom , . Vidite shemu na Slici 14
Slika 14: JSON niz
Vrijednosti mogu biti:
• string – tekst, ogranicen dvostrukim navodnicima ”
• number – broj, moze biti cjelobrojni, realni, decimalni; podrzano oznacavanje
eksponenata e, e+, e−, E, E+, E−
• object – misli se na JSON objekt
• array – misli se na JSON niz
• boolean – true ili false logicke vrijednosti
• null – nedefinirana vrijednost
Kako vidimo struktura podrzava ugnjezdivanje. Slike su preuzete sa sluzbene stra-
nice i za vise detalja pogledajte [17].
Mi smo odabrali primjer JSON-a koji sadrzi obavijesti o kolokvijima, uocite
kako se radi o JSON objektu, imenu kolokvij pridruzili smo JSON niz. U JSON
nizu vrijednosti su JSON objekti (ugnjezdivanje), a parovi su: predmet, obavijest,
link.
33
kolokvij.json
{
"kolokvij": [
{
"predmet": "Linearna algebra I",
"obavijest": "U srijedu 31. listopada 2012. pise se prvi kolokvij.",
"link": ""
},
{
"predmet": "Numericka matematika",
"obavijest": "Postavljeni su rezultati kolokvija.",
"link": "http://www.mathos.unios.hr/nm/obavijesti.html"
}
]
}
Primjetite i kako smo kod prve obavijesti ostavili vrijednost za link prazan string, sto
ce u aplikaciji biti provjereno te ukoliko postoji poveznica na stranicu s rezultatima,
tada ce to polje u listi biti osjetljivo na dodir i moci ce pokrenuti preglednik kako
bi se prikazala referencirana stranica.
Ostale JSON datoteke koje su koristene u aplikaciji mozete pronaci na sljedecoj
adresi http://www.mathos.unios.hr/∼vdjurack/android/. Kako je parsiranje poda-
taka kljucno za nasu aplikaciju u nastavku donosimo JSONParser klasu.
4.2 JSONParser
Sto klasa JSONParser cini opisuje jedna jedina njezina metoda getJSONFromUrl(String).
Metoda pravi HTTP zahtjev, od posluzitelja (engl. server) dobiva JSON podatke
i u konacnici vraca JSON objekt. Opravdano je praviti posebno klasu za parsira-
nje podataka, prvenstveno se tako izbjegla redundantnost jer vecina ostalih Java
datoteka zahtjeva JSON objekt s kojim ce da radi.
Na samom pocetku definirali smo “varijable” i konstruktor:
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
public JSONParser() {
}
34
Metoda getJSONFromUrl(String url) najprije pravi HTTP zahtjev i to POST me-
todom kojoj se predaje adresa JSON datoteke u obliku stringa.
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
Vidimo da se sadrzaj nalazi u objektu is koji je zapravo InputStream, predstoji nam
dani sadrzaj iz bitovnog zapisa prebaciti ili konvertirati u niz znakova.
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "cp-1250"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
Primjetite da smo za konvertitanje znakova koristili klasu InputStreamReader i
pri tome naveli dekodiranje znakova prema konvencij cp-12508. Preostalo je jos
samo JSON string s pripadnim parovima ime/vrijednost predati konstruktoru JSON
objekta koji ce ova metoda na kraju vratiti.
jObj = new JSONObject(json);
Napomenimo samo kako smo klasu JSONParser i njezinu metodu getJSONFro-
mUrl() opisali istaknuvsi kljucne elemente, a dijelove koda koji su zaduzeni za evi-
denciju gresaka prilikom slanja HTTP zahtjeva, konvertiranja i parsiranja JSON
stringa u JSON objekt nismo posebno istaknuli. Sve o HTTP zahtjevu mozete po-
traziti u [11]. Spomenuli smo kako Android podrzava JSON format podataka, o tome
nesto vise pogledajte na Android sluzbenim stranicama [16], izuzetno kvalitenti su
i tutorijali koje mozete potraziti na stranicama http://www.androidhive.info/
vezanim za izradu HTTP zahtjeva, parsiranje JSON podataka i mnostvo drugih.
8cp-1250 ili windows-1250 kodiranje namijenjeno je za reprezentaciju teksta jezika centralne i
istocne Europe, na taj nacin uspjesno smo parsirali i dijakriticke znakove
35
4.3 MathosMonitoring
MathosMonitoring naziv je projekta nase aplikacije namijenjene za pracenje (engl.
monitoring) obavijesti Odjela za matematiku. Korisnicko sucelje temelji se na
nekoliko XML datoteka: main.xml, main lista.xml, main pojedinacno.xml, obavi-
jesti lista.xml, kolokviji lista.xml, ispiti lista.xml. Datoteka od koje smo krenuli s
prikazom korisnickog sucelja je main.xml.
Kako smo htjeli korisnicko sucelje uciniti jednostavnim i ne zatrpati ga mnostvom
gumbica, odlucili smo se za padajuci izbornik, a View objekt kojim smo to ucinili
je spinner. Spinner cini padajuci izbornik, odnosno listu elemenata dobivenih iz
stringa pomocu adaptera, o tome nesto vise uskoro kada budemo gledali Java dato-
teke. Kada smo govorili o korisnickom sucelju spomenuli smo upravo adapter koji
ima ulogu posrednika u prenosenju i prikazivanju podataka s dinamickim promje-
nama.
Sama struktura glavnog korisnickog sucelja, odnosno main.xml datoteke je ug-
nijezdena i mozemo ju prikazati Slikom 15: Naime, u prvom redu imamo verti-
Slika 15: Struktura korisnickog sucelja
kalno pozicioniranje elemenata, a drugom klasom LinearLayouta padajuci izbornik
i gumbic za izlazak iz aplikacije smo postavili horizontalno, a zatim dolazi lista.Kako
to sve zajedno izgleda mozemo vidjeti na sljedecoj slici:
Slika 16: Korisnicko sucelje aplikacije MathosMonitoring
36
Dodirom na sadrzaj liste otvara se nova aktivnost kojoj su preneseni podaci i
ispis je nesto detaljniji. Na isti nacin uraden je prikaz informacija vezanih za Seminar
Slika 17: Matematicki kolokvij
za optimizaciju i primjene. Istaknimo kako dodirom na spinner u prvi plan dolazi
lista s mogucim odabirima, a aktivnosti iz pozadine postaju “nedodirljive”. Odabir
elementa iz spinnera je jedinstven, nije moguce odabrati istovremeno dva elementa,
to mozete vidjeti na slici 18:
Slika 18: Odabir elementa iz spinnera
Iako smo vec opisali samu izradu korisnickog sucelja i opisali strukturu ko-
risnickog sucelja za nasu aplikaciju, XML kod je sljedeci:
37
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/back"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.9" />
<Button
android:id="@+id/btnIzlaz"
style="buttonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.1"
android:text="@string/izlaz" />
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="#ffffff"
android:padding="10dp" />
</LinearLayout>
38
U nastavku najprije dajmo odgovor na pitanje: Kako napraviti spinner s elemen-
tima za odabir? U odgovarajuci Java kod kreiramo String s zeljenim elementima:
String[] odabir = {"Matematicki kolokvij", "Seminar za opt. i primjene",
"Obavijesti iz referade", "Kolokviji", "Ispiti"};
Kako se radi o spinneru odabir elemenata nije podrzan metodom OnClick vec OnI-
temSelected, pogledajmo i kako izgleda implementacija spinnera, odnosno adaptera:
Spinner popis = (Spinner) findViewById(R.id.spinner1);
popis.setOnItemSelectedListener(this);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, odabir);
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);
popis.setAdapter(adapter);
Metodom setDropDownViewResource definirali smo izgled padajuceg izbornika. Kako
ne bismo izgubili nit vodilju odmah opisimo i implementaciju metode OnItemSelec-
ted. Naime, metoda sadrzi cjelobrojni podatak o poziciji svakog elementa u listi i
upravo pomocu njega izvrsena je manipulacija odabira nove aktivnosti. Numeriranje
elemenata Stringa zapocinje s 0, kao i u vecina drugih programskih jezika.
public void onItemSelected(AdapterView<?> parent,View v,int pos,long id){
switch(pos){
case 1:
Intent i1 = new Intent(this, Seminari.class);
startActivity(i1);
finish();
break;
Ostali slucajevi su analogno realizirani. Ovdje bi jedino jos istaknuli metodu finish()
koja je zaduzena za zatvaranje trenutne aktivnosti prilikom prelaska na novu aktiv-
nost. Ovo je ucinjeno iz razloga da prilikom uporabe gumbica back za povratak na
prethodnu aktivnost aplikacija bude zatvorena.
U prethodnom poglavlju opisali smo princip rada JSON-a i parsera koji smo
koristili. Ovdje donosimo implementaciju relevantnih podataka u listu. Od cega
krenuti? Jasno je kako nam treba odgovarajuca lista:
ArrayList<HashMap<String,String>> matkolokvijList = new
ArrayList<HashMap<String,String>>();
Uocite da na ovaj nacin od liste matkolokvijList zahtjevamo da njezini elementi budu
objekti klase HashMap<String,String>.
39
Metoda getJSONFromUrl uzima odgovarajucu adresu gdje je pohranjen JSON
objekt i parsira JSON podatke. Pogledajmo i kako smo implementirali parsiranje
tih podataka:
String url = "http://www.mathos.unios.hr/~vdjurack/
android/matematickikolokvij.json";
JSONArray matkolokvij = null;
JSONParser parser = new JSONParser();
JSONObject object = parser.getJSONFromUrl(url);
try{
matkolokvij=object.getJSONArray("matkolokvij");
for(int i=0; i<matkolokvij.length(); i++){
JSONObject jo = matkolokvij.getJSONObject(i);
String datum = jo.getString("datum");
String autor = jo.getString("autor");
String ustanova = jo.getString("ustanova");
String naslov = jo.getString("naslov");
String sazetak = jo.getString("sazetak");
HashMap<String,String> map = new HashMap<String,String>();
map.put("datum", datum);
map.put("autor", autor);
map.put("ustanova", ustanova);
map.put("naslov", naslov);
map.put("sazetak", sazetak);
matkolokvijList.add(map);
}
} catch(JSONException e){
throw new RuntimeException(e);
}
Objektu matkolokvij pridruzili smo JSON niz koji se dobije parsiranje podataka
primjenom metode getJSONFromUrl. JSON niz u sebi sadrzi ugnijezdene JSON
objekte s parovima: datum, autor, ustanova, naslov i sazetak. Za svaki pojedinacni
JSON objekt jo podatke smo izvadili i spremili u odgovarajuce Stringove. Zatim
smo u objekt map primjenom metode put kao u neku vrstu mape pohranili dane
Stringove i odgovarajuce “kljuceve”. Upravo ti kljucevi iskoristeni su kod izrade
adaptera za ispis elemenata u listu. Princip rada je jednostavan, iz liste matko-
lokvijList se vade podaci (pohranjeni u obliku HashMap), pridruzuju se na izlazne
elemente definirane u datoteci main lista.xml. Vidimo da su svi elementi u toj dato-
40
teci zaduzeni za prikaz teksta: datum, autor, naslov, sazetak i ustanova. Java kod
kojim smo implementirali ovaj adapter je sljedeci:
ListAdapter adapter2 = new SimpleAdapter(this, matkolokvijList,
R.layout.main_lista, new String[] { "datum",
"autor", "naslov", "sazetak", "ustanova"},
new int[] {R.id.datum, R.id.autor, R.id.naslov,
R.id.sazetak,R.id.ustanova});
setListAdapter(adapter2);
Slika 19: Obavijesti za kolokvije
Svakako bi izdvojili i dio aplikacije
zaduzen za prikaz obavijesti vezanih za
kolokvije. S programerske strane za
ovaj dio aplikacije smo zamislili i da
nosi poveznice na stranice s rezultatima
ciji prikaz bi bio putem web pregled-
nika. Takoder ovaj dio sadrzi i obavi-
jesti o terminu odrzavanja iducih kolok-
vija. Manji problem predstavlja “filtri-
ranje” onih elemenata liste koji u sebi
ne sadrze poveznicu, jer nismo htjeli te
elemente liste napraviti osjetljive na do-
dir. Pogledajmo i dio koda koji se od-
nosi upravo na ovu realizaciju:
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View view,
int position, long id){
String link = ((TextView)
view.findViewById(R.id.link)).getText().toString();
if (link != null && !link.isEmpty() ){
Intent preglednik = new Intent();
preglednik.setAction(Intent.ACTION_VIEW);
preglednik.setData(Uri.parse(link));
startActivity(preglednik);
}
}
});
Necemo posebno izdvajati Java kod zaduzen za otvaranje nove aktivnosti i cjelo-
viti prikaz podataka. Radi se o obicnom intentu s proslijedenim podacima metodama
putExtra(String, String) i getStringExtra(String).
41
Umjesto zakljucka, htio bih istaknuti kako je programiranje aplikacija za Android
operativni sustav izuzetno zahtijevan, ali svakako ispunjujuci rad. Zahtijeva dobru
organizaciju i jos bolje poznavanje rada objektno orijentiranog programskog jezika.
S druge pak strane, mnostvo je literature i drugih sadrzaja iz kojih se moze lako
uciti. Ovaj diplomski rad temeljio se na predavanjima profesora s Harvarda Dana
Armendariza i Davida J. Malana. Predavanja su bila u video zapisu. U literaturi se
nalaze reference na dana predavanja.
Zahvalio bih se mentoru doc. dr. sc. Domagoju Matijevicu na ukazanom
povjerenju i pruzenoj mogucnosti pisanja i rada na ovoj temi, svim sugestijama i
uputama za ucenje.
42
Literatura
[1] cdn.cs76.net/2011/spring/lectures/2/lecture2.mp4
[2] http://cdn.cs76.net/2011/spring/lectures/2/lecture2-dan.pdf
[3] cdn.cs76.net/2011/spring/lectures/3/lecture3.mp4
[4] http://cdn.cs76.net/2011/spring/lectures/3/lecture3-dan.pdf
[5] cdn.cs76.net/2011/spring/lectures/4/lecture4.mp4
[6] http://cdn.cs76.net/2011/spring/lectures/4/lecture4-dan.pdf
[7] cdn.cs76.net/2011/spring/lectures/5/lecture5.mp4
[8] http://cdn.cs76.net/2011/spring/lectures/5/lecture5-dan.pdf
[9] J. SRIBAR, B. MOTIK, Demistificirani C++ (3. prosireno izdanje), Element,
Zagreb, 2010.
[10] W. Lee, Beginning Android Application Development, Wiley Publishing, Indi-
anapolis, 2011.
[11] J. F. Kurose, K. W. Ross, Computer Networking – A Top-Down Approach
Featuring the Internet, Addison-Wesley, Boston, 2000.
[12] http://www.bbc.co.uk/news/technology-17705873
[13] http://web.math.pmf.unizg.hr/nastava/rp2/nastava
[14] http://hr.wikipedia.org/wiki/Android (operacijski sustav)
[15] http://developer.android.com/reference/android/content/Intent.html
[16] http://developer.android.com/develop/index.html
[17] http://www.json.org/
43
Sazetak
Ovaj diplomski rad organiziran je u tri poglavlja izuzev uvodnoga. U poglavljima
Java programski jezik i Android bavili smo se osnovnim konceptima razvoja mobil-
nih aplikacija za mobitele s Android operativnim sustavom. Osnovna literatura ili
bolje receno okosnica cijelom radu bila su predavanja profesora s Harvarda Dana
Armendariza i Davida J. Malana. Predavanja su odrzana 2011. godine i dostupna
su na internet stranicama u obliku video zapisa.
Cetvrto poglavlje Pracenje obavijesti Odjela za matematiku predstavlja prakticni
dio ovoga rada. Naime, izradili smo aplikaciju koja parsira JSON podatke s inter-
neta i prikazuje na mobitelima obavijesti s Odjela za matematiku. Aplikacija je
simbolicnog imena MathosMonitoring i prati obavijesti vezane za odrzavanje Ma-
tematickih kolokvija, Seminara za optimizaciju i primjene, obavijesti iz referade,
obavijesti za studente vezane za kolokvije i ispite. U radu smo popratili osnovnu
ideju organiziranja podataka u JSON objekt i nacine parsiranja Java programskim
jezikom.
44
Summary
Except introducing chapter, this master’s thesis is organized in three chapters. In
chapters Java programming language and Android we dealt with the basic concepts
of development of mobile applications for mobile phones with Android operating
system. The main literatures, or better to say, framework of all of the work was
lectures of professors from Harvard, Dan Armendariz and David J. Malan. Lectures
are held in 2011 and they are available on internet sites in the form of video.
The fourth chapter, Following the news of the Department of Mathematics, re-
presents the practical part of this thesis. In fact, we made an application that
parses JSON internet data and displays news from department of the mathematics
on mobile screens. The name of the application is symbolic MathosMonitoring and
it follows news related with Mathematical colloquium, seminars for optimization
and applying, news from the student administration office, news for students rela-
ted with colloquiums and exams. In our work we accompanied the main idea of
organizing data in JSON, objects and ways of parsing Java programming language.
45
Zivotopis
Roden sam u Vukovaru 1. travnja 1988. Djetinjstvo sam proveo u selu Veri u kojem
sam zapoceo i prve skolske dane, ali samo do cetvrtoga razreda. Osnovnu skolu
zavrsio sam u Boboti, a opcu gimnaziju u Vukovaru s odlicnim uspjehom kroz sve
razrede osnovne i srednje skole. Tijekom skolovanja sam sudjelovao na natjecanjima
iz matematike, fizike i kemije. Godine 2007. upisao sam Sveucilisni nastavnicki
studij matematike i informatike na Odjelu za matematiku u Osijeku. Kao redoviti
student predmete sam rjesavao azurno, tj. u tekucoj akademskoj godini. Pocetkom
listopada 2012. stupio sam u prvi radni odnos, predajem matematiku u osnovnoj
skoli od petog do osmog razreda.
46