46
Sveuˇ ciliˇ ste J. J. Strossmayera u Osijeku Odjel za matematiku Vojislav Duraˇ ckovi´ c Programiranje mobilnih aplikacija za Android operativni sustav Diplomski rad Osijek, 2012.

Programiranje mobilnih aplikacija za Android operativni sustav

Embed Size (px)

DESCRIPTION

U ovom diplomskom radu iznesen je način izrade mobilne aplikacije za Android operativni sustav. Stečeno znanje i iskustvo primjenili smo i implementirali vlastitu aplikaciju.

Citation preview

Page 1: Programiranje mobilnih aplikacija za Android operativni sustav

Sveuciliste J. J. Strossmayera u OsijekuOdjel za matematiku

Vojislav Durackovic

Programiranje mobilnih aplikacijaza Android operativni sustav

Diplomski rad

Osijek, 2012.

Page 2: Programiranje mobilnih aplikacija za Android operativni sustav

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.

Page 3: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 4: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 5: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 6: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 7: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 8: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 9: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 10: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 11: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 12: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 13: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 14: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 15: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 16: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 17: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 18: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 19: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 20: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 21: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 22: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 23: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 24: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 25: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 26: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 27: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 28: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 29: Programiranje mobilnih aplikacija za Android operativni sustav

}

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

Page 30: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 31: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 32: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 33: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 34: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 35: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 36: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 37: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 38: Programiranje mobilnih aplikacija za Android operativni sustav

<?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

Page 39: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 40: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 41: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 42: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 43: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 44: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 45: Programiranje mobilnih aplikacija za Android operativni sustav

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

Page 46: Programiranje mobilnih aplikacija za Android operativni sustav

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