ivan skori c osnove izrade aplikacija za operativni sustav...

38
Sveuˇ ciliˇ ste J.J. Strossmayera u Osijeku Odjel za matematiku Preddiplomski studij matematike Ivan ˇ Skori´ c Osnove izrade aplikacija za operativni sustav Android Zavrˇ sni rad Osijek, 2012.

Upload: others

Post on 08-Sep-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Sveuciliste J.J. Strossmayera u Osijeku

Odjel za matematiku

Preddiplomski studij matematike

Ivan Skoric

Osnove izrade aplikacija zaoperativni sustav Android

Zavrsni rad

Osijek, 2012.

Page 2: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Sveuciliste J.J. Strossmayera u Osijeku

Odjel za matematiku

Preddiplomski studij matematike

Ivan Skoric

Osnove izrade aplikacija zaoperativni sustav Android

Zavrsni rad

Mentor: doc.dr.sc. Domagoj Matijevic

Osijek, 2012.

Page 3: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Sadrzaj

1 Arhitektura aplikacije 61.1 Android Manifest . . . . . . . . . . . . . . . . . . . . . . . . . 71.2 Aktivnosti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.2.1 Zivotni ciklus aktivnosti . . . . . . . . . . . . . . . . . 101.2.2 Pozivanje jedne aktivnosti iz druge . . . . . . . . . . . 11

1.3 Servisi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2 Instalacija razvojnog okruzenja 162.1 Java Development Kit . . . . . . . . . . . . . . . . . . . . . . 162.2 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.3 Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4 Android Development Tools Plugin . . . . . . . . . . . . . . . 162.5 Podesavanje ADT Plugina . . . . . . . . . . . . . . . . . . . . 172.6 Android SDK Manager . . . . . . . . . . . . . . . . . . . . . . 172.7 Postavljanje emulatora . . . . . . . . . . . . . . . . . . . . . . 182.8 Izrada projekta (Eclipse) . . . . . . . . . . . . . . . . . . . . . 19

3 Graficko korisnicko sucelje 203.1 Layouti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.2 ViewGroup objekti . . . . . . . . . . . . . . . . . . . . . . . 22

3.2.1 Linear Layout . . . . . . . . . . . . . . . . . . . . . . . 223.2.2 Relative Layout . . . . . . . . . . . . . . . . . . . . . . 253.2.3 List View . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.3 View objekti . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.1 Button . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.3.2 Check Box . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.3 Text View . . . . . . . . . . . . . . . . . . . . . . . . . 31

4 Napredniji primjeri 324.1 Prvi primjer: download HTML koda i pretvorba u MD5 chec-

ksum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.2 Drugi primjer: ucitavanje vanjske baze podataka . . . . . . . . 35

3

Page 4: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Sazetak.

U zavrsnom radu cemo predstaviti Android operativni sustav i osnove progra-miranja aplikacija za isti u programskom jeziku Javi. Pokazat cemo pocetkei nastanak Androida, te njegov napredak do danas. Objasnit cemo osnovnustrukturu aplikacija, te proci kroz rad pojedinih komponenti, njihovu upo-rabu te ciklus rada. Proci cemo kroz osnove upravljanja i povezivanje saSQLite bazom podataka, te upravljanje izgledom aplikacije kroz XML je-zik za oznacavanje podataka i programski, koristeci Javu . Sve sto bu-demo obradivali pokazat cemo na primjeru aplikacije koja prati promjene nasluzbenim stranicama Odjela za matematiku u Osijeku. Sucelje koje cemokoristiti pri izradi aplikacija je Eclipse.

Kljucne rijeci:

Android, programiranje, Java, XML, mobilne aplikacije, Eclipse.

Abstract.

In this final paper we are going to present Android operating system andbasics of programming Android applications in programming language Java.We will show the beginning and development of Android, and its progressto date. We will explain the basic structure of applications and go throughthe work of individual components, their use, and their lifecycle. We willgo through the basics of managing and connecting with SQLite database,managing application layout through XML markup language and programa-tically, using Java. Everything we go through will be shown on the exampleof application that follows changes on the official websites of Department ofMathematics in Osijek. An interface we are going to use to build applicationsis Eclipse.

Keywords:

Android, programming, Java, XML, mobile applications, Eclipse.

4

Page 5: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Uvod

Android je operativni sustav dizajniran prvenstveno za uredaje sa zaslonomna dodir kao sto su smartphone-ovi i tableti, baziran na Linuxovoj jezgri.Razvoj Androida preuzeo je Google 2005. godine od tvrtke Android Inc. Odtada je ova platforma dozivjela enorman uspjeh, a broj uredaja koji koristeAndroid svakim danom je sve veci.

Google je predstavio Android 2007. kao open-source platformu. Od tada,Android ima veliku zajednicu developera koji prave Android aplikacije, pi-sane prvenstveno u Javi, a aplikacije mogu biti preuzete preko online trgovinakao sto su Google Play (bivsi Android Market), Amazon, GetJar, itd.

Neke prednosti programiranja za Android: platforma otvorenog koda(open-source), programiranje u Javi, svaka aplikacija je prihvacena u krat-kom roku od objave, mnostvo dokumentacije, velika zajednica programeravoljnih pomoci, broj korisnika raste svaki dan, itd. U prvom poglavljuobjasnjavamo osnovnu arhitekturu aplikacije, Android Manifest, te detaljnijeproucavamo aktivnosti i servise.

Drugo poglavlje se bavi instalacijom razvojnog okruzenja odnosno pripre-manjem potrebnih stvari za razvoj Android aplikacije na racunalu. Takoderobjasnjeni su dijelovi projektne datoteke.

U trecoj cijelini bavimo se izradom korisnickog sucelja, odnosno komuni-kacijskog kanala izmedu korisnika i odredenih instanci klasa View i ViewGroup.

Zavrsna cijelina daje nam uvid u neke dijelove izrade aplikacije koja pratipromijene na stranicama Odjela za matematiku, Osijek. Ti primjeri su na-predniji i cijeloviti djelovi koda za rjesavanje postavljenog problema.

5

Page 6: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

1 Arhitektura aplikacije

Android je graden od vise ugradenih slojeva. Aplikacije se nalaze na vrhu,u sredini su okviri aplikacija (framework), biblioteke, Android runtime i sl.Na dnu se nalazi Linux jezgra za raznoraznim driverima. Android pokrecuvirtualni uredaj Dalvik (DVM) i biblioteke jezgre (Core Libraries). SvakaAndroid aplikacija dobiva svoj vlastiti Linux proces kao instancu Dalvik vir-tualnog uredaja. Dalvik pretvara Java kod u DEX format koji je zapakiran uaplikacijski paket, sa nastavkom .apk koji Android koristi kako bi instaliraoaplikaciju na uredaj.

Aplikacija je skup komponenti: aktivnosti, servisi, content provideri, bro-adcast receiveri. Oni se vrte u Linux procesima i njima upravlja Android.

Aktivnost (activity) je komponenta koja prikazuje korisnicko suceljetako da korisnik moze bit u interakciji s aplikacijom. Npr. aplikacija kaluku-lator prikazuje korisnicko sucelje za upisivanje brojeva i ispis rezultata.Iakoaplikacije mogu sadrzavat samo jednu aktivnost, najcesce to nije slucaj. Pri-mjerice, kalkulator moze imati sucelje sa postavkama zelimo li znanstveni iliprogramerski kalkulator i slicno.

