SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
ZAVRŠNI RAD br. 929
RAZVOJ PROGRAMA ZA DOHVAT I
PREZENTACIJU INFORMACIJA NA
POKRETNOM UREĐAJU S OPERACIJSKIM
SUSTAVOM ANDROID
Matko Kuna
Zagreb, lipanj 2009.
Sadržaj
Uvod ....................................................................................................................................... 1
1. Operacijski sustav Android ............................................................................................ 2
1.1. Osnovne značajke .................................................................................................. 2
1.1.1. Arhitektura ..................................................................................................... 3
1.2. Struktura aplikacije u Androidu ............................................................................. 5
1.2.1. Activity .......................................................................................................... 6
1.2.2. Service ........................................................................................................... 6
1.2.3. Broadcast receiver .......................................................................................... 7
1.2.4. Content provider ............................................................................................ 7
1.2.5. Datoteka manifest .......................................................................................... 8
1.2.6. Aktivacijska komponenta – Intent ................................................................. 8
1.2.7. Životni ciklus activityja ................................................................................. 9
1.3. Razvoj aplikacije u Androidu .............................................................................. 11
1.3.1. Općenito o korisničkom sučelju .................................................................. 12
1.3.2. Izgledi .......................................................................................................... 13
1.3.3. Izbornici ....................................................................................................... 14
1.3.4. Dijalozi ......................................................................................................... 15
1.3.5. Obavještavanje korisnika ............................................................................. 16
2. Sportska prognoza za Android ..................................................................................... 18
2.1. Opis sustava ......................................................................................................... 19
2.1.1. Dijagram slučajeva uporabe ......................................................................... 20
2.1.2. Komunikacija među komponentama ........................................................... 21
2.1.3. Programska izvedba poslužiteljske aplikacije ............................................. 22
2.1.4. Baza podataka .............................................................................................. 24
2.1.5. Aplikacija za rukovanje bazom podataka .................................................... 25
2.2. Sportska prognoza LIVE ..................................................................................... 26
2.2.1. Korisničko sučelje ........................................................................................ 29
2.2.2. Programska izvedba ..................................................................................... 32
Zaključak ............................................................................................................................. 34
Literatura .............................................................................................................................. 35
Sažetak ................................................................................................................................. 36
Ključni pojmovi ................................................................................................................... 36
1
Uvod
Operacijski sustav Android je još uvijek novost u svijetu pokretnih uređaja. Konkurencija
je drugim operacijskim sustavima za pametne pokretne uređaje kao što su Appleov iPhone
OS te razne izvedenice Windows Mobilea i Symbiana. Android karakterizira otvorena
arhitektura sa specifičnim odnosom između aplikacija i prikaza na ekranu te mogućnost da
se promijeni i svaka uobičajena aplikacija koja dolazi s operacijskim sustavom, što govori
dovoljno o fleksibilnosti koju pruža.
Praktični dio ovog završnog rada je aplikacija za Android, no prije svega treba se dobro
upoznati s njegovim načinom funkcioniranja i strukturom aplikacije kako bi se mogle
demonstrirati njegove mogućnosti.
Aplikacija predstavlja nadogradnju Java aplikacije za pokretne uređaje izrađene na
studentskom projektu, no s njom, osim u osnovnom konceptu, nema mnogo dodirnih
točaka. Radi se o sustavu koji omogućuje sudjelovanje u igrama na sreću putem pokretnog
uređaja, s tim da se sva komunikacija odvija putem bežičnog internetskog prijenosa
podataka. Korisniku aplikacije omogućena je uplata kladioničkog listića sa svog osobnog
pokretnog uređaja, kreiranje nedovršenog listića, pregled starih uplata, definiranje postavki
praćenja pojedinih događaja koje uključuju slanje obavijesti korisniku o novim događajima
ili ishodima završenih događaja i prikaz ponuđenih događaja razvrstanih po sportovima i
zemljama odigravanja na zahtjev, pri čemu se vodi briga o korisnikovoj privatnosti i
sigurnosti.
Sve navedeno prilagođeno je operacijskom sustavu Android – posebnostima vezanim uz
prikaz dijelova aplikacija te njihovu komunikaciju i pokretanje. Cilj svega ovoga je
predstaviti Android kao platformu koja podržava kreativnost i inovativnost programera i
koja će biti laka za korištenje i zabavna – kako za programera tako i za korisnika.
Rad se bavi proučavanjem operacijskog sustava Android i načina izrade aplikacija za njega
te izradom sustava za sudjelovanje u igrama na sreću uključujući i korisničku aplikaciju za
Android.
Prvo poglavlje opisuje posebnosti ovog operacijskog sustava, dok su u drugom opisani
izrađeni sustav i aplikacija.
2
1. Operacijski sustav Android
Tvrtka Google izradila je operacijski sustav Android, a Open Handset Alliance izdao je
Android alat za izradu softvera (engl. Software Development Kit, skraćeno SDK) 12.
studenog 2007. i zanimanje za njega neprestano raste. To je programski složaj koji
uključuje operacijski sustav, middleware i ključne aplikacije. SDK sadrži alate i sučelja za
programiranje aplikacija (engl. Application Programming Interface, skraćeno API) koji su
potrebni za razvoj aplikacija na Android platformi koristeći programski jezik Java.
1.1. Osnovne značajke
Android je zamišljen kao operacijski sustav koji će u potpunosti i na najefikasniji način
iskoristit sve resurse i mogućnosti koje mu pruža uređaj na kojemu je instaliran. Dizajniran
je otvoreno, pa tako svaka aplikacija može koristiti sve osnovne funkcionalnosti uređaja
kao što su ostvarivanje poziva, slanje tekstualnih poruka ili, primjerice, korištenje
ugrađenog fotoaparata. Programer aplikacija može izmijeniti cijeli operacijski sustav u
tolikoj mjeri da isti više nema veze s uobičajenim.
Osnova mu je Linux jezgra (engl. kernel) koja koristi specifični virtualni stroj dizajniran
kako bi optimizirao korištenje memorije i hardverskih resursa uređaja koji ga pokreće.
Prednosti toga što je programeru sve dostupno je i to što se nove nadolazeće tehnologije
mogu lako implementirati.
Virtualni stroj sustava zove se Dalvik Virtual Machine i temeljen je na registru, za razliku
od Java Virtual Machinea (skraćeno JVM) koji je temeljen na stogu. DalvikVM je
interpreter, a radi s Dalvik Executable (*.dex) podacima. Pokreće klase kompilirane Java
kompilatorom koje se pretvaraju alatom „dx“ u njemu potreban format. Sve to je
napravljeno s ciljem istovremenog izvođenja više virtualnih strojeva koji koriste malo
memorije kako bi očuvali stabilnost sustava – međusobno se štite kako aplikacija koja se
ruši ne bi za sobom povukla druge. DalvikVM je temeljen na registru jer su procesori za
pokretne uređaje prilagođeni za registarski rad koji omogućava brže izvođenje aplikacija
po cijenu veličine programa koji su veći nakon kompilacije.
3
Sve aplikacije imaju jednaku važnost – operacijski sustav ne pravi razliku između
temeljnih aplikacija i onih instaliranih naknadno. Ta značajka pogoduje korisniku jer može
organizirati sustav po vlastitim željama. Komunikacija u sustavu temelji se na takozvanim
intentima, porukama na koje se reagira određenom radnjom. Za svaku aplikaciju ili njen
dio, može se definirati na koje poruke treba reagirati. Više aplikacija može reagirati na istu
poruku. U tom slučaju sustav pita korisnika koju aplikaciju želi da obradi dolazeći intent.
Kako je svuda naglasak na jednostavnosti, ni izrada aplikacija za Android nije iznimka.
Programer može jednostavno pristupiti svemu što treba, pa se multimedijske aplikacije
mogu napraviti lakše nego za neke druge operacijske sustave. Aplikacije mogu dohvaćati
podatke s Interneta te ih, primjerice, kombinirati s nekim podacima koje se nalaze na
pokretnom uređaju. Lako se može pristupiti GPS prijemniku, kameri ili vanjskoj memoriji
za pohranu podataka, što će u skoroj budućnosti biti olakšavajuća okolnost za razvoj
usluga temeljenih na lokaciji. Također je važna i podrška za razne video i audio formate te
formate slika koje dolaze s Androidom.
Sustav sadrži još i integrirani open source web preglednik, 2D i 3D grafičke biblioteke s
podrškom za hardversku akceleraciju, SQLite sustav za upravljanje i pohranu relacijskih
baza podataka. Upravlja GSM telefonijom, Bluetooth, EDGE, 3G i WiFi tehnologijama,
ugrađenim fotoaparatom, GPS prijemnikom, akcelerometrom za automatsku rotaciju slike
– sve ovisno o uređaju na kojem je instaliran.
1.1.1. Arhitektura
Komponente operacijskog sustava Android dijele se u pet cjelina, kao što je prikazano na
slici 1.1:
• aplikacije,
• aplikacijski okvir (engl. application framework),
• biblioteke,
• Android runtime,
• Linux jezgra.
4
Sl. 1.1 Arhitektura operacijskog sustava Android
Aplikacije čini skup osnovnih aplikacija kao što su e-mail klijet, SMS program, kalendar,
Internet preglednik i druge. Sve aplikacije napisane su u programskom jeziku Java.
Arhitektura aplikacije je napravljena na način da pojednostavi ponovnu upotrebu
komponenti. U aplikacijski okvir spadaju skup elemenata prikaza (engl. Views) koji se
koriste pri izradi aplikacije kao što su liste, gumbi, polja za unos teksta itd., zatim
pružatelji sadržaja (engl. Content Providers) koji omogućuju aplikacijama pristup
podacima drugih aplikacija, upravitelj resursa (engl. Resource Manager) koji omogućuje
pristup ostalim resursima kao što su slike ili dokumenti koji određuju izgled, upravitelj
obavijesti (engl. Notification Manager) koji pruža aplikacijama mogućnost prikaza
obavijesti u traci stanja, upravitelj aktivnosti (engl. Activity Manager) koji upravlja
životnim ciklusom aplikacije i brine se o navigacijskom stogu i drugi.
Biblioteke sadrže skup C/C++ biblioteka koje koriste razne komponente operacijskog
sustava među kojima su System C biblioteka, 3D biblioteke, SQLite i ostale.
U Android Runtime pripadaju osnovne biblioteke koje omogućuju većinu funkcionalnosti
osnovnih biblioteka programskog jezika Java. Svaka aplikacija se odvija u vlastitom
procesu i ima vlastitu instancu Dalvik virtualnog stroja koji se oslanja na Linux jezgru.
5
Android koristi Linux verziju 2.6 za osnovne usluge sustava kao što su sigurnost,
upravljanje memorijom i procesima, mrežni stog i upravljački programi. Jezgra ima i ulogu
apstraktnog sloja između hardvera i softverskog stoga.
1.2. Struktura aplikacije u Androidu
Aplikacije za Android pišu se u programskom jeziku Java. Kompilirani kôd se arhivira u
Android package, označen .apk sufiksom, zajedno sa svim podacima i datotekama nužnim
za aplikaciju. U takvom obliku se aplikacija distribuira i instalira na pokretne uređaje.
Svaka aplikacija radi u vlastitom Linux procesu koji Android pokreće kada se treba izvršiti
bilo koji dio koda aplikacije, a gasi ga kada više nije potreban. Aplikacije se izvršavaju
neovisno jedna o drugoj jer svaka koristi vlastiti virtualni stroj. Također, svaka ima svoj
Linux identifikator (ID). Opće postavke su takve da podatke iz aplikacije vidi jedino sama
aplikacija i korisnik koji je trenutno koristi. Moguće je promijeniti postavke tako da dvije
aplikacije dijele identifikator te tako mogu vidjeti i podatke druge aplikacije. U tom slučaju
može se definirati da obje aplikacije rade u istom procesu kako bi se uštedjeli resursi
sustava.
Važna značajka Androida je da aplikacija može koristiti elemente druge aplikacije (ako se
definiraju dozvole od strane prve aplikacije). Time se smanjuje potreba za pisanjem istih
dijelova u različitim aplikacijama, jer je moguće pokrenuti samo dio aplikacije koji je
potreban drugoj. Android to omogućava na način da ne postoji samo jedna točka ulaska za
svaku komponentu aplikacije – ne postoji main() metoda, već je svaka aplikacija
napravljena od osnovnih komponenti koje sustav može instancirati i pokrenuti po potrebi.
Postoje četiri vrste takvih komponenti, to su:
• Activity,
• Service,
• BroadcastReceiver,
• ContentProvider.
Svaku aplikaciju koja se dizajnira za Android potrebno je razložiti na ove osnovne
elemente i definirati kada i kako se pojedini element pokreće.
6
1.2.1. Activity
Activity predstavlja grafičko korisničko sučelje, ekran koji korisnik u tom trenutku vidi. To
može biti, primjerice, lista s koje korisnik nešto treba odabrati, prikaz slika u albumu ili
ekran u kojem se namještaju postavke neke aplikacije. Aplikacija za pisanje tekstualnih
poruka mogla bi imati jedan activity u kojem se piše poruka, drugi u kojem se prikazuju
kontakti iz imenika i treći za pregled poslanih poruka. Svaki od njih je nezavisan dio
aplikacije iako rade zajedno i dio su iste aplikacije. Svaki od njih je podklasa osnovne
klase Activity.
Koliko će aplikacija imati activityja ili bilo kojih drugih osnovnih komponenti i kako će
one surađivati, stvar je dizajna i namjene aplikacije. Obično aplikacija ima početni activity
koji se prikazuje korisniku kada pokrene aplikaciju. Prelazak s jednog na drugi izvodi se
tako da trenutni activity pokrene onaj koji je potreban.
Pri izradi activityja svakom je dodijeljen njegov vlastiti prozor, koji je inicijalno postavljen
da pokrije cijeli ekran, no to se, naravno, može promijeniti. Svaki activity može koristiti
dodatne elemente prikaza kao što su primjerice pop-up prozori koji zahtijevaju korisnikovu
interakciju ili prozor u koje se prikažu detaljnije informacije o elementu koji je korisnik
trenutno odabrao.
Vizualni sadržaj prozora ima hijerarhijski organiziran sadržaj elemenata prikaza koji su svi
izvedeni iz osnovne klase View. Svaki element pripada određenom prostoru pravokutnog
oblika unutar prozora. Pojam hijerarhijski odnosi se na elemente prikaza, pa tako element
prikaza roditelj organizira i sadrži izgled i raspored elemenata prikaza djece. Postoji skup
gotovih elemenata prikaza sadržanih u Androidu kao što su gumbi, polja za unos teksta,
izbornici, check-boxovi i drugi. Hijerarhija tih elemenata organizira se metodom
Activity.setContentView().
1.2.2. Service
Komponenta service nema grafičko sučelje nego radi u pozadini. Njen životni ciklus nije
ograničen trenutnim prikazom sučelja na ekranu kao kod activityja, ona radi u
neodređenom vremenskom razdoblju. Koristi se za zadatke koji se mogu izvoditi u
pozadini, kao na primjer sviranje glazbe u pozadini dok korisnik radi nešto drugo. Može se
koristiti za dohvat podataka preko mreže ili za izračun nekih podataka koje može isporučiti
activityju koji ih treba. Svaki service je podklasa osnovne klase Service.
7
Dobar primjer je media player aplikacija, koja reproducira pjesme poredane u listu.
Aplikacija bi imala nekoliko activityja u kojima bi se mogle praviti liste, pokretati
reprodukcija i mijenjati postavke, no samu reprodukciju ne bi bilo pametno izvesti unutar
activityja jer se pretpostavlja da ih korisnik često mijenja, a od takve aplikacije se očekuje
da se glazba može nastaviti reproducirati i kada korisnik promijeni activity ili pokrene
neku drugu aplikaciju. To se može izvesti tako da activity aplikacije pokrene service koji
se izvodi u pozadini. Kada korisnik napusti activity u kojemu je pokrenuo reprodukciju,
ona se nastavlja i dalje jer service još uvijek radi. Moguće je povezati se s već pokrenutim
serviceom. Za vrijeme te veze može se s njime komunicirati putem sučelja koje pruža. U
tom sučelju bi se, primjerice, moglo omogućiti da korisnik pauzira, zaustavi ili započne
reprodukciju ispočetka.
Kao i activity i ostale komponente, i service se izvodi u glavnoj dretvi procesa aplikacije.
Kako u ovakvim slučajevima ne bi blokirali druge komponente korisničkog sučelja, mogu
stvoriti novu dretvu za radnje za koje se zna da zahtijevaju više vremena.
1.2.3. Broadcast receiver
Zadatak komponenti ovog tipa je da primaju obavijesti o višeodredišnom razašiljanju
(engl. broadcast) i reagiraju na njih. U radu aplikacija i sustava pojavljuje se mnogo takvih
obavijesti, npr. obavijest da ponestaje napona u bateriji, da se promijenila vremenska zona,
da su, aplikacijama koje ih trebaju, dostupni podaci prikupljeni s Interneta. Aplikacija
može imati bilo koji broj broadcast receivera koji mogu odgovarati na sve informacije
koje se smatraju važnima. Osnovna klasa svakog od njih je BroadcastReceiver.
Ove komponente također nemaju grafičko sučelje, ali mogu pokrenuti određeni activity
kao odgovor na informaciju koju su dobili ili umjesto toga mogu koristiti upravitelja
obavijesti. Takve obavijesti mogu se prikazati na različite načine – kao treperenje
pozadinskog svjetla, vibracija pokretnog uređaja, reprodukcija određenog zvuka. Na traci
stanja pojavi se ikona koju korisnik može odabrati kako bi pročitao obavijest.
1.2.4. Content provider
Ova komponenta se koristi za isporuku skupa podataka aplikacije drugim aplikacijama. Ti
podaci mogu se pohraniti u datotečni sustav kao datoteka ili u obliku SQLite baze
podataka. Osnovna klasa je ContentProvider koja sadrži standardni skup metoda koje
8
omogućuju aplikacijama preuzimanje ili pohranu tipova podataka s kojima rade. Aplikacije
ne pozivaju te metode izravno, nego pomoću objekta ContentResolver. Taj objekt
može komunicirati sa svakim content providerom na način da on upravlja komunikacijom.
Operacijski sustav se brine o tome je li proces pokrenut ili ga treba pokrenuti svaki puta
kada se pojavi zahtjev koji treba obraditi aplikacija koja trenutno nije aktivna. Također,
ako ne postoje instance koje su potrebne, a dio su aplikacije koja treba obraditi zahtjev,
Android ih sam stvara.
1.2.5. Datoteka manifest
Da bi se komponenta aplikacije mogla pokrenuti, Android mora znati da ta komponenta
postoji. To je izvedeno na način da aplikacija deklarira svoje komponente u manifest
datoteci koja je povezana s paketom Android aplikacije .apk. Ta datoteka je strukturirana
XML datoteka i uvijek se zove AndroidManifest.xml, za sve aplikacije. U njoj je
definirano još mnogo drugih stvari kao što su imena biblioteka s kojima aplikacija treba
biti povezana i dozvole koje se dodjeljuju aplikaciji. Android ne vidi komponente koje nisu
deklarirane u manifest datoteci te se one stoga ne mogu izvoditi.
1.2.6. Aktivacijska komponenta – Intent
Asinkrona poruka kojom se aktivira pojedina komponenta naziva se intent. To je objekt
klase Intent u kojemu je sadržaj poruke. Za activity i service ta poruka, između ostalog,
sadrži ime radnje koja se zahtijeva i URI (engl. Uniform Resource Identifier) datoteke nad
kojom ta radnja treba biti obavljena, dok za broadcast receiver sadrži ime radnje koja je
objavljena (npr. može obavijestiti strane koje ga osluškuju da je pritisnut gumb za
pokretanje kamere).
Za aktivaciju svake od komponenti postoje različite metode. Activity se pokreće tako da se
intent objekt pošalje metodi Context.startActivity() ili
Activity.startActivityForResult(). Česta je situacija da jedan activity
pokreće drugi. Ako očekuje neki rezultat od activityja kojeg poziva, koristi drugu
navedenu metodu. Rezultat se također vraća kao intent objekt. Activity koji reagira na
intent, može provjeriti koji intent ga je pokrenuo metodom getIntent(). Service se
pokreće metodom Context.startService(). Metodom
Context.bindService() može se uspostaviti veza između pozivajuće komponente i
9
servicea. Višeodredišno razašiljanje pokreće se tako da se intent objekt pošalje metodi
Context.sendBroadcast(), Context.sendOrderedBroadcast() ili
Context.sendStickyBroadcast().
Intent objekt može eksplicitno navesti ime ciljane komponente – u tom slučaju Android
pronalazi tu komponentu na temelju deklaracija u datoteci manifest i aktivira je. U slučaju
da ciljana komponenta nije imenovana, Android pronalazi najbolju komponentu koja
odgovara tom intentu. To čini tako da intent objekt uspoređuje s intent filtrom
potencijalnih ciljnih komponenti. Filtri obavještavaju operacijski sustav o tome koje vrste
intenta mogu obraditi, što je zapisano u manifest datoteci.
Komponenta može imati neograničen broj intent filtara. Ako nema nijedan, moguće ju je
aktivirati jedino intentom koji eksplicitno imenuje tu komponentu kao ciljnu.
1.2.7. Životni ciklus activityja
Postoje tri stanja u kojima se activity može naći:
• aktivno stanje ili stanje izvođenja – kada je prikazan na ekranu (to je stanje kada
korisnik koristi njegove mogućnosti)
• pauzirano stanje – još uvijek je vidljiv korisniku, no trenutno ga ne koristi. To je
slučaj kada je drugi activity „iznad“ njega, koji je transparentan ili ne pokriva cijeli
ekran. U slučaju da operacijski sustav ima premalo slobodne memorije, može
„ubiti“ takav activity.
• zaustavljeno stanje – drugi activity ga je potpuno prekrio. Još uvijek su sačuvane
sve informacije o stanju. Ovakvi activityji se često „ubijaju“ kada sustavu treba
memorije.
Prelazak iz jednog stanja u drugo događa se pozivom jedne od ovih metoda:
• void onCreate()
• void onStart()
• void onRestart()
• void onResume()
• void onPause()
• void onStop()
• void onDestroy()
10
Kako activity može prijeći iz stanja u stanje prikazano je na slici 1.2.
Sl. 1.2 Dijagram stanja activityja
Sve prethodno navedene metode mogu se nadjačati (engl. override) te se tako može
definirati što treba učiniti kada se promijeni stanje. Jedina nužna metoda je onCreate()
jer se u njoj definiraju početne postavke.
11
Na dijagramu možemo vidjeti tri važna puta:
• cijeli životni ciklus activityja – odvija se između prvog poziva onCreate()
metode do prvog poziva onDestroy() metode. Obuhvaćeno je sve od
definiranja početnih postavki na početku do oslobađanja zauzetih resursa.
• vidljivi ciklus activityja – odvija se između metoda onStart() i onStop().
Korisnik vidi activity na ekranu, što obuhvaća slučajeve kada je korisnik s njime u
interakciji i kada je activity vidljiv iako trenutno nije aktivan.
• aktivni ciklus activityja – odvija se između poziva metoda onResume() i
onPause(). U ovom slučaju, korisnik je u neposrednoj interakciji s activityjem .
Activity se stvara metodom onCreate(), a pokreće metodom onStart(). Tada
activity radi, tj. u aktivnom je stanju. Metodom onPause() prelazi u pauzirano stanje iz
kojega se u aktivno može vratiti pozivom metode onResume(). Da bi se vratio u prvi
plan iz stanja kada se ne vidi na ekranu, mora se pozvati metoda onRestart(). Gasi se
metodom onDestroy().
Operacijski sustav se brine za pohranu stanja activityja ako ga treba srušiti kako bi
oslobodio memoriju. Da bi to bilo moguće, treba implementirati metodu
onSaveInstanceState(), koju Android poziva kada postoji mogućnost da će
activity biti srušen – dakle prije poziva onPause() metode. Stvara se Bundle objekt u
koji se pohranjuje trenutno stanje activityja u obliku parova ime-vrijednost. Kada se taj
activtiy ponovo pokreće, Bundle objekt se predaje metodama onCreate() i
onRestoreInstanceState() (koja se izvršava nakon onStart() metode) kako bi
se moglo vratiti stanje u kojem je activity bio prije nego je srušen.
1.3. Razvoj aplikacije u Androidu
Svaka aplikacija mora imati korisničko sučelje. Android stavlja na raspolaganje velik izbor
elemenata grafičkog korisničkog sučelja. U ovom poglavlju opisat će se većina elemenata
korištenih u praktičnom dijelu ovog rada.
12
1.3.1. Općenito o korisničkom sučelju
U aplikaciji za Android korisničko sučelje se sastoji od objekata tipa View i ViewGroup.
Tih elemenata ima mnogo, a zajedničko ime je da su svi podklase osnovne klase View.
Podklase se zovu widgeti i one su objekti korisničkog sučelja koji se mogu implementirati
(primjerice polja za unos teksta ili gumbi). Klasa ViewGroup je osnova za podklase koje
se zovu izgledi (engl. layouts), a one nude različite vrste arhitekture izgleda kao što su
linearna, tablična ili relativna.
View objekt je struktura podataka čija obilježja pohranjuju parametre izgleda i sadržaj za
specifični pravokutni dio ekrana. Kao objekt u korisničkom sučelju, pojedini element
prikaza je također i točka interakcije za korisnika i primatelj događaja interakcije.
Korisničko sučelje activityja definira se kao hijerarhija View i ViewGroup elemenata,
kao što je prikazano na slici 1.3. Gradi se od unaprijed definiranih widgeta i izgleda ili
vlastitih izrađenih elemenata prikaza.
Sl. 1.3 Hijerarhija elemenata prikaza
Da bi se elementi prikazali na ekranu, unutar activityja se mora pozvati metoda
setContentView() i proslijediti referenca korijenskom objektu. Android pomoću te
reference izmjeri i nacrta hijerarhijsko stablo, a korijenski čvor zatim zahtijeva da čvorovi
djeca nacrtaju sami sebe – svaki ViewGroup čvor poziva svaki svoj čvor dijete da to
učini. Android parsira elemente izgleda po redu, instancira elemente prikaza i dodjeljuje ih
čvorovima roditeljima. Kako se crtaju redom, ako postoji preklapanje između elemenata
bit će vidljivi oni koji su na tom području posljednji nacrtani.
13
1.3.2. Izgledi
Uobičajeni i najjednostavniji način definiranja izgleda i hijerarhije elemenata prikaza je
korištenje XML datoteke izgleda, koja pruža dobar i lako čitljiv pregled strukture. Svaki
element u toj datoteci je ili View ili ViewGroup objekt. Elementi prikaza se mogu
stvarati i izravno iz aplikacije i njima se može upravljati u samom kodu.
Ime XML elementa je jednako Java klasi koju taj element predstavlja (npr. <TextView>
element stvara TextView u korisničkom sučelju), a imena atributa odgovaraju
metodama. Kada u komponentu aplikacije učitamo resurs izgleda, Android inicira te
runtime objekte koji odgovaraju elementima u datoteci izgleda. Prednost deklariranja
korisničkog sučelja XML datotekom je u tome što se time odvaja prikaz aplikacije od koda
koji upravlja njenim ponašanjem. Takva datoteka izgleda ovako:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ovo je TextView" /> </LinearLayout>
Elementi prikaza se mogu organizirati na više različitih načina koristeći različite grupe
elemenata prikaza, kao što su LinearLayout, RelativeLayout, TableLayout,
GridLayout i drugi. Svaki od njih pruža jedinstven skup parametara izgleda koji
određuju pozicije elemenata prikaza i strukturu izgleda.
Svaka datoteka izgleda ima točno jedan korijenski element koji je objekt tipa View ili
ViewGroup. Svi ostali objekti ili widgeti dodaju se kao elementi djeca te se tako
postupno gradi struktura stabla. Kada se aplikacija kompilira, svaka XML datoteka izgleda
se kompilira u resurs elemenata prikaza, koji se mora učitati u kodu aplikacije na ovaj
način:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView.(R.layout.main_layout); }
14
U ovom slučaju, kao resurs se učitava XML datoteka main_layout.xml, što se događa
pri svakom pokretanju activityja (jer Android poziva metodu onCreate() pri svakom
pokretanju activityja).
Svaki View i ViewGroup objekt podržava skup raznih XML atributa. Neki od njih su
specifični za pojedine View objekte, no njih imaju i objekti koji nasljeđuju tu klasu. Neke
atribute imaju svi objekti jer ih nasljeđuju od korijenske klase. Svi ostali smatraju se
parametrima izgleda i opisuju orijentaciju View objekta. View objekt može imati integer
ID koji je jedinstvena identifikacijska oznaka tog elementa prikaza u stablu kojemu
pripada. Pri kompiliranju aplikacije, ID se referencira kao integer, no u XML datoteci se
definira kao string.
1.3.3. Izbornici
Aplikacijski izbornici su često korišten dio korisničkog sučelja pomoću kojeg se mogu
koristiti funkcije aplikacije i mijenjati njene postavke (Sl. 1.4). Struktura im se također
stvara pomoću hijerarhije elemenata prikaza, no nju se tako ne definira. Umjesto toga,
definiraju se onCreateOptionsMenu() ili onCreateContextMenu() metode za
activity i deklariraju se elementi koje se žele uključiti u izbornik. Pri pokretanju će Android
automatski stvoriti hijerarhiju elemenata prikaza i nacrtati svaki element izbornika. Kao i
izgled aplikacije, elementi izbornika se također mogu definirati u XML datoteci.
Sl. 1.4 Primjer izbornika u Androidu
15
U Androidu postoje tri osnovne vrste aplikacijskih izbornika:
• izbornik opcija – osnovni skup elemenata izbornika za activity. Otvara se kada se
pritisne gumb MENU na uređaju koji ima operacijski sustav Android.
• izbornik konteksta – predstavlja listu elemenata izbornika koja se može pojaviti
kada se duže pritisne određeni element prikaza.
• pod-izbornik – predstavlja listu elemenata izbornika koju prikaže element izbornika
opcija ili izbornika konteksta. Ne podržava ugniježđene pod-izbornike.
1.3.4. Dijalozi
Dijalog je obično mali prozor koji se pojavi iznad trenutno aktivnog activityja, koji ode u
stanje pauze dok dijalog preuzme svu interakciju s korisnikom. Koriste se za obavijesti i
kratke aktivnosti koje su u neposrednom odnosu s aplikacijom koja se izvodi. Primjer se
može vidjeti na slici 1.5.
Sl. 1.5 Primjer dijaloga u Androidu
Android API podržava sljedeće vrste dijaloga:
• AlertDialog – dijalog koji može upravljati s jednim, dva ili tri gumba i s listom
elemenata koji se mogu odabrati radio gumbom ili check-boxom. To je preporučeni
tip dijaloga jer može napraviti većinu korisničkih sučelja tipa dijaloga.
16
• ProgressDialog – dijalog koji prikazuje indikator tijeka (engl. progress wheel,
progress bar). Kako on samo proširuje mogućnosti AlertDialoga, može koristiti i
gumbe.
• DatePickerDialog – dijalog koji omogućuje korisniku da odabere datum.
• TimePickerDialog – omogućuje korisniku da odabere vrijeme.
Ako se želi napraviti novi tip dijaloga, kao osnova se uzme osnovni objekt Dialog koji se
može uređivati kao i bilo koji activity – XML datotekom. Takav dijalog može sadržavati
bilo koji element prikaza, uključujući i gore navedene podklase.
Kada se dijalog želi prikazati, treba se pozvati metoda showDialog(int) iz activityja,
pri čemu joj se predaje argument tipa integer koji je jedinstveni identifikator dijaloga koji
se želi prikazati, ali nije obavezan. Dijalog se zatvara pozivom metode dismiss().
1.3.5. Obavještavanje korisnika
U radu aplikacije mogu se pojaviti situacije kada je potrebno korisnika obavijestiti o
događaju koji se upravo dogodio u aplikaciji. Neki događaji zahtijevaju korisnikov
odgovor dok drugi to ne traže.
Postoje tri vrste takvih poruka:
• Toast obavijest – kratka poruka koja dolazi iz pozadine. Koristi se za obavijesti o
uspješnosti neke radnje (primjerice, da je datoteka pohranjena).
• Obavijest trake stanja – stalni podsjetnici koji dolaze od aplikacija koje rade u
pozadini i očekuju da korisnik reagira na tu obavijest kada njemu to bude
prikladno.
• Obavijest dijaloga – obavijesti povezane s activityjem. Ako aplikacija obavlja neki
posao čiji završetak korisnik mora pričekati (kao npr. učitavanje datoteke),
obavještava ga o tome prozorom u kojemu je prikazan indikator tijeka.
Toast obavijest se samo kratko prikazuje ispred trenutnog activityja, zauzima malo
prostora i ne mijenja stanje activityja – on se i dalje vidi i ostaje interaktivan. Može ga
koristiti i service koji radi u pozadini i bit će prikazan i ako aplikacija nije aktivna. Ova
vrsta obavijesti ne podržava nikakav oblik interakcije, jer za tu namjenu postoji obavijest
trake stanja. Primjer toasta prikazan je na slici Sl. 1.61.6.
17
Sl. 1.6 Primjer toast obavijesti
Obavijesti trake stanja postavljaju ikonu na traku stanja operacijskog sustava (koja može
sadržavati kratki tekst) i proširenu obavijest u prozor „Notifications“. Kada korisnik
odabere proširenu poruku, Android šalje intent koji se definira za tu vrstu obavijesti, a
najčešće je to pokretanje activityja.
18
2. Sportska prognoza za Android
Sportska prognoza je sustav koji omogućuje sudjelovanje u igrama na sreću korištenjem
osobnog pokretnog uređaja s operacijskim sustavom Android. Korisniku su na
raspolaganju dvije aplikacije za Android, koje mu omogućuju uplatu kladioničkog listića
sa svog pokretnog uređaja te niz mogućnosti vezanih uz ovu vrstu igara na sreću.
Kako bi se usluga mogla koristiti, potrebno je instalirati dvije aplikacije za Android na
osobni pokretni uređaj te se registrirati u kladionici kao korisnik usluge. Aplikacije vode
korisnika kroz cijeli proces uplate listića – od prijave na sustav, pregleda događaja i
filtriranja po sportovima i kategorijama do realizacije uplate i praćenja pojedinih rezultata.
Sve informacije koje su mu potrebne korisnik može dobiti na svoj pokretni uređaj u bilo
koje vrijeme. Komunikacija s poslužiteljskom aplikacijom kladionice se odvija bežičnim
internetskim pristupom (Wi-Fi, EDGE, UMTS).
Pojednostavljeni prikaz komponenti sustava može se vidjeti na slici 2.1.
Sl. 2.1 Komponente sustava Sportska prognoza
19
2.1. Opis sustava
Sustav Sportska prognoza sastoji se od pet komponenti. Središnja komponenta, koja
upravlja logikom, obrađuje zahtjeve, šalje potrebne podatke korisničkim aplikacijama i
upravlja svom ostalom komunikacijom je poslužiteljska aplikacija i ona pripada sustavu
kladionice. Sva komunikacija s bazom podataka, čak i upis novih događaja u bazu, odvija
se preko ove aplikacije. Ona je i poslužitelj i klijent, jer osim što čeka i obrađuje zahtjeve
korisničkih aplikacija, šalje podatke o novim događajima (ako su za to namještene
postavke) kada se oni unesu u bazu podataka.
Glavni dio praktičnog dijela ovog rada je aplikacija za Android po imenu Sportska
prognoza LIVE. Ta korisnička aplikacija omogućuje namještanje postavki praćenja
pojedinih sportova. Postavke se šalju poslužiteljskoj aplikaciji koja ih sprema u bazu.
Korisnik tako može definirati želi li primati obavijesti o novim događajima koji se unesu u
bazu. Također može aktivirati praćenje rezultata događaja s listića koji je uplatio.
Aplikacija je usko povezana s drugom korisničkom aplikacijom po imenu Sportska
prognoza, čijem pregledniku može proslijediti primljene događaje koje korisnik može
staviti na novi listić.
Aplikacija za Android, Sportska prognoza, pruža svu funkcionalnost vezanu uz kladioničke
listiće. Omogućuje dohvat događaja koji se mogu filtrirati po sportovima i kategorijama,
kreiranje novog listića, spremanje nedovršenih listića (na koje se mogu i dodavati događaji
koje primi aplikacija Sportska prognoza LIVE), pregled odigranih listića te upravljanje
opcijama vezanim uz prijavu na sustav kladionice.
Aplikacija za rukovanje bazom podataka služi za lakši i pregledniji unos podataka u bazu.
Pazi na podatke koji se unose i onemogućava unos nepotpuno definiranog događaja.
Podatke ne unosi direktno, nego preko poslužiteljske aplikacije. Ima mogućnost unosa
ishoda događaja nakon što se odigra.
U bazu podataka pohranjuju se svi podaci važni za kladionički sustav – informacije o
korisnicima usluge, njihovim postavkama praćenja, uplaćenim listićima te događajima s
kojima se može sudjelovati u igri, čiji su svi podaci u jednoj tablici. Događaji su
podijeljeni u kategorije kako bi korisnik mogao definirati praćenje i dohvat samo
određenih sportova. Pristup bazi ima samo poslužiteljska aplikacija.
20
Dijagram prikazan na slici 2.2 daje uvid u poslove koje obavljaju pojedini dijelovi sustava.
Sl. 2.2 Dijelovi sustava i njihove funkcionalnosti
2.1.1. Dijagram slučajeva uporabe
Sl. 2.3 Dijagram slučajeva uporabe za sustav Sportska prognoza
Slika 2.3 prikazuje dijagram slučajeva uporabe sustava.
21
Korisnik aplikacija za Android ima na raspolaganju niz mogućnosti. Korištenjem
aplikacije Sportska prognoza može bežičnim internetskim pristupom dohvatiti podatke o
događajima s kojima može sudjelovati u igri. Prije dohvaćanja može odrediti koje događaje
želi, tako što koristi filtar događaja po sportovima i kategorijama. Iz primljene liste
događaja, odabire one koje želi te kreira novi listić. Listić ne mora uplatiti, već ga može
spremiti kao nedovršeni i mijenjati ga ili uplatiti kasnije. Kada se za to odluči, upisuje u
listić iznos kojim želi sudjelovati u igri i šalje ga poslužiteljskoj aplikaciji kladionice koja
potom listić pohranjuje u bazu podataka kladionice. Vrši se naplata iznosa koja se također
evidentira u bazi. Uplaćeni listić se pohranjuje i u aplikaciji, kako bi ga korisnik kasnije
mogao pregledati, ako to želi.
Aplikacija Sportska prognoza LIVE proširuje mogućnosti sustava slanjem obavijesti o
događajima koje korisnik može definirati u aplikaciji. Može odabrati želi li pratiti rezultate
događaja koji su na uplaćenom listiću i može uključiti primanje obavijesti o novim
događajima koji se unesu u bazu. Događaje koje želi pratiti može filtrirati po sportovima.
Nakon što definira postavke, šalje ih poslužiteljskoj aplikaciji kladionice koja podatke o
praćenju sprema u bazu. Poslužiteljska aplikacija šalje korisniku obavijest kada se odigra
događaj koji je na njegovom listiću, a obavještava ga i o tome je li listić dobitan ili ne, kada
se završe svi događaji s uplaćenog listića. Kada se u bazu unese novi događaj, a korisnik
ima aktivirano praćenje njegove kategorije, šalje se obavijest o novom dostupnom
događaju. Iz obavijesti korisnik može proslijediti događaj aplikaciji Sportska prognoza,
koja ga prikazuje u svom pregledniku i iz kojega može dodati na novi ili nedovršeni listić.
Broj listića koje korisnik može uplatiti nije ograničen.
2.1.2. Komunikacija među komponentama
U sustavu postoje četiri komunikacijska toka. Jedini dvosmjeran tok je između aplikacija
za Android i poslužiteljske aplikacije. Aplikacija Sportska prognoza komunicira s
poslužiteljskom aplikacijom prilikom (filtriranog) dohvaćanja parova i prilikom uplate
listića. U oba slučaja, korisnička aplikacija se ponaša kao klijent i šalje zahtjeve koje
poslužiteljska aplikacija obrađuje te šalje odgovore.
U slučaju komunikacije Sportske prognoze LIVE i poslužiteljske aplikacije, obje imaju
uloge i klijenta i poslužitelja. Sportska prognoza LIVE ima ulogu klijenta kada šalje
podatke o postavkama, no u slučaju primanja obavijesti, ima ulogu poslužitelja koji
neprestano očekuje nove obavijesti.
22
Komunikacija između dviju korisničkih aplikacija se uspostavlja kada Sportska prognoza
LIVE šalje podatke o primljenom novom događaju aplikaciji Sportska prognoza, koja ga
prikazuje u svom pregledniku i iz njega stvara novi ili nadopunjuje nedovršeni listić.
Aplikacija za rukovanje bazom podataka komunicira s bazom posredstvom poslužiteljske
aplikacije, koja jedina izravno komunicira s bazom i izvršava sve upite. Komunikacija je
jednosmjerna jer aplikacija unosi ili novi događaj u bazu, ili ishod odigranog događaja.
Povratnu poruku o uspješnost upisa dobiva poslužiteljska aplikacija.
2.1.3. Programska izvedba poslužiteljske aplikacije
Poslužiteljska aplikacija zove se SocketServerSP. Napravljena je u Eclipse razvojnoj
okolini (verzija 3.4.2) u programskom jeziku Java. Ova aplikacija je središnji dio sustava i
komunicira sa svim ostalim komponentama. Sastoji se od pet klasa (Sl. 2.4):
• SocketServer.java,
• ConnectionHandler.java,
• MessageHandler.java,
• DBConnector.java,
• NotificationSender.java.
Prva navedena klasa, SocketServer, glavni je dio poslužiteljske aplikacije. Za svako
spajanje na poslužiteljsku aplikaciju koje iniciraju korisničke aplikacije ili aplikacija za
rukovanje bazom, ova klasa stvara novi objekt ConnectionHandler koji upravlja
stvorenom vezom i kojemu se kao parametar predaje stvorena konekcija. Veza služi za
razmjenu podataka između aplikacija ili za upis podataka u bazu.
ConnectionHandler također ima važnu ulogu. Osim što upravlja stvorenom vezom,
omogućuje višenitno izvođenje na način da svaki objekt ove klase stvara novu nit, čime se
omogućava prihvaćanje više veza odjednom. Objekt ove klase razmjenjuje poruke sa
stranom koja je inicirala vezu koristeći ulazni i izlazni tok podataka koji se stvara na
temelju dobivene veze preko priključnice. Zadaća ove klase je i upisivanje i mijenjanje
podataka u bazi – promjene se događaju prilikom unosa novih događaja putem aplikacije
za rukovanje bazom, slanja novog listića iz aplikacije Sportska prognoza i slanja postavki
praćenja iz aplikacije Sportska prognoza LIVE.
23
Klasa MessageHandler je pomoćna klasa koja služi ConnectionHandleru za slanje
poruka. Napravljena je zbog preglednije podjele poslova i bolje kontrole nad izvođenjem
slanja poruka. Metoda sendMessage() omogućuje slanje više vrsta objekata – stringovi
koji služe kao kontrolne poruke te pojedinačno i grupno slanje novih događaja u obliku
liste objekata tipa VirtualEvent.
DBConnector je klasa koja upravlja unosom, dohvatom i promjenama podataka u bazi.
Pri stvaranju svake nove veze, ConnectionHandler instancira novi objekt ove klase
koji uspostavlja vezu s bazom metodom setDBConnection(). Svaka komunikacija s
bazom se odvija pozivanjem odgovarajućih metoda. Tako se primjerice kod prijave
korisnika na sustav uspoređuju uneseni podaci s onima u bazi metodom
checkLoginInformation(), unos podataka u bazu od strane aplikacije za rukovanje
bazom vrši se metodama insertInBase() i setEventResult(), uplata novog
listića izvršava se metodom insertNewBetInDB(), a za namještanje praćenja služe
metode setTrackInDB() i setResultTrackInDB().
Posljednja klasa, NotficationSender, predstavlja klijentski dio poslužitelja koji se
spaja na korisničku aplikaciju Sportska prognoza LIVE. Zadužena je za slanje obavijesti o
novom događaju u ponudi ili rezultatu odigranog, ako je korisnik aktivirao praćenje.
Važno je spomenuti i klasu VirtualEvent, koja se koristi kao eksterna .jar datoteka u
obje korisničke i u poslužiteljskoj aplikaciji. U njoj je definiran format poruke kojom se
razmjenjuju podaci o događajima u sustavu. Sadrži sve informacije o pojedinom događaju
te korisnikov odabir koji se odnosi na taj događaj (engl. tip).
Sl. 2.4 Klasni dijagram poslužiteljske aplikacije
24
2.1.4. Baza podataka
Baza podataka u ovom sustavu zove se „spbaza“. To je MySQL baza izrađena u Eclipse
razvojnoj okolini, verzija 3.4.2, sa SQL Explorer pluginom. Za uređivanje je korišten i
program MySQL GUI Tools 5.0.
U bazi se pohranjuju podaci o korisnicima sustava, njihove postavke praćenja i stanje na
računu, podaci o uplaćenim listićima i podaci o događajima koji su dostupni korisnicima.
Četiri stalne tablice čine ovu bazu (Sl. 2.5):
• tablica „evidencija“ – služi za pohranu podataka o listićima koji su u igri.
• tablica „login“ – sadrži podatke o korisnicima sustava koji su bitni kladionici.
Vrijednost atributa USER_ADDRESS je podatak o trenutnoj IP adresi i vratima na
kojima korisnik čeka obavijesti ako je aktivirao opcije praćenja u aplikaciji
Sportska prognoza LIVE. U atribute TRACE_CHECK i
TRACE_RESULT_CHECK se zapisuje je li korisnik aktivirao praćenja.
• tablica „parovi“ – u njoj su zapisane sve informacije vezane uz pojedini događaj
(kategorije, imena sudionika, vrijeme odigravanja i ponuđeni koeficijenti).
• tablica „pref_sport“ – služi za definiranje postavki praćenja. Svaki događaj ima
oznaku sporta i kategorije (npr. zemlja odigravanja). Postoji i tablica „pref_categ“
pomoću koje se može implementirati praćenje po dodatnim kategorijama.
Sl. 2.5 Primjer stanja baze podataka s jednim uplaćenim listićem
25
Za svaki uplaćeni listić u bazi se stvara nova tablica koja u sebi ima informacije o
identifikacijskom broju svakog događaja koji je na listiću, tip za pojedini događaj koji je
korisnik odigrao, pripadajući koeficijent i stupac koji označava je li rezultat evidentiran.
Kao ilustracija tablice, na slici 2.6 se može vidjeti izgled tablice „login“.
Sl. 2.6 Tablica login
2.1.5. Aplikacija za rukovanje bazom podataka
Jednostavna aplikacija, imena BazaGUI, napravljena je kako bi se pojednostavio unos
podataka o novim događajima u bazu. Napravljena je u Eclipse razvojnoj okolini u Java
programskom jeziku. Aplikacija ne može direktno unositi podatke u bazu, nego to čini
posredstvom poslužiteljske aplikacije. Ta odluka donesena je iz sigurnosnih razloga.
Aplikacija se sastoji od dvije klase:
• BazaGUI.java – klasa u kojoj je definiran izgled aplikacije
• SocketClientGUI.java – klasa kojom se aplikacija spaja s poslužiteljskom
aplikacijom i u kojoj se šalju poruke koje iniciraju unos podataka u bazu.
Na slici 2.7 je prikazan izgled ove aplikacije.
Sl. 2.7 Aplikacija za rukovanje bazom podataka
26
2.2. Sportska prognoza LIVE
Ova aplikacija za operacijski sustav Android usko je vezana za aplikaciju Sportska
prognoza. Proširuje mogućnosti sustava za sudjelovanje u igrama na sreću dodajući
mogućnosti praćenja ishoda događaja s uplaćenog korisnikovog listića i praćenja novih
događaja koji se pojave u ponudi kladionice.
Pri svakoj promjeni postavki praćenja, aplikacija zahtjeva od korisnika prijavu na sustav
bez mogućnosti pamćenja prijave. To je napravljeno iz sigurnosnih razloga, kako nitko
osim korisnika ne bi mogao promijeniti postavke praćenja. Korisniku su na raspolaganju
dvije opcije praćenja. Može odabrati koje sportove želi pratiti tako da iz liste ponuđenih
odabere one koji ga zanimaju. U izbor je uključena i opcija praćenja svih sportova.
Pritiskom na gumb, šalje odabrane postavke poslužiteljskoj aplikaciji koja podatke
zapisuje u bazu. Druga opcija uključuje praćenje ishoda s uplaćenih listića.
Može se reći da je to klijentska aplikacija, jer šalje zahtjeve poslužitelju, a on ih obrađuje.
No aktivacijom opcija praćenja, ova aplikacija postaje i svojevrsni poslužitelj – aktivira
stalno osluškivanje na IP adresi i vratima koje pošalje poslužiteljskoj aplikaciji. Na toj
priključnici očekuje obavijesti, koje mogu biti dvije vrste:
• tekstualna obavijest – sadrži podatke o rezultatu pojedinog događaja ili o ishodu
odigranog listića (dobitan ili nije dobitan). Obavijest se pojavljuje u traci stanja
operacijskog sustava.
• tekstualna obavijest i objekt VirtualEvent – obavještava o novom događaju u
ponudi kladionice (koji je iz kategorije sporta za koju korisnik ima aktivirano
praćenje). Otvaranjem cijele poruke, korisnik može vidjeti zadnju pristiglu
obavijest i ukupan broj pristiglih te iste odbaciti ili proslijediti pregledniku
aplikacije Sportska prognoza, iz koje se događaji mogu staviti u novi ili postojeći
nedovršeni listić. I ova obavijest se pojavljuje u traci stanja.
Iz svega navedenog se može zaključiti da postoje dva toka komunikacije – dvosmjerni sa
poslužiteljskom aplikacijom i jednosmjerni s aplikacijom Sportska prognoza.
27
Sl. 2.8 Slijedni dijagram uobičajenog scenarija
Na slijednom dijagramu prikazanom na slici 2.8 može se vidjeti tko s kime komunicira.
Prikazan je uobičajeni scenarij koji, naravno, ne obuhvaća svu komunikaciju koja se može
pojaviti.
Ovaj scenarij prikazuje komunikaciju u ovom dijelu sustava u slučaju da se sve radnje
obave uspješno, kako bi se pojasnio tijek radnji. Nisu prikazane kontrolne poruke. Pri
svakom unosu ili promjeni postavki, u aplikaciji Sportska prognoza LIVE potrebno je
28
upisivati korisničke podatke koji se provjeravaju u bazi podataka. Nakon toga moguća je
pohrana postavki. O svakom novom unesenom događaju, poslužiteljska aplikacija odmah
obavještava korisničku aplikaciju. Za pregled pristiglih događaja, aplikacija koristi
preglednik druge korisničke aplikacije, koji pokreće slanjem odgovarajućeg intenta. Pritom
se aktivira samo ta komponenta aplikacije Sportska prognoza. Time je iskorištena jedna od
osnovnih značajki operacijskog sustava Android – svaka aplikacija može pokrenuti dio
druge aplikacije koji treba, bez da se pokreće cijela aplikacija.
Sl. 2.9 Slijedni dijagram programske izvedbe aplikacije Sportska prognoza LIVE
29
Slijedni dijagram na slici 2.9 služi kao pojašnjenje pojedinih elemenata dijagrama sa slike
2.8. Prikazuje radnje koje se odvijaju unutar aplikacije Sportska prognoza LIVE i njenu
strukturu. Detaljniji opis programske izvedbe navedene aplikacije je u poglavlju 2.2.2.
2.2.1. Korisničko sučelje
Aplikacija Sportska prognoza LIVE koristi više standardnih elemenata prikaza
operacijskog sustava Android. Pokretanjem aplikacije otvara se početni ekran, koji je
prikazan na slici 2.10.
Sl. 2.10 Početni ekran aplikacije
Cijeli ekran ima tip izgleda LinearLayout. Elementi prikaza od kojih se sastoji ovaj
ekran su tri TextViewa, dva check-boxa i dva gumba. TextView elementi su definirani
kao resursi u XML datoteci strings.xml. U main.xml datoteci definiran je izgled
cijelog ekrana i svih elemenata prikaza. Moguć je odabir vrijednosti raznih atributa za sve
elemente, od uobičajenih kao što su veličina i stil slova i položaj u odnosu na druge
elemente do vrijednosti razine transparentnosti pojedinog elementa, dodavanja sjena i
omogućavanja zvučnih efekta. Svi elementi imaju definirane visinu i širinu, čije su
vrijednosti ili fill_parent ili wrap_content. Gumb za praćenje rezultata je
onemogućen dok god se ne odabere ta mogućnost u check-boxu iznad.
Sve postavke se pamte i nakon izlaza iz aplikacije. To je izvedeno pomoću Androidovog
objekta SharedPreferences. On omogućuje pohranu i ponovno učitavanje
30
primitivnih tipova podataka koji se pohranjuju u parovima ključ-vrijednost. U slučaju ove
aplikacije se tako pamti odabir check-boxova koji omogućuju praćenje(ključ je tipa
boolean) i onih koji definiraju koje sportove korisnik prati. Za čitanje i upisivanje tih
vrijednosti koristi se metoda getSharedPreferences().
Kada korisnik odabere check-box za praćenje sportova, prikazuje se dijalog tipa
AlertDialog, koji je prikazan na slici 2.11.
Sl. 2.11 Dijalog za odabir sportova
Kao resurse koristi podatke iz datoteke arrays.xml. Svaki sport ima svoj check-box čija
se vrijednost također pamti u objektu SharedPreferences. Ako nijedan sport nije
odabran, korisniku je na početnom ekranu na raspolaganju opcija „Otkaži praćenje
sportova“. Kada odabere sportove iz dijaloga, gumb se mijenja u „Aktiviraj praćenje
sportova“. Kako bi mogao poslati postavke poslužiteljskoj aplikaciji, mora prvo unijeti
svoje korisničke podatke u dijalogu koji se pojavi kada se pritisne bilo koji od dva gumba.
Izgled tog dijaloga definiran je datotekom login_dialog.xml, a sastoji se od dva
elementa TextView, dva gumba i dva EditText elementa.
Obavijesti koje aplikacija može primati od poslužiteljske aplikacije su obavijesti trake
stanja. One se prikazuju neovisno o tome je li aplikacija aktivna ili nije. Kada obavijest
stigne, u traci stanja pojavi se ikona, a odmah pored nje obavijest da je primljen događaj.
Kada korisnik otvori traku stanja, prikazuje se cijela obavijest u kojoj je ispisan posljednji
događaj koji je pristigao od korisnikovog zadnjeg pogleda te ukupan broj novih pristiglih
31
obavijesti. Ako se iz prikazanog prozora odabere obavijest, šalje se intent aplikaciji
Sportska prognoza te se svi pristigli događaji prosljeđuju njenom pregledniku, u kojemu se
mogu birati događaji koji se želi staviti u novi ili nedovršeni listić. Također postoji i opcija
odbacivanja svih pristiglih događaja. Izgled obavijesti pristiglih u traku stanja može se
vidjeti na slici 2.12.
Sl. 2.12 Obavijest o novom događaju u traci stanja
Preglednik aplikacije Sportska prognoza je activity čiji je izgled definiran datotekom
view_bet.xml. To je prazan ekran koji sadrži samo element ListView. Popunjava se
dinamički, kada u aplikaciju pristigne lista događaja.
U manifest datoteci aplikacije Sportska prognoza LIVE definirane su njene komponente,
po jedan activity i service. Tu su, između ostalog, i dozvole aplikacije:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission Android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Aplikacija može pristupiti Internetu, ima dozvolu za korištenje vibracijske funkcije
pokretnog uređaja i može se pokrenuti pri pokretanju uređaja, što se sve vidi iz priloženog.
Dozvola za pokretanje čim se pokrene uređaj dodana je kako bi se odmah mogao pokrenuti
service koji očekuje obavijesti od poslužiteljske aplikacije.
32
2.2.2. Programska izvedba
Sportska prognoza LIVE izrađena je u Eclipse razvojnoj okolini, verzija 3.4.2, u
programskom jeziku Java. Korišten je Android SDK verzije 1.5, a kao pomoć pri izradi
grafičkog sučelja korištena je Java aplikacija DroidDraw.
Aplikacija se sastoji od četiri klase:
• StartScreen.java,
• LoginConnection.java,
• LIVEService.java,
• BReceiver.java.
StartScreen je activity aplikacije, grafičko sučelje koje se prikazuje kada se aplikacija
pokrene. Metoda koja ga stvara, onCreate(), stvara objekte s kojima će raditi, tj.
elemente prikaza ove aplikacije, a to su, kao što je već navedeno, dva check-boxa i dva
gumba te polje koje prikazuje kategorije po kojima se filtriraju događaji. Pozivom metode
displaySports(), stvara se dijalog tipa AlertDialog koji prikazuje listu sportova
po kojima je moguće filtrirati događaje koji će se pratiti. Drugi dijalog, onaj za prijavu
korisnika na sustav kladionice, prikazuje se pozivom metode
displaySetPreferencesDialog(). On se pojavljuje kada korisnik odluči poslati
postavke o praćenju na poslužitelj. Dijalozi se pozivaju posebnim metodama koje, kao što
je to slučaj u svim grafičkim sučeljima, osluškuju pritisak određenih gumba. Čitanje
postavki u aplikaciji regulira se metodom readPreferences(), pri čemu se koriste
objekti Androidove ugrađene klase SharedPreferences, koji omogućuju pohranu
jednostavnih tipova podataka.
StartScreen koristi klasu LoginConnection za povezivanje s poslužiteljskom
aplikacijom. Također je koristi za prijavu na sustav te slanje promijenjenih postavki. Sve to
obavlja metodama sendMessage(). Ova klasa napravljena je kako bi se odvojio dio
komunikacije s poslužiteljem, zbog preglednosti i lakšeg pronalaska eventualnih grešaka.
Klasa LIVEService je service ove aplikacije, koji omogućava stalno čekanje obavijesti
od strane poslužiteljske aplikacije. Metodom sendMySocketAddress() poslužitelju
se šalje trenutna IP adresa i vrata poslužitelja pokretnog uređaja. Service se pokreće čim se
33
uključi uređaj, za što ima posebnu dozvolu definiranu u manifest datoteci. Kada obavijest
stigne, prikazuje je na traci stanja operacijskog sustava.
Posljednja klasa, BReceiver, ima samo jednu zadaću – omogućuje serviceu aplikacije da
se pokrene kada se uključi uređaj. Klasa je tipa BroadcastReceiver. Očekuje intent
BOOT_COMPLETED nakon kojega svim zainteresiranim klasama šalje obavijest da je
pokretanje uređaja završeno. Tu obavijest u ovoj aplikaciji čeka klasa LIVEService.
Međusobni odnos klasa može se vidjeti na klasnom dijagramu prikazanom na slici 2.13.
Sl. 2.13 Klasni dijagram aplikacije
34
Zaključak
Praktični dio rada uspješno je ostvaren i omogućena je sva funkcionalnost koju je zadatak
zahtijevao. Rad na ovakvom sustavu za operacijski sustav koji je u svojim počecima je
zanimljiv, ali isto tako vrlo zahtjevan. Najviše problema pojavljivalo se zbog slabe podrške
za izradu aplikacija za Android. Kako je to novi operacijski sustav, još nema dovoljno
primjera i podrške od programerske zajednice kako bi sve teklo glatko i kako bi se tekući
problemi brzo rješavali. S druge strane, to je dodatna motivacija koja potiče kreativnost i
samostalno rješavanje problema.
I aplikacija i sustav su potpuno funkcionalni i pri programskom ostvarenju se vodila briga
o jednostavnosti svih dijelova sustava iz programerske perspektive te o jednostavnosti
korištenja aplikacije iz korisničke perspektive. Vodilo se računa i o sigurnosnim
značajkama.
Moguće buduće dorade mogle bi uključivati proširenje opcija filtriranja događaja za
dohvat te rješavanje pitanja naplate u slučaju sudjelovanja treće strane.
35
Literatura
[1] What is Android?, Android developers, http://developer.android.com/guide/basics/what-is-android.html
[2] Android Development Community, Android Tutorials, http://www.anddev.org/
[3] Ganesan, G., Android Tutorial, http://geeth.ganesan.googlepages.com/android-tutorial
[4] Paller, G., My life with Android, http://mylifewithandroid.blogspot.com/
[5] Gramlich, N., andbook!: Android Programming
36
Sažetak
U ovom radu izrađena je aplikacija za operacijski sustav Android kao dio sustava Sportska
prognoza. Sustav omogućuje sudjelovanje u igrama na sreću putem osobnog pokretnog
uređaja s operacijskim sustavom Android, pri čemu se komunikacija odvija bežičnim
internetskim putem. Sastoji se od poslužiteljske aplikacije, baze podataka, aplikacije za
rukovanje bazom i dvije korisničke aplikacije za Android.
Aplikacija Sportska prognoza pruža mogućnost dohvata i pregleda događaja, kreiranje i
uplatu listića, pohranu nedovršenog listića te pregled starih listića. Aplikacija Sportska
prognoza LIVE proširuje mogućnosti sustava tako što omogućuje aktivaciju praćenja
rezultata događaja s korisnikovih uplaćenih listića te novih događaja u ponudi kladionice,
pri čemu korisnik može filtrirati događaje koje želi pratiti.
Ključni pojmovi
Operacijski sustav Android, aplikacija za Android, activity, elementi prikaza, service,
datoteka manifest, intent, sustav sportske prognoze, pregled događaja, uplata listića,
praćenje rezultata.
37
Abstract
The result of this work is an application for the Android operating system which is a part
of the Sport Events Forecast System. The system allows its clients to take part in sports
betting games by using their personal mobile phone running the Android operating system.
It consists of a server application, a database, a database management application and two
user applications for Android. All system parts communicate via wireless Internet access.
The Sport Event Forecast application allows retrieval and viewing of sport events, betting
ticket creation and payment, storage of a sketch ticket and reviewing played tickets. The
Sport Event Forecast LIVE application extends the systems capabilities by providing the
event result tracing option and new event subscription option in which the user gets to
choose which sport categories he is willing to subscribe to.
Key terms
Android operating system, Android application, activity, views, service, manifest file,
intent, sport event forecast system, sport events viewing, betting ticket payment, result
tracing.