View
5
Download
0
Category
Preview:
Citation preview
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ž D I N
Zoran Turk
RAZVOJ MOBILNE APLIKACIJE ZA PRAĆENJE NAPREDOVANJA U TERETANI
ZAVRŠNI RAD
Varaždin, 2013.
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ž D I N
Zoran Turk
Redoviti Student
Matični broj: 38148/09–R
Studij: Informacijski sustavi
RAZVOJ MOBILNE APLIKACIJE ZA PRAĆENJE NAPREDOVANJA U TERETANI
ZAVRŠNI RAD
Mentor:
Tihomir Orehovački, mag. inf.
Varaždin, rujan 2013.
I
Sadržaj:
1. Uvod ...................................................................................................................................... 1
2. Android ................................................................................................................................. 2
2.1. Arhitektura operacijskog sustava Andorid ..................................................................... 3
2.1.1. Aplikacijski okvir .................................................................................................... 5
2.1.2. Biblioteke ................................................................................................................ 5
2.1.3. Aplikacijski sloj ....................................................................................................... 6
3. Andorid okruženje ............................................................................................................... 7
3.1. Aktivnost ........................................................................................................................ 7
3.2. Servisi ........................................................................................................................... 10
3.3. Dobavljači sadržaja i primatelji prijenosa .................................................................... 12
3.4. Android resursi ............................................................................................................. 12
3.5. Namjera ........................................................................................................................ 15
3.6. SQLite ........................................................................................................................... 17
3.6.1. Cursor i Content Values ........................................................................................ 18
4. Praktični dio ....................................................................................................................... 20
4.1. Izvedba početnog sučelja .............................................................................................. 21
4.2. Izvedba komponente Vježbe ........................................................................................ 22
4.3. Izvedba komponente Trening ....................................................................................... 24
4.4. Izvedba komponente Dnevnik ...................................................................................... 28
4.5. Izvedba komponente Napredak .................................................................................... 30
4.6. Izvedba komponente Profil/Postavke ........................................................................... 32
4.7. Pregled i usporedba sličnih aplikacija .......................................................................... 33
5. Zaključak ............................................................................................................................ 36
Literatura ................................................................................................................................ 37
1
1. Uvod
U današnje vrijeme tehnologije, većina ljudi ne može zamisliti dan proveden bez korištenja
mobilnog uređaja, pretraživanje Interneta, gledanja TV-a itd. Tehnologija je postala veliki dio
svakodnevice. Kako tehnologija napreduje iz dana u dan, mobilni uređaji su, u vrlo kratkom
vremenu, proširili svoje mogućnosti. Nekada su to bili uređaji korišteni samo za komunikaciju,
dok je danas svaki mobilni uređaj malo osobno računalo. Sve što je osobno računalo u
mogućnosti napraviti, može i današnji mobilni uređaj. Došlo je vrijeme takozvanih pametnih
mobitela (eng. smartphone). Većina današnjih mobilnih uređaja ima mogućnost pregledavanja
Interneta, fotografiranja, video poziva itd. Bitnu ulogu naglog razvoja mobilnih uređaja imao
je Android.
Android je operacijski sustav za mobilne uređaje. Upravo je on što omogućuje mobilnom
uređaju da postane „pametan“. Android je još uvijek relativno mlad u svijetu mobilnih uređaja,
ali je ubrzo postao najkorišteniji mobilni operacijski sustav (OS) današnjice (IDC,2013). U vrlo
kratkom roku je nadmašio konkurenciju poput Appelovog iPhone OS-a i Windows Mobile OS-
a. Za razliku od konkurencije, isti je otvoren, fleksibilan i besplatan. Drugi razlog zašto je
Android tako snažan na tržištu je Google Play. Isti prema novijim statistikama sadrži preko
milijun aplikacija i preko tri milijarde preuzimanja (Wolfe, 2013; Rowinski, 2013).
Uz Android operacijski sustav pojavio se i novi val programskih inženjera koji su htjeli iskoristi
popularnost Androida u svoje svrhe. Kao što je navedeno, Android je bio besplatan, pa tako i
razvoj aplikacija za njega. Tema rada je razvoj Android aplikacije koja omogućuje jednostavno
praćenje napredovanja u teretani, vizualno predstavljanje rezultata i pružanje upute pri
vježbanju. Dokazano je da korištenje dnevnika treninga i zapisivanje rezultata omogućuje
postizanje boljih rezultata (Henriques, 2012), a upravo je to svrha aplikacije koja je razvijena
za potrebe ovoga rada. U radu će biti opisane osnovne komponente aplikacije, opis svih
funkcionalnosti, te prikaz korisničkog sučelja. Na kraju će biti prikazana usporedba aplikacije
i njenih funkcionalnosti sa već postojećim, sličnim aplikacijama s Google Play-a.
Osim praktičnog primjera, u radu će se opisati osnove Android operacijskog sustava, temeljna
načela kako sustav funkcionira, te objasniti osnovne komponente Android programskog
okruženje koje su neophodne za razvoj mobilnih aplikacija.
2
2. Android
Android je jedan od najpoznatijih te ujedno i vodeći operacijski sustav u svijetu mobilnih
uređaja, gdje njegova zastupljenost prelazi 50% cjelokupnoga tržišta (IDC,2013). Android je
2003. godine započeo kao projekt, dok ga je dvije godine poslije, pod vodstvom Android
Incorporation tvrtke, preuzeo Google. Andy Rubin, jedan od suosnivača tvrtke Android
Incorporation, opisuje Android operacijski sustav kao prvu istinski otvorenu i sveobuhvatnu
platformu za mobilne uređaje, softver koji je omogućio inovaciju mobilne tehnologije (Rubin,
2007). Ostali suosnivači Android Incorporation bili su Rich Miner, Nick Sears, Chris White.
Google je htio da Android operacijski sustav bude otvorenog kôda (eng. open-source), te je tako
većina Android programskog kôda izdana pod Apache License licencom. To je ujedno bio i
razlog zašto je Android postao jako popularan i mnoštvo kompanija poput Motorole i Sony-a
danas koriste Android kao operacijski sustav na svojim mobilnim uređajima (Paul, 2010).
Slika 1. prikazuje prvi mobilni uređaj s Android operacijskim sustavom, izdan 22. studenog
2008. godine pod nazivom HTC Dream G1.
Slika 2.1. HTC Dream G1
3
Nakon prve komercijalne verzije (verzija 1.0), Android operacijski sustav je prolazio kroz
brojne nadogradnje koje su postupno poboljšavale operacijski sustav. Tablica 1.1. prikazuje
različite verzije Android operacijskog sustava. S obzirom da razlike između verzija nisu važne
za kontekst ovoga rada, iste neću biti razmatrane.
Verzija Kodno ime API Zastupljenost
1.6 Donut 4 0.1%
2.1 Eclair 7 1.2%
2.2 Froyo 8 2.5%
2.3 - 2.3.2 Gingerbread 9 0.1%
2.3.3 - 2.3.7 10 33.0%
3.2 Honeycomb 13 0.1%
4.0.3 - 4.0.4 Ice Cream Sandwich 15 22.5%
4.1.x Jelly Bean 16 34.0%
4.2.x 17 6.5%
Tablica 1Verzije Android operacijskog sustava
2.1. Arhitektura operacijskog sustava Andorid
Komponente operacijskog sustava Android dijele se u pet cjelina (Meier, 2010), kao što je
prikazano na slici 2.2.
Slika 2.2 Arhitektura Andorid operacijskog sustava (Prema: Meier 2010.)
4
Linux jezgra (eng Kernel) - Osnovne usluge poput programske podrške hardvera, upravljanje
procesa i memorije, sigurnost, mreža obrađene su od strane Linux jezgre 2.6
Biblioteke (eng. Libraries) – Android obuhvaća razne C / C++ biblioteke poput libc i SSL1,
ali i:
- Biblioteke za reprodukciju video i audio zapisa,
- Biblioteke za upravljanjem prikaza na zaslonu (eng. surface manager),
- Biblioteke za grafiku koje sadrže SGL i OpenGL za prikaz 2D i 3D grafike,
- SQLite podršku
- SSL i WebKit za integriran internet pretraživač i sigurnost.
Android vrijeme izvršavanja (eng. Runtime) – Zaslužen je za pokretanje aplikacija. Zajedno
s bibliotekama čini osnovu aplikacijskog okvira, a sastoji je od:
- Dalvik virtualnog stroja koji omogućuje uređaju da može izvoditi višestruke instance
učinkovito.
- Osnovnih (eng. core) Android biblioteka koje osiguravaju većinu funkcionalnosti
Java programskog jezika.
Aplikacijski okvir (eng. Application Framework) – pruža potrebne klase za kreiranje
Android aplikacija.
Aplikacijski sloj (eng. Application layer) - Sve aplikacije, bile one implementirane u Android
operacijski sustav ili instalirane od strane korisnika, su izgrađene upravo pomoću ovog sloja.
1 SSL - Secure Sockets Layer - tehnologija koja omogućuje uspostavljanje sigurne veze izmeću servera i klijenta
5
2.1.1. Aplikacijski okvir
Android arhitektura koristi koncepte ponovne uporabe, što nam omogućuje podjelu aktivnosti,
usluga i podataka s drugim aplikacijama. Sljedeće aplikacijske usluge su osnova svih Android
aplikacija, a ujedno pružaju okvir za izradu vlastitih aplikacija (Meier, 2010).
1. Activity Manager – upravljanje životnim ciklusom aplikacije kao što je prikazano na
slici 2.3.
2. View – koristi se za konstrukciju korisničkog sučelja aplikacije
3. Notification Manager – upravljanje obavijestima koje se prikazuju korisniku (npr.
dospijeće poruke).
4. Content Provider – omogućuje korištenje podataka od strane više aplikacija.
5. Resource Manager – omogućuje pohranu podataka aplikacije koje nisu programski kôd,
poput slika koje se koriste u sučelju aplikacije.
6. Package Manager – sadrži informacije o aplikacijama koje su instalirane na sustav.
7. Window manager – upravljanje aplikacijskim prozorima.
2.1.2. Biblioteke
Sljedeći sloj predstavlja sloj biblioteka u Android operacijskom sustavu. To su: (Dujmović,
2010):
Surface manager – prikaz prozora za pojedine aplikacije.
OpenGL / ES – biblioteka koja služi za grafički 2D i 3D prikaz.
SGL (Scene Graph Library) – biblioteka na vrhu OpenGL biblioteke koja služi za
2D i 3D prikaz.
Media Framework – odgovoran za reproduciranje i rad s multimedijalnim
datotekama.
Free Type – biblioteka koja omogućuje prikaz teksta
SSL (Secure Socket Layer) – omogućuje sigurnosnu komunikaciju preko
Interneta.
SQLite – implementira bazu podataka (engl. Database Engine).
6
WebKit – jezgra web preglednika koji podržava Javascript i ostale standarde na
mobilnom uređaju.
Libc (System C library) – implementacija standardnih sistemskih biblioteka
programskog jezika C (libc) izvedenih iz operativnog sustava BSD4.
2.1.3. Aplikacijski sloj
Prvi sloj, aplikacije se sastoji od nekoliko osnovnih komponenti, a to su (Wei-Meng, 2012.):
Home - prikazuje aplikacije, dodatke (engl. Widgets) i prečace. Također podržava
promjenu pozadine.
Phone - podržava klasične telefonske funkcije kao i kontrolu poziva, konferencijske
razgovore, sporedne usluge i jednostavnu integraciju s aplikacijom Contacts.
Web Browser - je pretraživač baziran na WebKitu sa svim njegovim
mogućnostima, podržava jezike HTML i XHTML.
Email - osigurava pristup poslužiteljima e-maila koji se obično mogu naći na
Internetu i podržava protokole POP3, IMAP4 i SMTP.
Media Player - omogućava upravljanje, uvoz i reprodukciju sadržaja kodiranih na
razne načine.
Ostale komponente koje se nalaze u ovom sloju su Alarm Clock, Calculator,
Calendar, Camera, Contacts, IM, MMS, Settings, Voice Dialer itd.
7
3. Andorid okruženje
Android aplikacije su, uglavnom, napisane u Java programskom jeziku te u Eclipse IDE
okruženju. U radu će biti prikazane osnovne komponente jedne Andorid aplikacije, manifest
datoteka, Android resursi, namjera (eng. Intent) i SQLite programska podrška.
Postoje četiri osnovna tipa aplikacijskih komponenata, gdje svaka komponenta čini samostalnu
cjelinu i igra specifičnu ulogu u radu aplikacije. Svaka komponenta ima svoj ciklus trajanja,
proces pokretanja i prekidanja aplikacije. Te četiri komponente su (Marjanica, 2011):
Aktivnosti (eng. Activity)
Servisi (eng. Serivces)
Dobavljači sadržaja (eng. Content Provider)
Primatelji prijenosa (eng. Broadcast Receiver)
3.1. Aktivnost
Aktivnost je komponenta koja ima grafičko sučelje i omogućuje korisniku interakciju s
aplikacijom. Svaka aktivnost je proširenje Activity klase. Klasa Activity je osnovna klasa za
vizualne i interaktivne komponente svake aplikacije. Aplikacija se najčešće sastoji od nekoliko
takvih aktivnosti, gdje je jedna uvijek početna aktivnost (eng. Main Activity) koja se prezentira
pri pokretanju aplikacije. Ostale aktivnosti se pozivanju nakon početne, po principu stoga
(posljednja otvorena aktivnost se prva zatvara), u situacijama kada je to potrebno. Activity klasa
je poput Form klase u C# i Windows okruženju. Sljedeći kôd prikazuje osnovni kostur Activity
klase, te metode koja svaka aktivnost sadrži.
public class TestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentVirew je metoda za postavljanje glavnog //layouta korisničkog sučelja setContentView(R.layout.activity_main); //Klasa ima zadatak popuniti korisničko sučeje //i omogućiti korisniku rad.
} @Override
8
protected void onStart() { super.onStart(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); } }
onCreate() – ovo je osnovna metoda svake aktivnosti, poput Main() u drugim programskim
jezicima. Životni ciklus aktivnosti upravo započinje pozivanjem ove metode, bez nje aktivnost
neće ispravno raditi. Metoda se poziva odmah prilikom pozivanja same aktivnosti te se zbog
toga unutar nje definira korisničko sučelje (setContentView()).
onStart() – metoda se automatski poziva nakon onCreate() no njena stvarna svrha je da se
poziva nakon što se aktivnost vratila iz stanja mirovanja (pozvana je nova aktivnost). Iz tog
razloga se unutar nje nalaze podaci koje je potrebno ažurirati nakon mirovanja aktivnosti (npr.
ponovno otvaranje baze podataka). Metoda nije obavezna za rad aktivnosti, ali je preporučljiva
jer omogućuje kontrolu resursa uređaja.
onStop() – metoda se poziva kada korisnik ili sama aplikacija pokrene novu aktivnost, što znači
da aktivnost prelazi u stanje mirovanja i čeka da se korisnik vrati na početnu aktivnost. Metoda
omogućuje da oslobodimo memoriju za vrijeme mirovanja (npr. privremeno zatvaranje baze
podataka). U slučaju zatvaranja baze podataka, kako bi aplikacija ispravno radila nakon stanja
mirovanja, potrebno je u onStart() metodi ponovno otvoriti bazu podataka.
onDestroy() – metoda se samo poziva kada je aktivnost završila s radom ili je uništena od strane
operacijskog sustava. Unutar metode definiramo varijable koje je potrebno zatvoriti/obrisati iz
sigurnosnih razloga, a ne smiju se tijekom samog rada aktivnost jer pružaju osnovne podatke
9
za rad aktivnosti. Kao na primjer Cursor baze podatka kojeg je uvijek potrebno zatvoriti nakon
korištenja, jer u suprotnom može doći do problema s daljnjim radom baze.
Slika 3.1 prikazuje životni ciklus aktivnosti i međusobni odnos metoda Activity klase.
Slika 3.1. Životni ciklus aktivnosti aplikacije (Prema: Meier, 2011)
Postoje tri stanja u kojima aktivnost može biti, gdje se prijelaz iz jednog stanja u drugi događa
pomoću već opisanih metoda. Maločas spomenuta stanja su: (Kuna,2009):
Aktivno stanje ili stanje izvođenja - kada je aktivnost prikazan na zaslonu (moguće je
koristiti funkcionalnosti aktivnosti)
Pauzirano stanje - još uvijek je vidljiv korisniku, no trenutno ga ne koristi. To je slučaj
kada je nova aktivnost „iznad“ prethodne aktivnosti, koja je transparentna ili ne pokriva
cijeli ekran. U slučaju da operacijski sustav ima premalo slobodne memorije, može
ugasiti takvu aktivnost.
10
Zaustavljeno stanje - druga aktivnost je potpuno prekrila prethodnu. Informacije o
stanju su još uvijek sačuvane. Također, aktivnost u ovom stanju se može zaustaviti ako
je sustavu potrebna memorija.
3.2. Servisi
Servis je komponenta koja obavlja zadatke u pozadini aplikacije tijekom duljeg vremenskog
perioda. Servisi nemaju korisničko sučelje poput aktivnosti. Na primjer, servis može
reproducirati glazbu ili skidati sadržaj s Interneta u pozadini dok korisnik koristi drugu
aplikaciju. Servis uglavnom obavlja radnju u istom procesu kao i aplikacija od koje potječe.
Servisi se pokreću, zaustavljaju i kontroliraju unutar drugih komponenata aplikacije, kao što su
drugi servisi, aktivnosti i dobavljači sadržaja (eng. Broadcast Receiver). Ako aplikacija mora
obaviti neku radnju, a korisnikova interakcija nije potrebna, servisi su najbolje rješenje.
Servisi imaju uvijek viši prioritet u odnosu na aktivnosti koji nisu trenutno vidljive korisniku,
što znači da je manja vjerojatnost da ću se zaustaviti ako je sustavu potrebno više resursa. Jedini
razlog da sustav zaustavi rad servisa je u slučaju ako je trenutno vidljivoj aktivnosti potrebno
još više resursa. Ako se to dogodilo, servis se automatski ponovo pokreće kada se oslobode
potrebni resursi. Postoje situacije kada je potrebno da prioritet servisa bude jednak vidljivoj
aktivnosti, kao na primjer MP3-player koji reproducira glazbu u pozadini.
Svaki servis je proširenje Service klase. Osnovne metode klase, koje je potrebno definirati, su
(Meier,2010):
onCreate() – identična metodi iz Activity klase. Poziva se samo jednom i to pri
pokretanju servisa. Osnovna metoda u kojoj se definiraju radnje koje će servis obavljati
pri pokretanju.
onBind() – metoda vraća komunikacijski kanal koji je potreban za spajanje sa servisom
ili vraća null vrijednost ako spajanje na servis nije moguće izvršiti.
onStartComand() – metoda se poziva kada je servis pokrenut pozivom metode
startService(), što omogućuje da se ova metoda nekoliko puta pokrene u životnom
ciklusu servisa.
11
Servisi se moraju pozvati na glavnoj dretvi uređaja. To znači da svaki proces koji je pokrenut u
onStardComand() metodi obavlja radnju na glavnoj dretvi. Zbog toga je potrebno kreirati novu
dretvu unutar onStartComand() metode, koja će odvijati proces u pozadini aplikacije i nakon
toga zaustaviti servis, ne opterećujući glavnu dretvu uređaja.
Kada će se metoda onStartComand() ponovno pozvati ovisi o vrijednosti koju metoda vraća
kao rezultat. Spomenuta vrijednost može biti jedna od sljedećih konstanti (Meier, 2010):
START_STICKY – vraćanjem ove konstante, ako je servis prekinut od strane sustava,
onStartComand() će se pozvati svaki puta kada se servis ponovno pokrene. Koristi se
kod servisa koji se pokreću i zaustavljaju pomoću startService() i stopService(). Primjer
jednog servisa je MP3-player koji obavlja procese u pozadini.
START_NOT_STICKY – koristi se kod servisa koji obavljaju jednu specifičnu akciju
ili naredbu. Kada su završili s radnjom pozivaju stopSelf() kako bi servis prekinuli.
Servis koji je prekinut od strane sustava pokrenuti će se ponovo samo ako postoje pozivi
na čekanju. Ako ipak ne postoje startService() pozivi, servis se prekida bez poziva
onStartComand() metode. Ovo stanje je idealno za servise koji obavljaju radnje u
određenim vremenskim intervalima, poput servisa za ažuriranja sadržaja.
START_REDELIVER_INTENT – ovo stanje se koristi kada je potrebna sigurnost da
je servis završio s radom. Ovo stanje je kombinacija prve dvije. Servis se ponovno
pokreće samo ako postoje pozivi na čekanju ili ako je prekinut prije poziva stopSelf()
metode.
Potrebno je naglasiti da se svaki servis mora zaustaviti pomoći stopSerivce() ili stopSelf() nakon
obavljene radnje.
12
3.3. Dobavljači sadržaja i primatelji prijenosa
Dobavljači sadržaja (eng. Content Providers) pružaju sučelje za dobavljanje i spremanje
sadržaja te omogućuju razmjenu podataka između aplikacija. Svi dobavljači sadržaja
pohranjuju podatke u SQLite bazu podataka. Svaka aplikacija, koja ima ovlast korištenja
dobavljača sadržaja, može pristupiti svi podacima te aplikacije. Sadržaju se pristupa upitom
pomoću Content Resolvera. Upit sadrži adresu (URI) sadržaja, imena polja iz tablice i tip
podataka (tekstualni tip (String), cjelobrojni tip (Integer)). Svaki dobavljač sadržaja je
proširenje osnovne klase ContentProvider. Android posjeduje nekoliko ugrađenih dobavljača
sadržaja koje sve aplikacije mogu koristiti. Jedna od njih je dobavljač sadržaja za kontakte.
Svaka aplikacija može pristupiti podacima kontakta poput broj telefona, imena, itd.
Primatelji prijenosa (eng. Broadcast Receiver) imaju zadaću reagiranja na emitiranje obavijesti
koje dolaze od strane sistema uređaja (npr. baterija je prazna, zaslon je uključen) ili od aplikacija
(komunikacija s drugim aplikacijama). Ova komponenta nema korisničko sučelje, ali može
pokrenuti aplikaciju kao rezultat primljene informacije. Također može koristiti klasu
NotificationManager za upozorenje korisnika pomoću zvukova, vibracija ili svjetla (Marjanica,
2011).
3.4. Android resursi
Kao što je navedeno, drugi bitni pojam jesu Android resursi. Bez resursa, aplikacija ne može
raditi. Resursi također omogućavaju optimizaciju aplikacije za veliki broj različitih uređaja
(uređaji različite hardverske jačine). Resursi su komponente dizajna korisničkog sučelja
aplikacije. Sastoje se od:
Rasporeda (eng. Layout),
Izbornika (eng. Menu),
Vrijednosti (eng. Values),
Grafike (eng. Drawables)
Raspored definira vizualnu strukturu (kostur) korisničkog sučelja, kao na primjer sučelje jedne
aktivnosti (eng. Activity). Možemo ga definirati unaprijed u xml2 datotekama ili ju možemo
2 XML- Extensible Markup Language
13
instancirati prilikom pokretanja aplikacije. Datoteka sadrži različite poglede (eng. View) i
kontrole (npr. TextView), pomoću kojih oblikujemo izgled aktivnosti. Slika 3.2 prikazuje xml
datoteku koja se sastoji od jednog pogleda (LinearLayout) i pet kontrola (dva EditView, dva
TextView i jedan Button ) te grafički izgled datoteke.
Slika 3.2. Kôd i grafički prikaz xml datoteke
Izbornik – postoje dva tipa izbornika. Prvi je izbornik koji se poziva pritiskom na tipku
Postavke uređaja. Drugi je context izbornik koji se poziva kada korisnik drži jedan element
aktivnosti pritisnut. Izbornik definiramo pomoću xml datoteka koje spremamo u mapi menu
resursa. Aplikacija može imati neograničen broj izbornika. Svaka aktivnost može imati svoj
izbornik, samo je potrebno kreirati posebnu xml datoteku i u klasi aktivnosti navesti koji
izbornik koristiti.
Vrijednosti – sastoji se od string.xml datoteke koja sadrži tekstualne vrijednosti tipa String
koje se nalaze u korisničkom sučelju aplikacije. Te vrijednosti dohvaćamo putem atributa name.
Datoteke omogućuju jednostavnu promjenu jezika korisničkog sučelja. Za svaki novi jezik
potrebna je posebna datoteka. Sve datoteke imaju iste nazive atributa, ali različitih vrijednosti.
Potrebno je samo navesti koju datoteku trenutno koristiti i vrijednost se mijenja (u ovom slučaju
jezik). U nastavku je prikazan kôd dvije string.xml datoteke dok slika 3.3 prikazuje slike gumba
(eng. Button) koji ih upotrebljava:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="string_name">Name:</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
14
<resources> <string name="string_name">Ime:</string>
</resources>
<Button android:id="@+id/ButtonLog" android:text="@string/string_name" />
Slika 3.3. Gumb kontrole različitih vrijednosti
Grafike – jednostavno rečeno, to su slike (jpg, png, i sličnih formata) koje želimo koristit kao
dio korisničkog sučelja. Za korištenje je samo potrebno kopirati grafiku u jedan od drawable
mapa te ih pozvati (kada je potrebno) preko ID-a, koji je istovremeno i samo ime grafike. U
nastavku slijedi primjer kôda pozivanja grafike unutar xml datoteke (icon_dash_exercise_gray
je ID grafike), dok slika 3.4 prikazuje kontrolu za prikaz grafike:
<ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_dash_exercise_gray" />
Slika 3.4. Kontrola za prikaz grafike
Zadnji bitan pojam je AndroidManifest.xml datoteka. Svaka aplikacija mora sadržavati tu
datoteku i mora biti točno tog imena. U datoteci se nalaze bitne informacije o aplikaciji kao što
su naziv aplikacije, nazivi pojedinih aktivnosti, minimalna verzija Androida itd. Osim
informacija nalaze se i razna dopuštenja i restrikcija aplikacije, kao što je na primjer dopuštenje
korištenja memorijske kartice, upotreba korištenje kamere itd. Također je obavezno unutar
datoteke opisati svaku kreiranu aktivnost ili će se pri pokretanju pojaviti pogreška. U nastavku
prikazan je kôd manifest datoteke.
15
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testapp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="TestApp" android:theme="@style/AppTheme" > <activity android:name="com.example.testapp.ReminderListActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".TesttActivityTwo" android:label ="TestApp"> </activity> </application> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest>
3.5. Namjera
Namjera (eng. Intents) čini osnovni sustav razmjene poruka u Android operacijskom sustavu.
Namjera je instanca klase Intent i sastoji od akcije i podataka. Akcija je jednostavno radnja
koja se mora dogoditi u trenutku primanja namjere, a podaci su informacije koje su potrebne
za rad (npr. pozivni broj osobe). Namjere se koriste za pokretanje novih aktivnosti, servisa ili
za komunikaciju između različitih dijelova sustava. Aplikacija može slati ili primati namjeru.
Slanje namjere govori Android operacijskom sustavu da mora nešto poduzeti. To može biti
pokretanje nove aktivnosti unutar aplikacije, ili pokretanje sasvim nove aplikacije. Slanjem
namjere nije osigurano da će se nešto dogoditi. Namjeru koja je poslana za komunikaciju
između sustava je potrebno registrirati pomoću prijemnika namjere (eng. Broadcast Receiver)
koji, nakon primitka, govori sustavu što treba učiniti. U slučaju da istovremeno više aplikacija
može primiti namjeru, sustav omogućuje korisniku da sam izabere aplikaciju pomoću koje želi
izvršiti radnju. Ako ipak sustav ne može pronaći niti jednu aplikaciju koja može primiti
namjeru, aplikacija koja je poslala namjeru javlja pogrešku (eng. run-time error).
16
Kao što je navedeno, namjere se najčešće koriste za pokretanje novih aktivnosti unutar
aplikacije. Za pokretanje nove aktivnosti, potrebno je pozvati startActivity() metodu, kojoj
prosljeđujemo namjeru kao što je prikazano u sljedećem kôdu.
startActivity(Intent mojaNamjera);
U namjeri se može navesti koju aktivnost treba pokrenuti, ili samo akciju koju treba obaviti.
Metodom putExtra(), klase Intent, možemo proslijediti podatke drugoj aktivnosti. Potrebna je
samo konstanta pomoću koje prepoznajemo podatak:
namjera.putExtra(KONSTANTA, vrijednost);
Kada se koristi startActivity(), aplikacija neće dobivati obavijest ako je nedavno pokrenuta
aktivnost završila s radom. U slučaju da je potrebno dobivati takve obavijesti, koristi se metoda
startActivityForResult().
Za povezivanje različitih aktivnosti unutar iste aplikacije koristi se eksplicitna namjera (eng.
Explicit Intent). Eksplicitnoj namjeri je potrebno proslijediti kontekst (eng. Context) trenutne
aktivnosti i klasu aktivnosti koju je potrebno pokrenuti; kao što je prikazano u sljedećem kôdu:
Intent i = new Intent(getApplicationContext(), newActivity.class); startActivity(i);
Nakon poziva startActivity() otvara se nova aktivnost, koja je vidljiva sve dok nije pozvana
finish() metoda ili dok korisnik nije pritisnuo hardversku tipku Nazad.
Kao što je navedeno, startActivityForResut() se koristi ako je potrebna obavijest nakon
završetka novo pokrenute aktivnosti. Metoda je vrlo slična startActivity() metodi, s jednom
bitnom razlikom. Metodi startActivityForResut() također prosljeđujemo kontekst i klasu
aktivnosti koju treba pokrenuti, ali uz to, prosljeđujemo i request code. To je broj pomoću kojeg
raspoznajemo koja je aktivnost vratila obavijest. Primjer vidimo u sljedećem kôdu.
private static final int REQUEST_CODE = 1023; Intent intent = new Intent(this, Aktivnost.class); startActivityForResult(intent, REQUEST_CODE);
Na ovaj način, novo pokrenuta aktivnost vraća obavijest o završetku i može vratiti neki rezultat
prethodnoj aktivnosti. Unutar nove aktivnosti, prije pozivanje finish() metode, ako želimo
vratiti neki rezultat, potrebno je pozvati setResult() metodu. Metoda zahtjeva dva parametra:
17
rezultat aktivnosti i result code, koji može biti RESULT_OK ili RESULT_CANCELED. Ako
korisnik samostalno zatvori aktivnost, ili je aktivnost završila prije poziva setResult(), result
code je automatski postavljen na RESULT_CANCELED. Nakon završetka nove aktivnost,
unutar početne aktivnosti, poziva se metoda onActivityResult(). Metoda sadrži tri parametra:
request code, result code, i podatke. Pomoću tih parametara, na jednostavan je način moguće
raspoznati koja aktivnost je poslala rezultat i što nakon tog poduzeti. Potrebno je samo
usporediti request code i provjeriti da li je result code jednak RESULT_OK. Programski kôd
onActivityResult() metode se nalazi u nastavku.
private static final int REQUEST_CODE_AKTIVNOST_JEDAN = 1023; private static final int REQUEST_CODE_AKTIVNOST_DVA = 2023; @Override public void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (REQUEST_CODE_AKTIVNOST_JEDAN) : { if (resultCode == Activity.RESULT_OK) { } break; } case (REQUEST_CODE_AKTIVNOST_DVA) : { if (resultCode == Activity.RESULT_OK) { } break; }
3.6. SQLite
SQLite je programska podrška koja omogućuje kreiranje i upravljanje relacijskih baza
podataka. Implementiran je kao C biblioteka i sastavni je dio Android arhitekture. Programski
kôd, kao i njegovi dijelovi, su otvorene domene (eng. open source) što znači da je besplatan za
korištenje, te se slobodno može modificirati i objavljivati. Zbog toga je SQLite najraširenije
programsko rješenje za SQL baze podataka (Kreibich, 2013).
Implementacija u obliku biblioteke znači da je svaka SQLite baza integrirani dio aplikacije u
kojoj je kreirana i ne mora se pokretati kao zaseban proces. Upravo to uvelike smanjuje vanjske
smetnje, smanjuje čekanje i pojednostavljuje transakcijske procese. Nasuprot drugih
programskih rješenja, SQLite nema konfiguracijsku datoteku, nije ga potrebno instalirati ili
poduzimati bilo kakva podešavanja.
18
Glavni tipovi podataka u SQLite-u su (Penezić, 2012):
NULL - vrijednost koja označava da podatak ne postoji
INTEGER - standardna vrijednost cijelih brojeva s duljinom zapisa od 1, 2, 3, 4, 6, ili 8
bajta, ovisno o danoj vrijednosti.
REAL - vrijednost realnog broja s 8 bajta u standardnom IEEE zapisu.
TEXT - tekstualna vrijednost zapisana u jednom od podržanih načina zapisa (UTF-8,
UTF-16BE ili UTF-16LE).
BLOB - vrijednost pohranjena točno kako je dana.
Glavni nedostaci SQLite sustava su (Bucić, 2012):
ALTER TABLE nije u potpunosti podržan; samo RENAME TABLE i ADD COLUMN
naredbe su podržane. Naredba za brisanje stupca DROP COLUMN i naredba za
promjenu naziva stupca ALTER COLUMN nisu implementirane
Ugniježđene transakcije; SQLite dozvoljava samo pojedinačne transakcije.
Ugniježđene transakcije dozvoljavaju kontrolu nad većim i kompleksnijim operacijama.
RIGHT i FULL OUTER JOIN; LEFT OUTER JOIN je implementiran, ali RIGHT
OUTER JOIN i FULL OUTER JOIN nisu.
3.6.1. Cursor i Content Values
Svaki upit u Android okruženju se vraća u obliku kursora (eng. Cursor) koji pokazuje na
rezultat upita, tj. redove tablica. Kursor uvijek pokazuje na prvi red rezultata, te je potrebno
ručno prolaziti kroz cijeli skup redova. Svaki kursor je instanca Cursor klase koja sadrži
metode za navigaciju kroz rezultat. Te metode su (Meier, 2010):
moveToFirst() – Postavlja kursor na prvi red rezultata upita.
moveToNext() – Pomiče kursor na sljedeći red.
moveToPrevious() – Pomiče kursor na prethodni red.
getCount() – Vraća ukupni broj redova u rezultatu.
getColumnIndexOrThrow() –Vraća redni broj stupca zadanog imena (baca iznimku ako
stupac ne postoji)
getColumnName()- Vraća ime stupca zadan rednim brojem.
getColumnNames() – Vraća niz svih naziva stupaca u trenutnom kursoru
19
moveToPosition() – Postavlja kursor na zadani broj reda
getPosition() – Vraća trenutnu poziciju kursor
Content Values se koristi za dodavanje novih redova u tablicu. Svaka vrijednost predstavlja
jedan novi red tablice u obliku ključa (naziv stupca) i vrijednosti. Sljedeći kôd prikazuje primjer
dodavanja novoga reda u tablici:
ContentValues noviRed = new ContentValues(); noviRed.put(IME_STUPCA, novaVrjednost); [ ... Ponavljamo za svaki stupac u tablici ... ]
// Dodamo novi red u tablicu mojaBaza.insert(IME_TABLICE, null, noviRed);
Postoje još mnogo drugih komponenti u Android programskom jeziku, ali kako one nisu bitne
za kontekst ovoga rada, iste neće biti opisane u ovom završnom radu. U nastavku slijedi
praktični dio rada: aplikacija za praćenje napredovanja u teretani.
20
4. Praktični dio
Aplikacija za praćenja napredovanja u teretani je sustav koji omogućuje korisniku slaganje
vlastitog treninga iz više od 150 različitih vježbi, vođenje dnevnika, te pregled napredovanja
pomoću grafova ili samog dnevnika. Korisnik ima na raspolaganju sučelje koje omogućuje
jednostavan i učinkovit rad. Aplikaciju je samo potrebo instalirati i korisnik može započeti s
treningom, nikakva dodatna preuzimanja s Interneta nisu potrebna. Aplikacija je napravljena
po uzoru poznatih komercijalnih aplikacija poput: JEFIT, You Are Your Own Gym, The 300
Gym Workout itd. Slike i opis vježbi za aplikaciju su preuzete od JEFIT - Workout & Fitness
Android Aplication (Jefit Inc, 2013).
Na slici 4.1. prikazano je početno sučelje aplikacije koje se sastoji od pet glavnih komponenti,
to su:
1. Vježbe: pregled svih raspoloživi vježbi,
2. Trening: omogućuje pregled svih raspoloživi treninga, kreiranje novih te pokretanje
aktivnosti za zapisivanje dnevnika novog treninga
3. Dnevnik: pregled dnevnika po datumu,
4. Napredak: omogućuje prikaz napredovanja po vježbi,
5. Profil/Postavke: prikaz trenutnog korisnika te mogućnost promjene istog.
Slika 4.1. Početno sučelje aplikacije
1
2
3
4
5
21
4.1. Izvedba početnog sučelja
Klasa MainActivity.java je početna aktivnost aplikacije (slika 4.1). Klasa prilikom pokretanja
provjerava prisutnost baze podataka na uređaju. Baza je unaprijed kreirana pomoću
SQLiteBrowser aplikacije, te ako baza ne postoji na uređaju, klasa kopira bazu iz Assets mape
aplikacije na sami uređaj. U nastavku je prikazan kôd za provjeru i kopiranje baze podataka.
private void testDataBase() { try {
final String destPath = "/data/data/" + PACKAGE_NAME +"/databases/"; File f = new File(destPath+dbName); Log.v("Test Db", "Test Db"); if (!f.exists()) { File s = new File(destPath); s.mkdirs(); Log.v("Copy New Db", "Copy New Db"); CopyDB(this.getAssets().open("gymtrackdb.db"), new FileOutputStream(destPath+dbName)); Log.v("Copy New Db Complete", "Copy New Db Complete"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
Klasa DbAdapter.java obavlja CRUD operacije nad bazom i neophodna je za rad aplikacije.
Kôd prikazuje metodu za dohvaćanje svih redova zadane tablice te metodu za dodavanje
novoga reda u zadanoj tablici.
public Cursor getAllDataFromDb(String tableName, String[] columns, String selection, String[] selectionArgs, String orderBy) { return db.query(tableName, columns, selection, selectionArgs, null, null, orderBy);
} public long insertRow(String tableName, ContentValues values){ return db.insert(tableName, null, values);
}
Početno sučelje omogućuje pokretanje ostalih komponenti koje će biti opisane u nastavku rada.
22
4.2. Izvedba komponente Vježbe
Kao što je navedeno, komponenta Vježbe prikazuje listu svih dostupni vježbi i njihov opis. Za
izvedbu potrebne su klase: MuscleMapActivity, CursorAdapterExercises, DbAdapter i
ExerciseListView. Klasa MuscleMapActivity je aktivnost koja vizualno prikazuje skupine
mišića ljudskog tijela, te tako omogućuje izbor vježbi po mišićnim skupinama. Slika 4.2
prikazuje sučelje aktivnosti.
Slika 4.2. Izbor vježbi po mišićnim skupinama
Pritiskom na jednu mišićnu skupinu poziva se OnClick() metoda koja pokreće klasu
ExerciseListView i CursorAdapterExercises za prikaz vježbi. Sljedeći kôd prikazuje OnClick()
metodu.
public void onClick(View v) { Intent i = new Intent(MuscleMapActivity.this, ExerciseListView.class); i.putExtra(MUSCLE_TYPE, this.muscleType); i.putExtra(CALL_FOR_EXERCISE_ADD, addExerciseItent); if(routineTitle!=null && day != null && addExerciseItent==true ){ i.putExtra(ROUTINE_TITLE, routineTitle); i.putExtra(ROUTINE_DAY, day); Log.v("START FOR RESULT","START FOR RESULT");
startActivityForResult(i, RoutineExpandableListView.REQUEST_CODE_ADD);
} else startActivity(i); }
23
Klasa ExerciseListView sastoji se od kontrole za prikaz popisa vježbi (eng, ListView), koja se
ispunjava pomoću klase CursorAdapterExercises i podataka iz baze. Sljedeća slika prikazuje
primjer popisa vježbi za mišićnu skupinu prsa. Ova klasa ima još jednu funkcionalnost koja je
potrebna kod komponente Trening, o čemu će biti više riječ u potpoglavlju 4.3. Slika 4.3
prikazuje sučelje aktivnosti.
Slika 4.3. Popis postojećih vježbi
Klasa CursorAdapterExecise je proširenje klase CursorAdapter, a svrha joj je ispunjavanje
popisa (eng. ListView) pomoću baze. Osnovne metode CursorAdaper klase su newView() i
bindView(). Metoda newView() kreira (eng. inflate) novi prazni red u listi. Nakon toga, pomoću
bindView() taj novi red ispunjavamo s podacima iz baze (ime vježbe i slika). Klasu
CursorAdapterExecise moramo instancirati unutar ExerciseListView klase, postaviti ju kao
osnovni adapter za ispunjavanje liste i proslijediti kursor (eng. Cursor) koji pokazuje na tablicu
vježbe u bazi. Nakon tog, adapter prolazi kroz svaki red kursora i pomoću metode bindView()
iscrtava listu.
@Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.exercises_list_one_row, null); return v; }
24
Pritiskom na jedan red liste, pozivamo klasu ExerciseDescriptionActivity koja sadrži opis
odabrane vježbe. Klasi prosljeđujemo polje vrijednosti (eng. ArrayList) koja sadrži sve vježbe
iz popisa prošle aktivnosti. Pomoću tog polja aplikacija prikazuje detaljan opis odabrane vježbe,
kako se izvodi i koje sve mišićne skupine rade. Također omogućuje jednostavnu navigaciju
kroz popis vježbi. Slika 4.4. prikazuje sučelje aktivnosti.
Slika 4.4. Opis pojedine vježbe
4.3. Izvedba komponente Trening
Komponenta Trening prikazuje popis svih postojećih treninga i kreiranje novih, pregled i
uređivanje pojedinog treninga te pokretanje odabranog treninga tj. zapisivanje rezultata
treninga u dnevnik. Jedan trening se sastoji od nekoliko različitih vježbi koje su raspoređene
po danima te tako omogućuje korisniku unaprijed planiranje što pojedinog dana želi vježbati i
organizaciju njegovog vremena. Korisnik može sam sastaviti pojedini trening ili koristiti već
gotove unutar aplikacije. Za izvedbu komponente Trening koriste se klase:
AddRoutineActivity, CursorAdapterRoutines, EditExercisesRoutineActivity,
RoutineExpandableListView, RoutineExpandableListAdapter, RoutineListView,
WorkoutActivity.
Klase RoutineListView i CursorAdapterRoutines prikazuju popis svih treninga. Rade na istom
principu kao i prikaz popisa svih vježbi. Pritiskom na tipku u gornjem desnom kutu, poziva se
25
aktivnost za dodavanje novog treninga (klasa AddRoutineActivity). Sučelje je prikazano na slici
4.5. Korisnik unosi ime i kratak opis treninga, te odabire dane kojima želi trenirati. Pritiskom
na tipku za pohranu, novi trening se dodaje u bazu i aplikacija se vraća na aktivnost s popisom
svih treninga.
Slika 4.5. Kreiranje novog treninga
Pritiskom na jedan trening iz popisa pokreće se nova aktivnost koja prikazuje opis treninga i
popis vježbi od kojih se trening sastoji. Aktivnost je instanca klase RoutineExpandableListView
koja sadrži ExpandableListView kontrolu za grupiranje sadržaja, što je u ovom slučaju,
grupiranje vježbi po pojedinim danima u tjednu. Sljedeći kôd prikazuje algoritam koji u
onCreate() metodi kreira rječnik, varijabla tipa HashMap. To je varijabla koja se sastoji od
ključa i vrijednosti, gdje je, ovom slučaju, ključ dan treninga u tjednu, a vrijednost popis vježbi
za taj dan.
for (int j = 0; j < days.size(); j++) {
List<ModelRoutineExercises> routineExercisesListtest = new ArrayList<ModelRoutineExercises>();
for (int z = 0; z < routineExercisesList.size(); z++) { if (routineExercisesList.get(z).getDay().contains(days.get(j))) { routineExercisesListtest.add(routineExercisesList.get(z)); } } routineExercisesMap.put(days.get(j), routineExercisesListtest); }
Rječnik se prosljeđuje klasi RoutineExpandableListAdapter koja ima ulogu glavnog adaptera
za ispunjavanje ExpandableListView kontrole. Ova klasa vodi brigu o grupama i elementima
26
grupe ExpandableListView kontrole i što će se dogoditi pritiskom na njih. Osnovne metode za
to su:
getGroupView() - uz pomoć podataka iz getGroup() metode, ova metoda kreira i
ispunjava novi red u popisu grupa. U metodi je moguće definirati što će se dogoditi
pritiskom na pojedinu element grupe (npr. tipka za dodavanje novih vježbi).
getChildView() – uz pomoć podataka iz getChild() metode, ova metoda kreira i
ispunjava novi element grupe. U metodi je moguće definirati što će se dogoditi
pritiskom na pojedino dijete.
getChild() – koristi se unutar getChildView(). Vraća objekt koji sadrži podatke o
elementu grupe kao što su ime vježbe, slika vježbe, itd.
getGroup() - koristi se unutar getGroupView(). Vraća objekt koji sadrži podatke o grupi
kao što je primjerice njen naziv.
getGroupId() – vraća ID broj grupe u popisu. Potrebno za dohvat podataka.
getChildId() - vraća ID broj elementa u popisu. Potrebno za dohvat podataka.
Osim što prikazuje opis treninga i popis vježbi, ova aktivnost ima još dodatnih funkcionalnosti
koje su prikazane na slici 4.6, to su: 1. Dodavanje novih vježbi u grupu, 2. Zapisivanje rezultata
treninga u dnevnik i 3. Uređivanje podataka pojedine vježbe.
Slika 4.6. Opis treninga i popis vježbi
Slika 4.6 prikazuje tipku broj 1 koja pokreće aktivnost za dodavanje novih vježbi u grupu.
Aktivnost je identična aktivnosti za pregled svih vježbi uz dodatak da svaki red u popisu
1
2
3
27
posjeduje okvir za potvrdu (eng. checkbox). Tipka Spremi dodaje sve označene vježbe u
odabranu grupu. Slika 4.7. prikazuje sučelje aktivnosti.
Slika 4.7.Odabir vježbi treninga
Slika 4.8 prikazuje sučelje aktivnosti za uređivanje podataka o pojedinoj vježbi (npr. broj
setova3). Aktivnost se pokreće pomoću tipke broj 3 (slika 4.6.). Omogućuje i brisanje pojedine
vježbe iz grupe pritiskom na tipku Obriši vježbu. Pritiskom na tipku Spremi, aktivnost
pohranjuje promjene u bazu i vraća se na prethodnu aktivnost.
Slika 4.8. Uređivanje podataka pojedine vježbe
Najbitniji dio ove komponente, a i cijele aplikacije je zapisivanje rezultata treninga u dnevnik.
Aktivnost koja to omogućuje se pokreće pomoću tipke 2 (slika 4.6.) u izabranoj grupi tj.
3 Set – broj ponavljanja jedne vježbe
28
izabranog dana. Slika 4.9. prikazuje sučelje aktivnosti. Sučelje se sastoji od kontrola (eng.
EditText) za zapisivanje rezultata treninga (težina utega, broj ponavljanja vježbe, vrijeme
trajanja vježbe i vrijeme odmaranja između setova) i tablice koja prikazuje rezultate treninga
koje korisnik unosi. Osim rezultata novog treninga, u tablici se mogu provjeriti i rezultate
prijašnjih treninga.
Slika 4.9. Aktivnost za unos rezultata treninga u dnevnik
Aktivnost dohvaća popis vježbi za odabrani dan, te prikazuje jednu po jednu vježbu sve do
kraja treninga. Kada korisnik ispuni zadani broj setova jedne vježbe, aplikacija automatski
prelazi na sljedeću vježbu. Moguće je i ručno promijeniti trenutnu vježbu, što znači da korisnik
ne mora pratiti zadani redoslijed ako ne želi. Korisnik može prekinuti trening u bilo koje
vrijeme, a kada se želi vratiti, aplikacija će započeti od one vježbe koju je korisnik zadnje
vježbao. Kada korisnik završi s treningom, aktivnost se zatvara i vraća na prethodnu aktivnost
s opisom treninga.
4.4. Izvedba komponente Dnevnik
Ova komponenta omogućuje pregled dnevnika po datumu. Korisnik odabire datum te ako
postoji dnevnik za taj dan, aplikacija ispisuje rezultate treninga u obliku tablice. Za izvedbu ove
komponente koriste se: DbAdapter, LogActivity i LogTableActivity klase.
Aktivnost LogActivity se sastoji od kontrole za izbor datuma (eng. CalendarVew). To je zapravo
i jedini zadatak ove aktivnosti, odabrati datum, te ako postoji dnevnik treninga, pokrenuti
aktivnost za prikaz dnevnika. Slika 4.10. prikazuje sučelje aktivnosti.
29
Slika 4.10. Odabir datuma dnevnika
Pritiskom na tipku Učitaj dnevnik poziva se sljedeći kôd koji provjerava postoji li dnevnik u
bazi za odabrani datum.
@Override public void onClick(View v) { final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String date = sdf.format(cal.getDate()); Cursor mCursor = dbadatper.getAllDataFromDb(ModelLogs.TABLE_LOGS, null, LOG_QUERY, new String[]{date,profId},null ); if (mCursor.getCount() > 0) { Intent i = new Intent(getApplicationContext(), LogTableActivity.class); i.putExtra(LogTableActivity.LOG_DATE, date); startActivity(i); } else{ Toast.makeText(getApplicationContext(), R.string.no_workout_log, Toast.LENGTH_SHORT).show(); } }
Ako zapis postoji u bazi, aktivnost pokreće LogTableActivity aktivnost i prosljeđuje joj datum
pomoću putExtra() metode. U onCreate() metodi aktivnost dohvaća podatke iz baze i ispisuje
ih u obliku tablice, što je vidljivo na slici 4.11.
30
Slika 4.11. Dnevnik odrađenih vježbi
4.5. Izvedba komponente Napredak
Komponenta napredak omogućuje prikaz rezultata treninga u obliku xy-grafa. Graf prikazuje
sve podatke izabrane vježbe. Komponenta se sastoji od klasa DbAdapter, GraphActivity, te
pomoćne biblioteke achartengine-1.1.0.jar. AChartEngine je besplatna biblioteka za Android
aplikacije koja omogućuje crtanje grafova. Slika 4.12 prikazuje sučelje aktivnosti.
Slika 4.12. Graf napredovanja
31
Korisnik prvo mora odabrati jedan trening, zatim jednu vježbu iz odabranog treninga. Na taj
način aplikacija dohvaća podatke iz baze, pretraživajući rezultate odabrane vježbe. Korisnik
može odabrati koje rezultate želi prikazat. Moguće je prikazati maksimalnu težinu s kojom je
korisnik radio ili maksimalan broj ponavljanja u jednom setu. Os x prikazuje broj tjedna, dok
os y prikazuje maksimalnu težinu ili broj ponavljanja. U nastavku je prikazan kôd algoritma
koji pretražuje bazu i prikazuje rezultate na grafu.
Cursor mCursor = dbadapter.getAllDataFromDb(ModelLogs.TABLE_LOGS, null, LOG_DATA_QUERY, new String[]{profileId,spinerExercise.getSelectedItem(). toString(),spinerRoutine.getSelectedItem().toString()}, ModelLogs.COLLUMN_DATE); mCursor.moveToFirst(); while(!mCursor.isAfterLast()){
String _id = Cursor.getString(mCursor.getColumnIndexOrThrow(ModelLogs.COLLUMN_ID)); Cursor sCursor = badapter.getAllDataFromDb(ModelLogHelper.TABLE_LOG_HELPERS, null, "log_fk=?", new String[]{_id}, ModelLogHelper.COLLUMN_REPS);
if(sCursor.moveToLast()){ int reps = sCursor.getInt(sCursor.getColumnIndexOrThrow(ModelLogHelper.COLLUMN_REPS));
mCurrentSeries.add(i, reps); mChartView.repaint(); i+=1; } mCursor.moveToNext();
}
Osnovne metode, koje prikazuju vrijednosti na grafu, su metode biblioteke achartengine
XYSeries.add() i GraphicalView.repaint(). Metoda XYSeries.add() dodaje nove vrijednosti u
graf, ali one nisu vidljive sve dok se graf ne ažurira. Upravo metoda GraphicalView.repaint()
ima zadatak ažuriranja grafa, koju je potrebno pozvati svaki put nakon dodavanja novih
vrijednosti. U kôdu je još prikazano kako se pomoću kursora i while petlje prolazi kroz svaki
red rezultata upita i dohvaća podatke (maksimalna težina ili broj ponavljanje) za graf.
32
4.6. Izvedba komponente Profil/Postavke
Komponenta Profil/postavke omogućuje korisniku uređivanje korisničkih podataka poput
imena, kreiranje novog profila, i promjenu trenutno aktivnog profila. Za izvedbu aktivnosti
koriste se klase PreferencesActivity, ProfileActiviy te pomoćna biblioteka afilechooser.jar.
Klasa ProfileActivity je aktivnost za kreiranje novog profila i uređivanje podataka postojećih
profila. Aktivnost se sastoji od kontrola za unos podataka i tipke koja pokreće FileExplorer
aktivnost za odabir profilne slike. Slika 4.13. prikazuje sučelje aktivnosti i FileExploler - a.
Slika 4.13. Kreiranje/uređivanje profila
Ako želimo uređivati podatke postojećeg korisnika, aktivnosti moramo proslijediti jedinstveni
identifikacijski broj korisnika. Aktivnost provjerava broj u onCreate() metodi, te ako postoji
korisnik, preuzima podatke iz baze i prikazuje ih na zaslon. Ako korisnik unese nove podatke i
pritisne na tipku Spremi, novi podaci, pod istim identifikacijskim brojem, se pohranjuju u bazu.
Aktivnost FileExplorer je izvedena pomoću besplatne biblioteke aFIleChooser (Burke, 2013)
i nekoliko modifikacija, a omogućuje izbor profilne slike. Slika može biti tipa jpeg ili png i bilo
koje veličine kako aplikacija samostalno kreira thumbnail slike zbog uštede na memoriji.
Klasa PreferencesActivity je proširenje PreferenceActivity klase koja omogućuje hijerarhijski
prikaz postavki aplikacije. U ovom slučaju te postavke se sastoje od izbora aktivnog profila i
kreiranja novog profila. Aktivnost automatski svaku promjenu pohranjuje u _preferences.xml
datoteku. Spremljene postavke možemo u bilo kojoj aktivnosti provjeravati pomoću
getDefaultSharedPreferences() metoda, kao što je prikazano u sljedećem kôdu. Pomoću
33
getDefaultSharedPreferences() otvara se datoteka _preferences.xml, te nakon toga pomoću
getString() dohvaćamo traženu vrijednost postavke. Potrebno je samo proslijediti naziv
postavke od koje želimo vrijednost. Slika 4.14. prikazuje sučelje aktivnosti.
private SharedPreferences settings ; settings = PreferenceManager.getDefaultSharedPreferences(this); String profId = settings.getString("pref_identifier", null);
Slika 4.14. Odabir aktivnog korisnika
4.7. Pregled i usporedba sličnih aplikacija
U nastavku slijedi prikaz postojećih aplikacija za praćenje napredovanja u teretani, te usporedba
njihovih funkcionalnosti sa aplikacijom koja je razvijena za potrebe ovog završnog rada.
Jedna od najpopularnijih aplikacija, po broju preuzimanja s Google Play-a, je JEFIT – Workout
and Fitnes Tracker. Aplikaciju ističe bogato korisničko sučelje, veliki broj različitih vježbi te
opis i demonstracija izvođenja istih, nekoliko dodatnih malih aplikacija poput štoperice i
mogućnost preuzimanja novog sadržaja putem Interneta. Osnovna funkcionalnost se svodi,
poput aplikacije koja je razvijena za potrebe ovoga rada, na kreiranje treninga i zapisivanje
rezultata treninga u dnevnik. Aplikacija prikazuje napredovanje samo u obliku grafikona, ali
zato nudi i mogućnost praćenja težine i postotka masnoće te prikaz promjena u obliku grafa.
Na slici 4.15 se nalazi prikaz sučelja pojedinih aktivnosti aplikacije.
34
Slika 4.15. JEFIT – Workout and Fitnes Tracker (Jefit, 2013)
Sljedeća aplikacija naziva se You Are Your Own Gym. Aplikacija je jednostavnog sučelja,
pruža veliki broj vježbi, ali sadrži vrlo malo dodatnih funkcionalnosti. Ono što aplikaciju ističe
od drugih jest video prikaz izvođenja pojedinih vježbi (zahtjeva naknadno skidanje video
sadržaja s Interneta). Aplikacija nema mogućnost kreiranja treninga poput JEFIT-a i aplikacije
koja je razvijena za potrebe rada. Zapisivanje rezultata svodi se na pronalazak pojedine vježbe
te unos rezultata iste. Prikaz napredovanja je moguć samo pregledom dnevnika rezultata, nema
mogućnost prikaza rezultata u obliku grafa. Aplikacija nema više nikakvih dodatnih
mogućnosti. Na slici 4.16 se nalazi prikaz sučelja pojedinih aktivnosti aplikacije.
Slika 4.16. You Are Your Own Gym (Leafcutter Studios, 2013)
Posljednja aplikacija koja će biti opisana je Extreme Fitness Tracker Pro. Aplikacija sadrži sve
funkcionalnosti kao i navedene aplikacije. Omogućuje kreiranje vlastitog treninga te
zapisivanje rezultata unutar dnevnika. Rezultati napredovanja su prikazani u obliku grafa ili
35
jednostavnim popisom rezultata sortirane po datumu izvođenja. Međutim, za razliku od
opisanih aplikacija ova sadrži mogućnost izračuna dnevnog unosa kalorija te pohranu
sigurnosne kopije svih podataka. Na slici 4.17 se nalazi prikaz sučelja pojedinih aktivnosti.
Slika 4.17. Extreme Fitness Tracker Pro (UnifyLog LLC, 2013)
36
5. Zaključak
U teorijskom dijelu rada opisana je povijest i arhitektura Android operacijskog sustava,
osnovne komponente Android aplikacije, te prikazani primjeri korištenja istih. Razvoj
aplikacija u Android razvojnom okruženju karakterizira otvorenost, brzina, fleksibilnost i
jednostavnost. Android je danas bez sumnje jedan od najrasprostranjenijih operacijskih sustava
u mobilnom svijetu , a jedan od razloga je Google Play koji sadrži preko milijun aplikacija i
preko tri milijarde preuzimanja.
U praktičnom dijelu rada razvijena je aplikacija koja omogućuje praćenje napredovanja u
teretani. Aplikacija pruža korisniku jednostavno sučelje, mogućnost kreiranje vlastitih treninga
od nekoliko različitih vježbi, te praćenje rezultata treninga pomoću dnevnika. Osim toga,
razvijena aplikacija omogućuje vremensko planiranje treninga, određivanje broja vježbi, odabir
ispravne težine utega prema rezultatima prethodnih treninga pojedinih vježbi itd.
Napredovanje, za pojedine vježbe, je prikazano u obliku grafa koji prikazuje promjene po
tjednim intervalima.
Razvijena aplikacija, u usporedbi sa sličnim aplikacijama, sadrži samo osnovne funkcionalnosti
za praćenja napredovanja, te kako bi ista mogla konkurirati popularnim aplikacijama potrebna
su dodatna proširenja. Dodavanje funkcionalnosti dnevnika i kalkulatora dnevnog unosa
kalorija povećala bi korisnost aplikacije korisnicima kojima nije u cilju dobivanje mišićne
mase, poput korisnika koji žele povećati ili smanjiti tjelesnu težinu, a upravo je za to potrebna
ispravna prehrana. Također je uvijek moguće poboljšati korisničko sučelje, te prilagoditi
sučelje različitim rezolucijama ekrana.
S obzirom na to da aplikacija trenutno posjeduje samo osnovne funkcionalnosti za praćenje
napredovanja, ona je ipak dovoljna za planiranje kvalitetnog treninga, te uz malo volje i truda
rezultati treninga ću biti vidljivi.
37
Literatura
1. Bucić T.: Baza podataka za elektroničke knjižnice, Diplomski rad, Osijek, 2012.
2. Burke P.: aFileChooser - Android File Chooser, 2013,
https://github.com/iPaulPro/aFileChooser (Učitano: 07.09.2013)
3. Dujmović A.: Upravljanje video nadzorom cestovnog prometa mobilnim uređajem na
android platformi, Diplomski rad, Dubrovnik, 2010.
4. Henriques T.: Powerful Reasons to Use a Workout Log, 2012., http://www.t-
nation.com/readArticle.do?id=5108766 (Učitano: 13.09.2013)
5. IDC: Worldwide Mobile Phone Market Forecast to Grow 7.3% in 2013 Driven by 1 Billion
Smartphone Shipments , 2013,
http://www.idc.com/getdoc.jsp?containerId=prUS24302813 (Učitano: 07.09.2013)
6. Jefit Inc: JEFIT Pro - Workout & Fitness, 2013,
https://play.google.com/store/apps/details?id=je.fit (Učitano: 10.09.2013)
7. Leafcutter Studios: You Are Your Own Gym, 2013,
https://play.google.com/store/apps/details?id=com.leafcutterstudios.yayog (Učitano:
10.09.2013)
8. Kreibich J.: , http://www.slideshare.net/jkreibich/introduction-to-sqlite-the-most-popular-
database-in-the-world (Učitano: 12.09.2013)
9. Meier R: Professional Android 2 Application Development, Wiley Publishing, Inc.,
Indianapolis, Indiana, 2010.
10. Marjanica A.: GPS kolektor – prototip android aplikacije za prikupljanje prostornih
podataka, Zagreb, 2011.
11. Paul R.: , http://arstechnica.com/gadgets/2010/09/sony-ericcson-goes-android-leaves-
nokia-as-only-big-symbian-fan/ (Učitano: 13.09.2013)
12. Penezić D.: SQLite - najraširenija transakcijska baza podataka, 2012.,
http://sistemac.srce.unizg.hr/index.php?id=35&tx_ttnews%5Btt_news%5D=778&cHash=
2e903c58643a650d171ee6e8314e3381 (Učitano: 05.9.2013.)
13. Rubin A.: Where's my Gphone?, 2007., http://googleblog.blogspot.com/2007/11/wheres-
my-gphone.html (Učitano 28.08.2013.)
14. Rowinski D.: Google Play Hits One Million Android Apps, 2013.,
http://readwrite.com/2013/07/24/google-play-hits-one-million-android-
apps#awesm=~ohsgumhgtZ8uvV (Učitano: 13.09.2013)
38
15. UnifyLog LLC: Extreme Fitness Tracker, 2013,
https://play.google.com/store/apps/details?id=com.unifylog.droid90 (Učitano:
10.09.2013)
16. Wei-Meng L.: Beginning Android Application development, Wiley Publishing, Inc.,
Indianapolis, Indiana, 2011.
17. Wolfe B.: The Number Of Google Play App Downloads Now Exceed Those In Apple's
App Store, 2013, http://appadvice.com/appnn/2013/07/the-number-of-google-play-app-
downloads-now-exceed-those-of-apples-app-store (Učitano: 13.09.2013)
Recommended