Servis (service) je komponenta koja se pokrece u pozadini u neogranicenomvremenu i nema vlastito sucelje (npr. sviranje glazbe). Servise dijelimo nalokalne (local service), koji se vrte u istom procesu kao i ostatak aplikacije ina udaljene (remote service), koji se vrte u zasebnom procesu.

Broadcast Receiver je komponenta koja prima reakcije na broadcas-tove (emitirajuce signale), npr. promjena vremenske zone, slaba baterija i sl.Takoder aplikacija moze i sama odaslati broadcast.

Content Provider sluzi za razmjenu podataka izmedu razlicitih aplika-cija. Ti podaci mogu biti spremljeni u Android filesystem, SQLite database,itd.

Intent je poruka koja opisuje koji postupak odnosno koja operacija cese izvrsiti. Npr. slanje e-maila, prelazak na drugu aktivnost, odabir slika,poziv i sl. Gotovo sve u Androidu koristi Intent pa je moguce zamjeniti pos-tojece komponente vlastitima. Npr. ukoliko neka aplikacija zeli poslati mailona zahtjeva slanje maila preko Intenta. Kada se to pozove, otvaraju se svimoguci nacini slanja e-maila, odnosno sve aplikacija preko kojih se moze slatimail. Tako i mi mozemo napraviti nasu aplikaciju za slanje maila koja ceprimati

”send mail“ Intent i na njega odgovarati.

6

Page 7: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

1.1 Android Manifest

Android saznaje za aktivnosti i ostale dijelove aplikacije preko Android Ma-nifesta odnosno datoteke AndroidManifest.xml, gdje su definirane i navedenesve komponente koje se koriste u aplikaciji. Ukoliko neki dio nije naveden umanifestu, Android ga nece prepoznati.

Primjer 1. AndroidManifest.xml

1 <?xml ve r s i on=” 1 .0 ” encoding=”utf−8”?>2 <mani fe s t xmlns :andro id=” ht tp : // schemas . android . com/apk/ r e s /

android ”3 package=”com . pr imjer . t u t o r i a l ”4 andro id :ver s ionCode=”1”5 android:vers ionName=” 1 .0 ” >6

7 <app l i c a t i o n8 andro id : i c on=”@drawable/ i c l a un ch e r ”9 and r o i d : l a b e l=”@str ing /app name” >

10 <a c t i v i t y11 android:name=” . MojaAktivnost1”12 and r o i d : l a b e l=”@str ing /app name” >13 <in tent− f i l t e r>14 <ac t i on android:name=”android . i n t en t . a c t i on .15 MAIN” />16 <category android:name=”android . i n t en t . category .

LAUNCHER” />17 </ intent− f i l t e r>18 </ a c t i v i t y>19 </ app l i c a t i o n>20

21 </mani f e s t>

Na pocetku imamo <?xml version="1.0" encoding="utf-8"?> stonam je obavezni pocetni dio, koji oznacava koju verziju i encoding koristimo.

U samom manifest tagu dajemo opis aplikacije. Prva naredba je oba-vezna, a u njoj definiramo Android namespace. Package daje ime paketa ukojem se nalazi aplikacija. Ime samoga paketa prati standardnu konvencijuza oznacavanje paketa u Javi. Zatim versionCode je broj verzije – uvijekcjelobrojna vrijednost, a versionName je naziv verzije, proizvoljno.

U tagu <action> definiramo sve komponente aplikacije. Icon i label sureference na mjesto gdje smo snimili ikonu odnosno opis aplikacije zapisan uString.

Nadalje imamo aktivnost naziva MojaAktivnost1, ali zapisujemo ju stockom ispred imena zato jer se ona nastavlja na paket znaci npr.

7

Page 8: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

com.primjer.tutorial.MojaAktivnost1.Sljedece sto imamo je <intent-filter> koji sluzi kako bi se identifi-

cirala aktivnost ukoliko je pozvan odredeni Intent:

• Prvi tag <action> identificira koju cemo akciju izvest. U ovomslucaju android.intent.action.MAIN oznacava da je ovo pocetnaaktivnost u aplikaciji.

• Kategorija komponente odredena je u <category> tagu. Atributandroid.intent.category.LAUNCHER znaci da se ova aktivnostpokrece iz application launchera.

8

Page 9: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

1.2 Aktivnosti

• opisane podklasama klase android.app.Activity

• android.app.Activity je indirektna podklasa apstraktneklase android.content.Context

Napomena: Context je apstraktna klasa koja pristupa globalnim infor-macijama, te omogucava aplikacijama izvrsavanje kontekstualnih operacija,kao pokretanje aktivnosti i servisa, odasiljanje intenta, otvaranje datotekaitd.

Svaka aktivnost ima svoj zivotni ciklus. No, prije nego ga objasnimo napisimoprimjer koda za neku proizvoljnu aktivnost:

Primjer 2. MojaAktivnost.java

1 import android . app . Ac t i v i ty ;2 import android . os . Bundle ;3

4 pub l i c c l a s s MojaAktivnost extends Act i v i ty {5 @Override6 pub l i c void onCreate ( Bundle savedIns tanceSta te ) {7 super . onCreate ( savedIns tanceState ) ; //prvo pozivamo

funkc i j u nadklase8 System . out . p r i n t l n ( ”pozvana j e metoda onCreate ( ) ” ) ;9 }

10

11 @Override12 pub l i c void onDestroy ( ) {13 super . onDestroy ( ) ; //prvo pozivamo funkc i j u nadklase14 System . out . p r i n t l n ( ”pozvana j e metoda onDestroy ( ) ” ) ;15 }16 }

Napravili smo override funkcija onCreate(Bundle) i onDestroy(),te prije bilo kakvog koda prvo smo pozvali super.onCreate(Bundle) isuper.onDestroy(), sto su metode nadklase Activity za koje pravimooverride. Njih uvijek pozivamo da se prvo izvrsi odredena metoda u samojklasi Activity, a nakon toga pisemo vlastiti kod koji ce se izvrsiti pripokretanju odredene metode.

Funkcija onCreate(Bundle) ce se pokrenuti pri stvaranju aktivnosti,a onDestroy() pri unistavanju, no ovo je osnovni primjer dok je zivotniciklus podrobnije objasnjen u sljedecem odjeljku.

9

Page 10: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

1.2.1 Zivotni ciklus aktivnosti

Zivotni ciklus aktivnosti koristi 7 funkcija: onCreate(Bundle), onStart(),onPause(), onResume(), onStop(), onRestart(), onDestroy().

Slika 1: Zivotni ciklus aktivnosti

Aktivnost nastaje naredbom onCreate(Bundle) koja prima jednu Bundlevarijablu. Ta Bundle varijabla sadrzi podatke o prethodnom stanju aktiv-nosti ukoliko ga je bilo. Npr, ako smo na nekoj aktivnosti nesto mjenjalii poslje se na nju vratimo, najcesce zelimo da nastavimo u onom stanjugdje smo stali. Za to ce se pobrinuti Bundle varijabla. U onCreate()zelimo staviti sve sto nam je potrebno pri inicijaliziranju aktivnosti (poza-dinu, kucice, tipke, itd.).

10

Page 11: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Naredbe onStart() i onResume() prvenstveno sluze za povratak izonStop() i onPause() stanja. U nju mozemo staviti dio koda ukolikozelimo da se nesto u aktivnosti promjeni pri povratku na nju.

Kada predemo sa jedne aktivnosti na drugu, prva aktivnost se zaustavljaodnosno izvrsava naredbu onStop() kratko prolazeci kroz onPause() iceka. Ili ce biti ponovno pokrenuta naredbom onRestart() ili, ukolikosustav odluci da ju vise ne treba, biti ce uklonjena.

Aktivnost je u onPause() stanju kada se vidi u pozadini ali nije aktivna.Npr. kada nam se ponudi upitnik pomocu koje aplikacije zelimo podjeliti nekisadrzaj, u pozadini vidimo nasu aktivnost koja je neaktivna. Kada iz togstanja ponovo postaje aktivna izvrsava se naredba onResume().

Naredba onDestroy() se izvrsava pri gasenju aplikacije. Posto se tanaredba ne mora nuzno izvrsiti ne preporuca se u njoj izvoditi bitne funkcije,vec u onPause() ako npr. zelimo izmjeniti podatke od content providera isl.

1.2.2 Pozivanje jedne aktivnosti iz druge

Primjetite sa slike 1. da aktivnost pozivamo naredbom startActivity().Funkcija startActvitiy() je tipa void iz klase Context i prima Intent.

Neka imamo aplikaciju sa dvije aktivnosti: MojaAktivnost1 i MojaAktivnost2.Definiramo ih prvo u manifestu na sljedeci nacin:

Primjer 3. AndroidManifest.xml

1 <?xml ve r s i on=” 1 .0 ” encoding=”utf−8”?>2 <mani fe s t xmlns :andro id=” ht tp : // schemas . android . com/apk/ r e s /

android ”3 package=”com . mathos . z av r sn i ”4 andro id :ver s ionCode=”1”5 android:vers ionName=” 1 .0 ” >6

7 <uses−sdk8 android:minSdkVers ion=”7”9 andro id : ta rge tSdkVers i on=”15” />

10

11 <app l i c a t i o n12 andro id : i c on=”@drawable/ i c l a un ch e r ”13 and r o i d : l a b e l=”@str ing /app name” >14 <a c t i v i t y15 android:name=” . MojaAktivnost1”16 and r o i d : l a b e l=”@str ing /

t i t l e a c t i v i t y mo j a a k t i v n o s t 1 ” >17 <in tent− f i l t e r>

11

Page 12: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

18 <ac t i on android:name=”android . i n t en t . a c t i on .MAIN” />

19

20 <category android:name=”android . i n t en t . category .LAUNCHER” />

21 </ intent− f i l t e r>22 </ a c t i v i t y>23 <a c t i v i t y24 android:name=” . MojaAktivnost2” >25 <in tent− f i l t e r>26 <ac t i on android:name=”android . i n t en t . a c t i on .VIEW

” />27

28 <category android:name=”android . i n t en t . category .DEFAULT” />

29 </ intent− f i l t e r>30 </ a c t i v i t y>31 </ app l i c a t i o n>32

33 </mani f e s t>

Sada da bismo iz prve aktivnosti MojaAktivnost1 (koja je postavljenakao MAIN sto znaci da je to prva, odnosno glavna aktivnost koja se pokrece)pozvali aktivnost MojaAktivnost2 prvo kreiramo Intent, te ga pokre-nemo naredbom startActivity():

Primjer 4. MojaAktivnost1.java

1 In tent mojIntent = new Intent (MojaAktivnost1 . th i s ,MojaAktivnost2 . c l a s s ) ;

2 MojaAktivnost1 . t h i s . s t a r tA c t i v i t y ( mojIntent ) ;

Dakle, prvo smo napravili mojIntent koji nam govori na koju aktivnostcemo prijeci. U drugoj liniji koda taj Intent izvrsavamo naredbomstartActivity(Intent).

Aktivnost mozemo pozvati i implicitno, zadavanjem uvjeta odnosno atri-buta koje ispunjava aktivnost koju zelimo pokrenuti. Ovakvo pozivanje ak-tivnosti se koristi kada npr. zelimo poslati mail i onda pozovemo sve oneaktivnosti koje podrzavaju slanje maila. Time dozvoljavamo korisniku dasam odabere koju ce aplikaciju odnosno aktivnost koristiti. Takoder prekoIntenta prenosimo i potrebne podatke. Glavna aktivnost naime, ne primanikakve ulazne podatke.

12

Page 13: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Primjer implicitnog pozivanja aktivnosti:

Primjer 5. MojaAktivnost1.java

1 In tent mojIntent = new Intent ( ) ;2 mojIntent . s e tAct ion ( ” android . i n t en t . a c t i on .VIEW” ) ;3 mojIntent . addCategory ( ” android . i n t en t . category .DEFAULT” ) ;4 s t a r tA c t i v i t y ( mojIntent ) ;

Ovakvim pozivanjem aktivnosti Android ce nam ponuditi sve aktivnosti kojeimaju ove postavke. Odabiranjem imena nase aplikacije, pokrenut ce seMojaAktivnost2.

13

Page 14: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

1.3 Servisi

• opisani podklasama klase android.app.Service

• android.app.Service je indirektna podklasa apstraktne klaseandroid.content.Context

Servis je komponenta koja se moze vrtiti u pozadini cak i kada korisnik nijeu interakciji sa nasom aplikacijom. Servis bismo trebali napraviti samo kadanam je zaista potreban. Ako trebamo napraviti nekakav pozadinski posaoali samo za vrijeme koristenja aplikacije, to se treba napraviti u zasebnomthreadu, bez stvaranja posebnog servisa.

Da bismo napravili servis, moramo stvoriti podklasu klase Service,tj. moramo napravit override metoda koje upravljaju osnovnim aspektimaservisa. Najbitnije metode za koje trebamo napraviti override su:

• onStartCommand() - Sistem poziva ovu metodu kada neka kompo-nenta, uglavnom aktivnost, zatrazi pokretanje servisa tj. pozove na-redbu startService(). Jednom kada se ova metoda izvrsi, servis jezapocet i moze se vrtiti u pozadini beskonacno dugo. Nasa je duznosti zaustaviti servis, metodom stopSelf() ili stopService().

• onBind() - Ova metoda je pozvana kada se neka druga komponentazeli povezati na servis koristeci naredbu bindService(). Ovu me-todu moramo uvijek implementirati, ali ukoliko ne zelimo dozvoliti po-vezivanje (binding) moramo vratiti null.

• onCreate() - Poziva se kada je servis prvi puta stvoren, da se provedujednokratne procedure i inicijalizacije.

• onDestroy() - Poziva se pri gasenju servisa kako bismo mogli npr.obrisatii stvorene threadove, registre i sl.

Svaki servis moramo navesti u manifestu na sljedeci nacin:

Primjer 6. Android Manifest.xml

1 <mani fe s t . . . >2 . . .3 <app l i c a t i o n . . . >4 <s e r v i c e android:name=” . MojServis ” />5 . . .6 </ app l i c a t i o n>7 </mani f e s t>

14

Page 15: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Osnovni izgled servisa sa funkcijama koje smo naveli:

Primjer 7. MojServis.java

1 import android . app . S e rv i c e ;2 import android . content . In tent ;3 import android . os . IBinder ;4

5 pub l i c c l a s s MojServis extends Se rv i c e {6 @Override7 pub l i c void onCreate ( ) {8 super . onCreate ( ) ;9 }

10

11 @Override12 pub l i c void onDestroy ( ) {13 super . onDestroy ( ) ;14 }15

16 @Override17 pub l i c IBinder onBind ( Intent i n t en t ) {18 re turn nu l l ;19 }20

21 @Override22 pub l i c i n t onStartCommand ( Intent intent , i n t f l a g s , i n t

s t a r t I d ) {23 re turn super . onStartCommand ( intent , f l a g s , s t a r t I d ) ;24 }25 }

Vec smo rekli da servisi dolaze u dva oblika: lokalni(zapoceti) i uda-ljeni(vezani).

Lokalne servise zapocinjemo naredbom startService(). Jednom kadase pokrenu, traju dok ih eksplicitno ne zatvorimo ili dok se ne zatvore sami,cak i nakon sto aktivnost koja ih je stvorila vise ne postoji.

Servis je udaljen ako se na njega spoji neka komponenta naredbom bindService().Udaljeni servis pruza klijent-server sucelje, koje omogucava komponentamada salju zahtjeve, primaju rezultate, vrse interprocesorsku komunikaciju itd.Udaljeni servis traje dok je neka komponenta povezana na njega (njih mozebiti i vise). Kada vise ni jedna komponenta nije spojena na taj servis, on seunistava.

15

Page 16: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

2 Instalacija razvojnog okruzenja

2.1 Java Development Kit

Za razvoj aplikacija prvo cemo trebati Javu odnosno JDK (Java Develop-ment Kit). Preuzmite posljednju verziju koja je dostupna:http://www.oracle.com/technetwork/java/javase/downloads/.U ovome radu koristen je Eclipse 4.2.0.

2.2 Eclipse

Nakon instalacije JDK alata instalirat cemo Eclipse, najcesce koristeno ipreporuceno razvojno sucelje za Android. Posljednju verziju mozete pronaciovdje: http://www.eclipse.org/downloads/.

Preporuceno je preuzeti Eclipse Classic ili Eclipse IDE for Java Deve-lopers. Eclipse nema executable instalaciju vec skinemo glavnu datoteku ukojoj se nalazi. Tu datoteku treba prekopirati tamo gdje zelimo da Eclipsebude.

Kada pokrenete Eclipse pitat ce vas koji workspace odnosno radni pros-tor zelite koristiti. To je proizvoljna datoteka u kojoj ce biti svi vasi projektispremljeni. Napravite svoju mapu proizvoljno ili koristite ponudenu mapu.

2.3 Android SDK

Sljedece sto nam je potrebno je Android SDK (Software Development Kit).To je softver za razvoj Android aplikacija, nepovezan s Eclipseom. Njegacemo povezati u sljedecem koraku preko ADT plugina, i pokretat iz samogEclipsea.

Koraci za instalaciju:

• Preuzmite odgovarajuci SDK (posljednja verzija):http://developer.android.com/sdk/index.html.

• Ukoliko koristite Windowse mozete automatski instalirati SDK, ili al-ternativno napraviti extract u bilo koju mapu, bitno je da zapamtitegdje ste stavili tu mapu.

2.4 Android Development Tools Plugin

ADT Plugin nam je potreban da povezemo Eclipse i Android SDK. Koraciza instalaciju su sljedeci:

• Otvorite Eclipse i odaberite Help → Install New Software. . .

16

Page 17: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

• Kliknite Add u gornjem desnom kutu.

• U celije koje su se otvorile upisite proizvoljno ime, npr. “ADT Plugin” isljedeci url: https://dl-ssl.google.com/android/eclipse/.

• Pritisnite OK.

• Nadalje, oznacite Developer Tools → Next. Sada ce te vidjeti popissvih alata koji ce se skinuti. Prihvatite uvjete koristenja i stisnite OK

• Kada instalacija zavrsi resetirajte Eclipse.

2.5 Podesavanje ADT Plugina

Moramo dodati lokaciju na koju smo spremili Android SDK. Koraci su sljedeci:

• U Eclipseu: Window → Preferences ( Eclipse → Preferences za MacOS X).

• Iz lijevog izbornika izaberite Android.

• Pod SDK Location kliknite Browse. . . i pronadite mapu gdje se nalaziSDK (moguce je i da ce Eclipse sam vec pronaci mapu).

• Apply → Ok.

2.6 Android SDK Manager

Moramo instalirati verzije koje zelimo koristiti pri razvoju Android aplikacija.Trenutne Android verzije:

Slika 2: Android verzije

17

Page 18: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

U Eclipseu odaberite: Window → Android SDK Manager. Sada ce namse otvoriti prozor u kojem mozemo upravljati instaliranim verzijama. Zapotrebe ovog rada koristen je Android 2.1 odnosno API 7.

Pod mapom Android 2.1 (API 7) oznacite SDK Platform te instalirajte.Kasnije ukoliko cete raditi na vecim ili manjim verzijama uvijek mozete uciu SDK Manager i odabrat zeljene pakete za instalaciju.

Vece verzije uvijek podrzavaju manje. Npr na Android 4.0 sustavu mocicete pokrenuti aplikaciju namjenjenu sustavu Android 2.1, ali ne nuzno iobrnuto.

2.7 Postavljanje emulatora

Android SDK dolazi sa AVD(Android Virtual Device) managerom preko ko-jega mozemo stvoriti virtualni Android uredaj na racunalu odnosno emuliratistvarni uredaj. Emulator ce se ponasati identicno kao i pravi uredaj samosto ce biti nesto sporiji i neke funkcije ce biti ogranicene, npr. pozivi, kamerai sl.

Postavljanje emulatora:

• U Eclipseu: Window → AVD Manager → New. . .

• Name: proizvoljno, Target: Android 2.1 – API 7, Size: 100 – 500Mib(nije obavezno).

• Ostalo ostaviti kako je namjesteno te stisnuti Create AVD.

• Kada smo ga napravili odaberemo ga i kliknemo Start.

• Scale display to real size oznacimo i promjenimo velicinu pod ScreenSize (in) na recimo 6, jer ce nam biti prevelik ekran ako ostavimonormalno, ali to je po vasem izboru (pod Scale vidimo koliki je odnosvelicine emulatora i pravog uredaja), kliknemo Launch.

• Nakon odredenog vremena emulator je pokrenut i mozete s njime raditi.

Sada je emulator spreman i kada pokrenemo Android projekt on ce se auto-matski instalirat na stvaran uredaj i pokrenuti.

18

Page 19: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

2.8 Izrada projekta (Eclipse)

Nakon sto smo instalirali razvojno okruzenje otvorimo Eclipse i odaberemoworkspace odnosno radnu datoteku. Ovdje cemo izradivati aplikacije. Jedanprojekt predstavlja jednu aplikaciju.

Postupak izrade projekta:

• File → New → Project te zatim odaberemo Android Project.

• Sada odaberemo ime aplikacije, ime projekta i ime paketa. Npr. ”Odjelza matematiku”, ”Mathos”, com.mathos.app.

• Pod Build SDK biramo ciljanu verziju, a pod Minimum Required SDKnajmanju verziju koju cemo podrzavati.

• Zatim pritiskamo Next do zadnjeg prozora koji nam nudi ime prveaktivnosti koju zelimo stvoriti i ime layouta koji ce ona imati.

• Klikom na Finish stvorili smo projekt.

Sada ako prosirimo datoteku naseg projekta vidjet cemo sljedece datotekekoje sadrzava:

• \src - Sadrzi izvorni kod programa pod imenom paketa. Tu ce nambiti svi .java fileovi.

• \gen - Sadrzi automatski generiran Java kod i taj dio se ne dira rucno.

• \assets - Ovdje mozemo spremiti razne file-ove kojima pristupamodirektno u aplikaciji, npr. neke svoje tablice, dokumente, itd.

• \bin - Sadrzi binarni kod aplikacije, potreban za instalaciju na uredaj.

• \res - Sadrzi sve resurse koji su nam potrebni u aplikaciji: xml fileove,slike, stringove, zvukove, ikone, itd.

19

Page 20: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

3 Graficko korisnicko sucelje

Graficko sucelje na Android uredajima izgradeno je od View i ViewGroupobjekata. View je objekt koji nesto graficki prezentira na ekranu i sa kojimkorisnik moze doci u interakciju. ViewGroup je objekt koji sadrzi Viewobjekte, kako bi se definirao cjelokupan izgled i polozaj na ekranu.ViewGroup objekti koje cemo detaljnije promatrati:

• LinearLayout

• RelativeLayout

• ListView

Jos neki bitniji ViewGroup objekti:

• WebView - sluzi za prikaz web stranica u aktivnosti

• ScrollView - prikaz koji mozemo pomicati(scrollati) ukoliko tekstizade van okvira

• GridView - koristi se za prikaz npr. vise slika u galeriji, sadrzi viseelemenata dijagonalno i vertikalno, kao u tablici

View objekti koje cemo detaljnije promatrati:

• Button

• CheckBox

• TextView

Jos neki bitniji View objekti:

• EditText - sluzi za unos teksta od strane korisnika

• RadioButton - nudi jedan moguci od vise odabira neke opcije

• Spinner - drop-down meni sa opcijama

Sada cemo proci kroz nekoliko osnovnih atributa koje mozemo pridavatiViewGroup i View objektima. Svi atributi pisu se u samome tagu nakonimena taga, kao sto cemo vidjeti kasnije u kodu.

• android:id - ovime pridruzujemo nekom elementu identifikacijskuoznaku kako bismo kasnije u kodu mogli referirati na taj objekt, npr.android:id="@+id/mybutton", gdje @+id znaci da dodajemo tajid, ako nebi bilo plusa onda bi referirali na neki postojeci id

20

Page 21: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

• android:layout width - sirina odredenog layouta, preporuca seupotreba match parent - sirina objekta u kojem je sadrzana, wrap content- sirina samo oko sadrzaja koji je sadrzan u objektu, te ako se morarucno pisati duzina preporuca se dp, odnosno density-pixel koji cese mjenjat ovisno o gustoci ekrana, tako da se odrzi postojanost narazlicitim velicinama ekrana

• android:layout height - analogno prethodnoj tocki

• android:text - ukoliko objekt moze u sebi sadrzavati tekst njegadefiniramo na ovaj nacin, ali pozivanjem na string unutar datoteke\res\values\strings.xml zbog lakog kasnijeg mjenjanja i prevodenja,npr. android:text="@string/nekistring"

Ostale atribute cemo upoznati kroz daljnje primjere.

3.1 Layouti

Layout predstavlja vizualnu strukturu aktivnosti. Svi elementi se rasporedujuu layoute, koji odreduju kako i gdje ce koji objekt biti smjesten.

Elementi layouta mogu biti deklarirani u XML datoteci samog layouta,ili programatski unutar java koda. U XML datoteci bi trebali biti definiranielementi koji se nece mjenjati u aktivnostii, ili nekakav pocetan izgled, a pro-gramatski oni djelovi koji ce se mjenjat i koji ovise o nekim parametrima ilikorisnikovoj interakciji.

XML kod layouta koji se zove npr. mojlayout nalazi se u:\res\layout\mojlayout.xml

Kada aktivnosti pridruzujemo odredeni layout to radimo naredbomsetContentView() koja prima id naseg layouta odnosno ime layouta saR.layout ispred imena. Iniciranje layouta se odraduje u metodi onCreate(),tj. prilikom nastanka aktivnosti, osim ako nam nije potrebno drukcije, npr.zelimo kada se vratimo u aplikaciju postaviti nekakav drukciji layout, ondacemo pozvat setContentView() u npr. onResume() metodi.

Primjer 8. MojaAktivnost.java

1 pub l i c c l a s s MojaAktivnost extends Act i v i ty {2 @Override3 protec ted void onCreate ( Bundle savedIns tanceState ) {4 super . onCreate ( savedIns tanceState ) ;5 setContentView (R. layout . mojlayout ) ; // postavl jamo mojlayout

kao layout a k t i v n o s t i6 }}

21

Page 22: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

3.2 ViewGroup objekti

Layout cini ViewGroup objekt unutar kojega su poslozeni svi drugi ViewViewGroup objekti. Primjer hijerarhije jednog layouta:

Slika 3: Hijerarhija layouta

3.2.1 Linear Layout

LinearLayout je ViewGroup objekt u kojem su View objekti poslozeniu jednome smjeru, vertikalno ili horizontalno.

Slika 4: Linear Layout

Linear Layout koristimo za jednostavan jednosmjerni izgled. Takoder LinearLayoutobjekt moze sadrzavati drugi LinearLayout objekt druge orjentacije, patime mozemo dobiti kompleksniji izgled.

22

Page 23: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Primjer 9. mojlayout.xml

1 <LinearLayout xmlns :andro id=” ht tp : // schemas . android . com/apk/ r e s /android ”

2 xmln s : t oo l s=” ht tp : // schemas . android . com/ t o o l s ”3 andro id : l ayout w id th=”match parent ”4 and ro i d : l a you t h e i gh t=”match parent ”5 and r o i d : o r i e n t a t i o n=” v e r t i c a l ” >6

7 <Button8 and ro i d : i d=”@+id /button1”9 andro id : l ayout w id th=”match parent ”

10 and ro i d : l a you t h e i gh t=”wrap content ”11 and ro i d : t ex t=”@str ing /button” />12

13 <Button14 and ro i d : i d=”@+id /button2”15 andro id : l ayout w id th=”match parent ”16 and ro i d : l a you t h e i gh t=”wrap content ”17 and ro i d : t ex t=”@str ing /button” />18

19 <Button20 and ro i d : i d=”@+id /button3”21 andro id : l ayout w id th=”match parent ”22 and ro i d : l a you t h e i gh t=”wrap content ”23 and ro i d : t ex t=”@str ing /button” />24

25 <LinearLayout26 xmlns :andro id=” ht tp : // schemas . android . com/apk/ r e s /

android ”27 xmln s : t oo l s=” ht tp : // schemas . android . com/ t o o l s ”28 andro id : l ayout w id th=”match parent ”29 and ro i d : l a you t h e i gh t=”match parent ”30 and r o i d : o r i e n t a t i o n=” ho r i z on t a l ” >31

32 <Button33 and ro i d : i d=”@+id /button4”34 andro id : l ayout w id th=”wrap content ”35 and ro i d : l a you t h e i gh t=”wrap content ”36 and ro i d : t ex t=”@str ing /button” />37

38 <Button39 and ro i d : i d=”@+id /button5”40 andro id : l ayout w id th=”wrap content ”41 and ro i d : l a you t h e i gh t=”wrap content ”42 and ro i d : t ex t=”@str ing /button” />43

44 <Button

23

Page 24: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

45 and ro i d : i d=”@+id /button6”46 andro id : l ayout w id th=”wrap content ”47 and ro i d : l a you t h e i gh t=”wrap content ”48 and ro i d : t ex t=”@str ing /button” />49

50 <Button51 and ro i d : i d=”@+id /button7”52 andro id : l ayout w id th=”wrap content ”53 and ro i d : l a you t h e i gh t=”wrap content ”54 and ro i d : t ex t=”@str ing /button” />55 </LinearLayout>56

57 </LinearLayout>

Znaci imamo dva Linear Layouta s time da prvi sadrzi tri Button objekta, ijedan LinearLayout objekt koji sadrzi jos cetiri Button objekta i orjen-tiran je horizontalno za razliku od prvog koji je orjentiran vertikalno. Dobi-vamo ovakav izgled:

Slika 5: Slozeniji Linear Layout

24

Page 25: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

3.2.2 Relative Layout

Relative Layout je preporucen ispred Linear Layouta, zbog svoje mogucnostiadaptiranja na razne uredaje razlicitih velicina ekrana.

Slika 6: Relative Layout

Kod Relative Layout objekta, elemente mozemo orjentirati prema drugimelementima, pa npr. jednu tipku mozemo staviti desno od neke druge tipkea ispod neke slike, sto kod Linear Layouta ne mozemo, nego bismo moraliuvoditi vise Linear Layouta sa razlicitim orjentacijama sto bi zakompliciralostvari.

Pozicioniramo elemente sa sljedecim atributima:android:layout toRightOf, android:layout toLeftOf,android:layout below, android:layout above, koji primaju id ele-menta od kojeg je nas element ”desno od”, ”lijevo od”, ”ispod”, ”iznad”.

Napravimo sada isti izgled kao i u primjeru 9, ali koristeciRelativeLayout:

Primjer 10. mojlayout.xml

1 <Relat iveLayout xmlns :andro id=” ht tp : // schemas . android . com/apk/r e s / android ”

2 xmln s : t oo l s=” ht tp : // schemas . android . com/ t o o l s ”>3 <Button4 and ro i d : i d=”@+id /button1”5 andro id : l ayout w id th=”match parent ”6 and ro i d : l a you t h e i gh t=”wrap content ”7 and ro i d : t ex t=”@str ing /button” />8

9 <Button10 and ro i d : i d=”@+id /button2”

25

Page 26: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

11 andro id : l ayout w id th=”match parent ”12 and ro i d : l a you t h e i gh t=”wrap content ”13 andro id : l ayout be l ow=”@id/button1”14 and ro i d : t ex t=”@str ing /button” />15

16 <Button17 and ro i d : i d=”@+id /button3”18 andro id : l ayout w id th=”match parent ”19 and ro i d : l a you t h e i gh t=”wrap content ”20 andro id : l ayout be l ow=”@id/button2”21 and ro i d : t ex t=”@str ing /button” />22

23 <Button24 and ro i d : i d=”@+id /button4”25 andro id : l ayout w id th=”wrap content ”26 and ro i d : l a you t h e i gh t=”wrap content ”27 andro id : l ayout be l ow=”@id/button3”28 and ro i d : t ex t=”@str ing /button” />29

30 <Button31 and ro i d : i d=”@+id /button5”32 andro id : l ayout w id th=”wrap content ”33 and ro i d : l a you t h e i gh t=”wrap content ”34 andro id : l ayout be l ow=”@id/button3”35 andro id : l ayout toRightOf=”@id/button4”36 and ro i d : t ex t=”@str ing /button” />37

38 <Button39 and ro i d : i d=”@+id /button6”40 andro id : l ayout w id th=”wrap content ”41 and ro i d : l a you t h e i gh t=”wrap content ”42 andro id : l ayout be l ow=”@id/button3”43 andro id : l ayout toRightOf=”@id/button5”44 and ro i d : t ex t=”@str ing /button” />45

46 <Button47 and ro i d : i d=”@+id /button7”48 andro id : l ayout w id th=”wrap content ”49 and ro i d : l a you t h e i gh t=”wrap content ”50 andro id : l ayout be l ow=”@id/button3”51 andro id : l ayout toRightOf=”@id/button6”52 and ro i d : t ex t=”@str ing /button” />53 </Relat iveLayout>

Rezultat je Slika 5, a kao sto vidimo koristen je samo jedan RelativeLayout.

26

Page 27: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

3.2.3 List View

ListView koristimo kada imamo nekakvu listu koju zelimo popuniti nekak-vim vrijednostima. Prednost ListView objekta je sto kroz ArrayAdapterkoji cemo pokazati kroz primjer, mozemo listu vrlo popuniti npr. Stringvarijablama iz polja stringova.

U sljedecem primjeru napraviti cemo listu koju cemo popuniti imenimanekih profesora Odjela za matematiku:

Primjer 11. MojaAktivnost.java

1 import android . os . Bundle ;2 import android . app . Ac t i v i ty ;3 import android . widget . ArrayAdapter ;4 import android . widget . ListView ;5

6 pub l i c c l a s s MojaAktivnost extends Act i v i ty {7

8 pub l i c S t r ing [ ] n a s t avn i c i = {” pro f . dr . sc . Mirta Bensic ” ,9 ”doc . dr . sc . Kres imir Burazin ” ,

10 ” Jos ip Cvenic ” ,11 ” pro f . dr . sc . Dragan Jukic ” ,12 ” pro f . dr . sc . Antoaneta Klobcar ” ,13 ” pro f . dr . sc . Zdenka Kolar−Begovic ” ,14 ”doc . dr . sc . Dar i ja Markovic” ,15 ”doc . dr . sc . Tomislav Marosevic ” ,16 ”doc . dr . sc . Ivan Matic” ,17 ”doc . dr . sc . Domagoj Mat i j ev i c ” ,18 ”doc . dr . sc . Mihaela R ib i c i c Penava” ,19 ” pro f . dr . sc . Kr i s t i an Sabo” ,20 ” pro f . dr . sc . Rudolf S c i t o v s k i ” ,21 ”doc . dr . sc . Nenad Suvak” ,22 ”doc . dr . sc . Zoran Tomljanovic ” ,23 ” pro f . dr . sc . Ninos lav Truhar” ,24 ” pro f . dr . sc . Sime Ungar” } ;25

26 @Override27 pub l i c void onCreate ( Bundle savedIns tanceSta te ) {28 super . onCreate ( savedIns tanceState ) ;29 ArrayAdapter<Str ing> mojAdapter = new ArrayAdapter<

Str ing >( th i s ,30 android .R. layout . s imp l e l i s t i t em 1 , na s t avn i c i ) ;31 ListView mojListView = new ListView ( t h i s ) ;32 mojListView . setAdapter (mojAdapter ) ;33 setContentView (mojListView ) ;34 }}

27

Page 28: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Nas ArrayAdapter prvo je primio Context nase aplikacije, zatim layoutkoji ce se primjeniti na svaki tekstualni red (mi smo ovdje koristili Androidovvec unaprijed napravljeni layout), te String koji treba pretvoriti u listu.Dobiveni izgled:

Slika 7: List View

28

Page 29: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

3.3 View objekti

View objekti su oni sa kojima korisnik dolazi u interakciju. Pokazat cemokako definirati objekte u XML kodu, te kako ih zatim ocitati unutar Javakoda i postaviti metode koje ce reagirati na korisnikovu interakciju sa timobjektom. Sljedeca slika pokazuje primjer kako izgledaju neki View objektiunutar aktivnosti:

Slika 8: View objekti

3.3.1 Button

Button odnosno tipka sastoji se od teksta ili ikone, ili i teksta i ikone, areagira na korisnikov pritisak. Primjer definiranja jednog Buttona u XMLkodu:

Primjer 12. mojlayout.xml

1 <Button2 and ro i d : i d=”@+id / p o s a l j i ”3 andro id : l ayout w id th=”wrap content ”4 and ro i d : l a you t h e i gh t=”wrap content ”5 and ro i d : t ex t=”@str ing / but ton text ” . . . />

29

Page 30: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Sada ga definiramo u Java kodu i postavimo View.OnClickListener, tj.metodu iz klase View koja ce se izvrsiti kada korisnik klikne na tipku zakoju smo listener postavili:

Primjer 13.MojaAktivnost.java

1 // Prvo ga i n i c i j a l i z i r am o2 Button button = (Button ) findViewById (R. id . p o s a l j i ) ;3 // Postavimo l i s t e n e r4 button . s e tOnCl i ckL i s t ene r (new View . OnCl ickListener ( ) {5 pub l i c void onCl ick (View v ) {6 // Uc i n i t i nesto nakon k l i k a na t a j button7 }8 }) ;

3.3.2 Check Box

Check box nam daje mogucnost oznacavanja odredenih opcija. Primjer de-finiranja CheckBox objekta u XML kodu:

Primjer 14. mojlayout.xml

1 <?xml ve r s i on=” 1 .0 ” encoding=”utf−8”?>2 <LinearLayout xmlns :andro id=” ht tp : // schemas . android . com/apk/ r e s /

android ”3 and r o i d : o r i e n t a t i o n=” v e r t i c a l ”4 andro id : l ayout w id th=” f i l l p a r e n t ”5 and ro i d : l a you t h e i gh t=” f i l l p a r e n t ”>6

7 <CheckBox and ro i d : i d=”@+id / op c i j a 1 ”8 andro id : l ayout w id th=”wrap content ”9 and ro i d : l a you t h e i gh t=”wrap content ”

10 and ro i d : t ex t=”@str ing / prvaopc i j a ”11 andro id :onCl i ck=”onCheckboxClicked”/>12

13 <CheckBox and ro i d : i d=”@+id / op c i j a 2 ”14 andro id : l ayout w id th=”wrap content ”15 and ro i d : l a you t h e i gh t=”wrap content ”16 and ro i d : t ex t=”@str ing / drugaopc i j a ”17 andro id :onCl i ck=”onCheckboxClicked”/>18

19 </LinearLayout>

30

Page 31: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Atribut android:onClick="nekoIme" je atribut koji je uveden od An-droida 2.0 koji nam dozvoljava da postavimo listener tako da samo napisemofunkciju public void nekoIme(View v) gdje v prestavlja View objektna koji se listener odnosi. Isto ovo smo mogli napraviti i za Button.

Primjer 15. MojaAktivnost.java

1 pub l i c void onCheckboxClicked (View v ) {2 // Provjer imo j e l i view v odnosno nas checkbox oznacen3 boolean checked = ( ( CheckBox ) v ) . isChecked ( ) ;4

5 // Provjer imo k o j i sve checkboxovi su odabrani6 switch (v . ge t Id ( ) ) {7 case R. id . o p c i j a 1 :8 i f ( checked )9 // Uc i n i t i nesto ako j e op c i j a 1 odabrana

10 e l s e11 // Uc i n i t i nesto ako op c i j a 1 n i j e odabrana12 break ;13 case R. id . o p c i j a 2 :14 i f ( checked )15 // Uc i n i t i nesto ako j e op c i j a 2 odabrana16 e l s e17 // Uc i n i t i nesto ako op c i j a 2 n i j e odabrana18 break ;19 }20 }

3.3.3 Text View

TextView objekt koristimo za postavljanje nekakvog teksta na ekran. Takodermozemo mu zadati font, boju pozadine, velicinu slova, itd.

Primjer 15. mojlayout.xml

1 <TextView2 and ro i d : i d=”@+id / textView1”3 andro id : l ayout w id th=” f i l l p a r e n t ”4 and ro i d : l a you t h e i gh t=”wrap content ”5 android:background=”#DEDEDE”6 andro id :padding=”10dp”7 and ro i d : g r av i t y=” cente r ”8 and ro i d : t ex t=”@str ing / t ek s t ” . . />

31

Page 32: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

4 Napredniji primjeri

U ovom poglavlju pokazat cemo neke naprednije primjere iz aplikacije kojaprati promjene na sluzbenim stranicama Odjela za matematiku u Osijeku.

4.1 Prvi primjer: download HTML koda i pretvorbau MD5 checksum

U ovom primjeru cilj nam je preuzeti HTML kod odredene stranice fakulteta,te ga pretvoriti u jedinstveni MD5 checksum kod kako bismo ga lakse moglispremiti u bazu podataka bez da gubimo jedinstvenost.

Primjer 16. DownloadActivity.java

1 import java . i o . BufferedReader ;2 import java . i o . IOException ;3 import java . i o . InputStream ;4 import java . i o . InputStreamReader ;5 import java . math . B ig Intege r ;6 import java . s e c u r i t y . MessageDigest ;7 import java . s e c u r i t y . NoSuchAlgorithmException ;8

9 import org . apache . http . HttpResponse ;10 import org . apache . http . c l i e n t . C l i entProtoco lExcept ion ;11 import org . apache . http . c l i e n t . HttpCl ient ;12 import org . apache . http . c l i e n t . methods . HttpGet ;13 import org . apache . http . impl . c l i e n t . De fau l tHttpCl i ent ;14

15 import android . os . Bundle ;16 import android . app . Ac t i v i ty ;17

18 pub l i c c l a s s DownloadActivity extends Act i v i ty {19 @Override20 pub l i c void onCreate ( Bundle savedIns tanceSta te ) {21 super . onCreate ( savedIns tanceState ) ;22

23 // Adresa s t r a n i c e c i j i html kod ze l imo24 St r ing u r l = ”http ://www. mathos . un ios . hr/ uv i s / o b a v i j e s t i .

html” ;25

26 // I n t e r f a c e za http k l i j e n t a27 HttpCl ient c l i e n t = new Defau l tHttpCl i ent ( ) ;28

29 // GET metodom preuzimamo sve sa zadane adrese30 HttpGet reque s t = new HttpGet ( u r l ) ;31

32 // Postavimo http odgovor za sada na nu l l

32

Page 33: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

33 HttpResponse response = nu l l ;34

35 // Provedemo reques t preko k l i j e n t a i spremimo u response36 t ry {37 re sponse = c l i e n t . execute ( r eque s t ) ;38 } catch ( Cl i entProtoco lExcept ion e ) {39 // Hvatanje i zn imki40 e . pr intStackTrace ( ) ;41 } catch ( IOException e ) {42 // Hvatanje i zn imki43 e . pr intStackTrace ( ) ;44 }45

46 // InputStream kor i s t imo za primanje podataka u ob l ikubyteova

47 InputStream in = nu l l ;48 t ry {49 // Preuzimamo odgovor i upisujemo ga u InputStream50 in = response . ge tEnt i ty ( ) . getContent ( ) ;51 } catch ( I l l e g a l S t a t eEx c ep t i o n e ) {52 // Hvatanje i zn imki53 e . pr intStackTrace ( ) ;54 } catch ( IOException e ) {55 // Hvatanje i zn imki56 e . pr intStackTrace ( ) ;57 }58

59 // Deklariramo c i t a c u k o j i pretvara InputStream i z byte uchar ob l i k

60 // Za prevod j en j e b i tova i z input streama kor i s t imoInputStreamReader

61 BufferedReader reader = new BufferedReader (newInputStreamReader ( in ) ) ;

62

63 // Deklariramo St r i ngBu i l d e r k o j i ce s p o j i t i pre tvorene charv a r i j a b l e u

64 // Str ingove65 St r i ngBu i l d e r s t r = new St r ingBu i l d e r ( ) ;66 St r ing l i n e = nu l l ;67 t ry {68 // Sve dok imamo teksta , appendamo ( p r i l j e p l j u j emo ) ga na

St r ing69 // l i n e70 whi le ( ( l i n e = reader . readLine ( ) ) != nu l l ) {71 s t r . append ( l i n e ) ;72 }73 } catch ( IOException e ) {74 // Hvatanje i zn imki75 e . pr intStackTrace ( ) ;

33

Page 34: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

76 }77 t ry {78 in . c l o s e ( ) ;79 } catch ( IOException e ) {80 // Hvatanje i zn imki81 e . pr intStackTrace ( ) ;82 }83

84 // Deklariramo St r ing html u kojeg sve prepisemo85 St r ing html = s t r . t oS t r i ng ( ) ;86

87 t ry {88 // St r ing pretvoren funkci jom stringToMd589 // koju smo d e k l a r i r a l i na kra ju90 St r ing md5 = stringToMd5 ( html ) ;91 } catch ( NoSuchAlgorithmException e ) {92 e . pr intStackTrace ( ) ;93 }94

95 }96

97 // Funkci ja za pre tva ran j e St r inga u novi s t r i n g98 // k o j i sadrzava njegov MD5 Checksum99 pub l i c S t r ing stringToMd5 ( St r ing s ) throws

NoSuchAlgorithmException {100 // MessageDigest − k la sa koja k o r i s t i jednosmjernu hash

funkc i j u101 MessageDigest md5 = MessageDigest . g e t In s tance ( ”MD5” ) ;102 // U MessageDigest ins tancu postavimo bajtove , poce tn i bajt ,

t e duzinu s t r i n g a103 md5 . update ( s . getBytes ( ) , 0 , s . l ength ( ) ) ;104 // Izvrs imo pretvorbu105 St r ing md5String = new Big Intege r (1 , md5 . d i g e s t ( ) ) . t oS t r i ng

(16) ;106 // Vratimo pr e tvo r en i s t r i n g107 re turn md5String ;108 }109 }

34

Page 35: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

4.2 Drugi primjer: ucitavanje vanjske baze podataka

U ovom primjeru cilj nam je ucitati vanjsku bazu podataka i pri instalacijiaplikacije prekopirati ju u memoriju i koristiti ju u aplikaciji. Bazu cemosnimiti u \assets folder.

Primjer 17. DatabaseHandler.java

1 import java . i o . FileOutputStream ;2 import java . i o . IOException ;3 import java . i o . InputStream ;4 import java . i o . OutputStream ;5

6 import android . content . ContentValues ;7 import android . content . Context ;8 import android . database . Cursor ;9 import android . database . SQLException ;

10 import android . database . s q l i t e . SQLiteDatabase ;11 import android . database . s q l i t e . SQLiteException ;12 import android . database . s q l i t e . SQLiteOpenHelper ;13

14 pub l i c c l a s s DatabaseHandler extends SQLiteOpenHelper {15

16 // Deklariramo ime baze i gdje ju ze l imo sn im i t i17 pr i va t e s t a t i c S t r ing DB PATH = ”/data/data/com . mathos . app/

databases /” ;18 pr i va t e s t a t i c S t r ing DBNAME = ”mathos” ;19

20 // Ucitamo objekt k l a s e SQLiteDatabase21 pr i va t e SQLiteDatabase myDataBase ;22 pr i va t e f i n a l Context myContext ;23

24 // Konstruktor25 pub l i c DatabaseHandler ( Context context ) {26 super ( context , DBNAME, nul l , 1) ;27 t h i s . myContext = context ;28 }29

30 // Metoda u ko j o j pravimo bazu31 pub l i c void createDataBase ( ) throws IOException {32 // Provjer imo da l i baza vec p o s t o j i33 boolean dbExists = checkDataBase ( ) ;34

35 // Ukol iko baza p o s t o j i ne radimo n i s t a36 i f ( dbExists ) {37

38 } e l s e {39 // Ako baza p o s t o j i uzimamo objekt SQLiteDatabase k l a s e40 // i pozivamo metodu copyDataBase ( ) koja kop i ra nasu

35

Page 36: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

41 // vanjsku bazu u novi ob jekt odnosno unutrasnju bazu42 t h i s . getReadableDatabase ( ) ;43 t ry {44 copyDataBase ( ) ;45 } catch ( IOException e ) {46 throw new Error ( ”Error copying database ” ) ;47 }48 }49 }50

51 // checkDataBase ( ) metoda52 pr i va t e boolean checkDataBase ( ) {53 SQLiteDatabase checkDB = nu l l ;54 t ry {55 St r ing myPath = DB PATH + DBNAME;56 checkDB = SQLiteDatabase . openDatabase (myPath , nu l l ,57 SQLiteDatabase .OPENREADWRITE) ;58 } catch ( SQLiteException e ) {59

60 }61

62 i f ( checkDB != nu l l ) {63 checkDB . c l o s e ( ) ;64 }65

66 re turn checkDB != nu l l ? t rue : f a l s e ;67 }68

69 // Metoda za v r s en j e kop i ran ja baze70 pr i va t e void copyDataBase ( ) throws IOException {71 InputStream myInput = myContext . ge tAsse t s ( ) . open (DBNAME) ;72 St r ing outFileName = DB PATH + DBNAME;73 OutputStream myOutput = new FileOutputStream ( outFileName ) ;74

75 byte [ ] bu f f e r = new byte [ 1 0 2 4 ] ;76 i n t l ength ;77 whi le ( ( l ength = myInput . read ( bu f f e r ) ) > 0) {78 myOutput . wr i t e ( bu f f e r , 0 , l ength ) ;79 }80 myOutput . f l u s h ( ) ;81 myOutput . c l o s e ( ) ;82 myInput . c l o s e ( ) ;83 }84

85 // Metoda kojom otvaramo bazu u koju mozemo p i s a t i86 // i i z ko je mozemo c i t a t i87 pub l i c void openDataBase ( ) throws SQLException {88

89 St r ing myPath = DB PATH + DBNAME;

36

Page 37: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

90 myDataBase = SQLiteDatabase . openDatabase (myPath , nu l l ,91 SQLiteDatabase .OPENREADWRITE) ;92 }93

94 @Override95 pub l i c synchron ized void c l o s e ( ) {96 i f (myDataBase != nu l l )97 myDataBase . c l o s e ( ) ;98

99 super . c l o s e ( ) ;100 }101

102 @Override103 pub l i c void onCreate ( SQLiteDatabase db) {104

105 }106

107 @Override108 pub l i c void onUpgrade ( SQLiteDatabase db , i n t o ldVers ion , i n t

newVersion ) {109

110 }111 }

37

Page 38: Ivan Skori c Osnove izrade aplikacija za operativni sustav ...mdjumic/uploads/diplomski/ŠKO03.pdf · sustav odlu ci da ju vi se ne treba, biti ce uklonjena. Aktivnost je u onPause()

Literatura

[1] D. Smith: Android Recipes: A Problem-Solution Approach, First Edi-tion, Apress, 2011.

[2] M. Gragenta: Learning Android, First Edition, O’ Reilly, 2011.

[3] http://http://developer.android.com/guide/components/index.html

38