Escolar Documentos
Profissional Documentos
Cultura Documentos
RAZVOJ APLIKACIJA ZA
OPERATIVNI SISTEM ANDROID
Sadraj
1.
1.1.1.
Android 1.0/1.1.................................................................................... 8
1.1.2.
1.1.3.
1.1.4.
1.1.5.
1.1.6.
1.1.7.
1.1.8.
1.1.9.
1.3.
1.3.1.
Linux jezgro....................................................................................... 20
1.3.2.
1.3.3.
1.3.4.
Application Framevork.......................................................................21
1.3.5.
Integrisani pretraiva.......................................................................22
1.3.6.
Optimizovana grafika........................................................................22
1.3.7.
SQLite................................................................................................ 22
1.4.
1.4.1.
2.
3.
4.
Komponente aplikacija......................................................................23
2.2.
Fajl AndroidManifest.xml..........................................................................40
3.2.
Kreiranje aktivnosti.................................................................................. 47
Tipovi resursa.......................................................................................... 54
4.3.
Rad sa resursima..................................................................................... 55
4.3.1.
Rad sa stringovima............................................................................55
4.3.2.
4.3.3.
4.3.4.
Rad sa bojama................................................................................... 57
4.3.5.
4.3.6.
Rad sa menijima................................................................................ 58
4.3.7.
Rad sa fajlovima................................................................................ 60
4.3.8.
4.3.9.
Rad sa stilovima................................................................................ 62
XML layout............................................................................................... 66
5.2.
Layouts.................................................................................................... 68
5.2.1.
LinearLayout...................................................................................... 68
5.2.2.
RelativeLayout................................................................................... 71
5.2.3.
TableLayout....................................................................................... 73
5.2.4.
GridView............................................................................................ 76
5.2.5.
TabLayout.......................................................................................... 79
5.2.6.
ListView............................................................................................. 82
5.3.
Meniji....................................................................................................... 84
5.3.1.
Meni opcija........................................................................................ 85
5.3.2.
5.3.3.
5.3.4.
Iskaui meni..................................................................................... 89
5.3.5.
5.4.
5.4.1.
5.5.
Event listeners................................................................................... 92
5.5.1.
Toast notifikacije................................................................................ 97
5.5.2.
5.5.3.
Dialog notifikacije.............................................................................. 98
5.6.
Dijalozi..................................................................................................... 99
3
6.
5.6.1.
Kreiranje AlertDialog-a....................................................................100
5.6.2.
5.6.3.
Intents.......................................................................................................... 101
6.1.
6.1.1.
6.1.2.
6.2.
7.
6.2.1.
6.2.2.
7.2.
7.3.
8.
Zajednika podeavanja........................................................................125
8.2.
8.3.
8.4.
9.
8.4.1.
8.4.2.
8.4.3.
8.4.4.
8.4.5.
8.4.6.
8.4.7.
Rad sa transakcijama......................................................................131
8.4.8.
8.4.9.
Internet........................................................................................................ 134
9.1.
10.
HttpURLConnection................................................................................ 134
Lokacije i mape......................................................................................... 137
10.1.
10.2.
OHA
istie
sledee
karakteristike
Android
Android OS
Samo tri meseca kasnije, u Maju 2009. Gugl predstavlja novu verziju svog
operativnog sistema za mobilne ureaje, Android 1.5 koji je imao kodni
naziv Cupcake (mala torta).
Od ove verzije Gugl je svakoj novijoj verziji dodeljivao naziv nekog slatkia,
a skoriji dolazak nove verzije bio bi najavljivan
postavljanjem skulpture sledee poslastice
ispred sedita firme.
Nova verzija donela je znaajna poboljanja
sistema u vidu novih mogunosti kao to su:
podesiva tastatura
prepoznavanje glasa
Android
(Eclair)
Prvi telefon koji u oktobru dobija novu verziju operativnog sistema Android,
2.0/2.1 bio je ureaj kompanije Motorola, koji se nazivao Motorola Droid.
Ovaj telefon pokretala je nova verzija Android sistema 2.0
(Eclair).
Android 2.0 je smatran za prvu veliku nadogradnju sistema, koja je donela
znaajne promene kako po pitanju izgleda grafikog interfejsa, tako i po
pitanju brojnih novih mogunosti koje je nova verzija ukljuivala.
Motorola Droid koja je imala procesor tek prosene snage, imala je zavidan
grafiki procesor, tako da su znaajne firme na polju 3D igara polako
poele da svoje naslove prilagoavaju sve jaim Android ureajima.
Digitalni zum
Poboljana tastatura
Live Wallpapers...
11
12
13
Android 2.4 ?
Motorola Xoom
1.1.10.
Android 3.1
16
Android 3.2
1.1.12.
1.2.Funkcionalnosti Android OS
Osnovne funkcionalnosti Android OS:
Prikaz na ureajima OS prilagoava izgled razliitim tipovima
ureaja i kompatibilian je sa 2D, 3D grafikim bibliotekama
Bluetooth
Video poziv
18
Standardne
aplikacije
Aplikacije
proizvoaa
Pretraiva
...
Okvir aplikac.
(Framework)
Upravljanje
aktivnostima
Upravljanje
prozorima
Provajderi
sadraja
Upravljanje
obavetenjima
Upravljanje
paketima
Upravljanje
resursima
Upravljanje
lokacijama
XMPP servis
Android
Runtime
Biblioteke
Surface
Manager
SQLite
FreeType
Biblioteke jezgra
WebKit
SSL
OpenGL|
ES
Dalvik virtuelna
maina
Linux Kernel
Drajveri za
displej
Drajveri za
kameru
Drajveri za
Bluetooth
Drajveri za fle
memoriju
Drajveri za USB
Drajveri za
tastaturu
WiFi drajveri
Audio drajveri
19
1.3.1.Linux jezgro
20
21
upravljanje programskim paketima (eng. Package Manager) sadri informaciju o aplikacijama instaliranim na sistemu
upravljanje prozorima (eng. Window Manager) - upravljanje
aplikacionim prozorima,
upravljanje pozivima (eng. Telephone Manager) - sadri API-je koji
se koriste pri izradi aplikacija za upravljanje pozivima,
pruaoci sadraja (eng. Content Providers) - omoguavaju
zajedniko korienje podataka od strane vie aplikacija,
upravljanje resursima (eng. Resource Manager) - slui za
skladitenje delova aplikacije koji nisu kod (npr. slike),
sistem grafikog prikaza (eng. Viev Sistem) - sadri bazu gotovih
grafikih prikaza i alata (eng. vidget),
upravljanje lokacijski zasnovanim uslugama (eng. Location
Manager) i
upravljanje notifikacijama (eng. Notification Manager) - upravljanje
notifikacijama i dogaajima (npr. dospee poruke, nadolazei
sastanak).
Aplikativni sloj je poslednji sloj u arhitekturi sistema Android i ine ga
korisnike aplikacije ureaja. Predstavlja sloj vidljiv krajnjem korisniku.
Ukljuuje neke od standardnih sistemskih aplikaciJa kao to su Veb
pretraiva, lista kontakata, telefon, itd.
1.3.5.Integrisani pretraiva
Google je napravio pravi potez izborom WebKit kao open source web
pretraivaa. Ubacili su dva veoma bitna poboljanja, two pass layout i
frame flattening. Two pass layout otvara stranicu bez ekanja na
blokirajue elemente, kao to su eksterni CSS ili eksterni JavaScript, ali
posle kraeg perioda ponovo otvara stranicu sa svim podacima na strani.
Frame flattening konvertuje postojee okvire stranice u jedan okvir i taj
okvir pokazuje na ekranu. Ova poboljanja pospeuju brzinu i korisnost
surfovanja internetom preko mobilnog telefona.
1.3.6.Optimizovana grafika
1.4.1.Komponente aplikacija
23
Aktivnost
Aktivnost predstavlja jedan ekran sa korisnikim interfejsom. Na primer
email aplikacija moe imati jednu aktivnost koja prikazuje listu novih
mejlova, druga aktivnost omoguava pisanje mejla, a trea aktivnost slui
za itanje mejlova. Iako su aktivnosti u okviru jedne aplikacije
komponovane i koordinirane tako da predstavljaju logiku celinu, svaka od
njih je nezavisna. U skladu sa tim, razliite aplikacije mogu da startuju
akitvnosti iz drugih aplikacija. Na primer aplikacija za rad kamere, moe
startovati aktivnost iz email aplikacije kako bi omoguila deljenje
fotografija na drutvenoj mrei. Svaka aktivnost se implementira kao
podklasa klase Activity.
Servisi (Services)
Servis je komponenta koja se izvrava u pozadini kako bi se omoguila
realizacija dugotrajnih operacija, kao i izvravanje udaljenih procesa.
Servis ne prua korisniki interfejs. Na primer, servis moe da puta
muziku u pozadini dok se korisnik nalazi u nekoj drugoj aplikacija.
Aktivnost moe da pokrene servis
Provajderi sadraja (Content providers)
Provajder sadraja upravlja deljenim setom podataka aplikacije. Podaci se
mogu skladititi u fajl sistemu, bazi, na vebu ili bilo kojoj perzistentnoj
lokaciji kojoj aplikacije moe da pristupi. Preko provajdera sadraja
aplikacija moe da vri upit nada podacima. Na primer, Android prua
provajdera sadraja koji upravlja informacijama o imeniku na telefonu.
Svaka aplikacija sa odgovarajuim permisijama, preko provajdera sadraja
moe da pristupi kontaktima u imeniku.
Broadcast receivers
Ova komponenta aplikacije je vezana za prenos sistemskih objava i
notifikacija. Veina broadcast receiver-a potie iz sistema obavetenje
da je baterija slaba, ili da je slika napravljena i sl. Ova komponenta ne
uestvuje u korisnikom interfejsu, ali moe da se pojavi kao notifikacija
lampice i sl.
Jedinstvena karakteristika Android OS je u tome to svaka aplikacija moe
startovati komponente iz neke druge aplikacije.
Komponente aplikacije se aktiviraju preko asinhrone poruke intenta. Sve
komponente jedne aplikacije se definiu u okviru AndroidManifest.xml
fajla. Svaka Android aplikacija osim koda sadri i odgovarajue resurse,
kao to su slike, audio fajlovi, stilovi, itd.
24
Java SDK
Eclipse IDE
Android SDK
Android Development Tools Plugin za Eclipse
Potrebne verzije Android platformi za Android SDK
25
26
27
28
31
32
33
35
36
37
38
39
Opis
Sadri fajlove sa izvornim kodom. U ovom folderu se nalaze sve kreirane aktivnosti (u okviru
odgovarajueg paketa).
Ovde se nalaze kompajlovani fajlovi projekta, kao to su konani apk fajlovi (varijanta jar fajla za
instalaciju na Android ureaju).
Sadri izvorni kod razvijen korienjem alata Android NDK (Native Development Kit). Ukoliko se ne
koristi NDK, ovaj folder ne postoji.
Sadri generisane fajlove, iji sadraj ne treba runo menjati.
Ovde se nalaze dodatni materijali koji se koriste u projektu. Na primer, to mogu da budu podaci koje
koristi aplikacija. Na poetku je ovaj folder prazan.
U ovom folderu se nalaze dodatni resursi koji se koriste u aplikaciji. Oni su organizovani po
podfolderima. To mogu da budu slike, animacije, raspored elemenata korisnikog interfejsa i sl.
Ovde se uvaju dodatne biblioteke koje se koriste u projektu.
2.2.Fajl AndroidManifest.xml
Svaka aplikacija mora da poseduje svoj AndroidManifest.xml fajl u korenom
folderu projekta. Naziv manifest fajla mora da bude AndroidManifest.xml.
Manifest sadri neophodne informacije o aplikaciji i o Android sistemu. Ove
informacije sistem mora da poseduje pre poetka izvravanja aplikacije. Neke od
funkcija manifest fajla su:
Sadri naziv Java paketa u okviru kojeg je napisan izvorni kod aplikacije.
Naziv paketa predstavlja jedinstveni identifikator aplikacije.
Opisuje komponente aplikacije aktivnosti, servise, primaoce poruka i
provajdere sadraja. Dakle, manifest fajl sadri nazive klasa u kojima su
opisane komponente aplikacije. Na primer, aplikacija se nee startovati
ukoliko u manifest fajlu nije navedena njena poetna aktivnost, ak ni u
sluaju da fajl sa Java izvornim kodom te aktivnosti postoji.
Odreuje koji procesi e biti domaini komponentama aplikacije.
Definie koje privilegije (permissions) aplikacija mora da poseduje da bi
mogla nesmetano da funkcionie.
Takoe definie koje privilegije moraju druge aplikacije da poseduju da bi
mogle da koriste komponente aplikacije.
Definie minimalnu verziju Android API-a koji zahteva aplikacija.
Definie listu biblioteka koje aplikacija koristi
40
41
42
sadri<intent-filter> i <meta-data>.
<uses-library> definie biblioteku sa kojom aplikacija mora biti
povezana.Sadran u <application> bloku.
<uses-permission> deo bezbednosnog modela koji sadri bezbednosne
dozvole dodeljene od strane korisnika, a odnose se na funkcije aplikacije.
Dozvole se definiu prilikom instaliranja aplikacije.
<uses-sdk> definie nivo Android API-ja na kojima se moe izvravati
aplikacija.
stanice.
3.
43
Resumed (Running)
o Aktivnost je pokrenuta i fokusirana.
Paused
o Druga aktivnost je pokrenuta i fokusirana (u prvom planu), ali je
tekua aktivnost i dalje pokrenuta i vidljiva. Na primer, druga
aktivnost je u prvom planu, dok je tekua aktivnost vidljiva, ali ne
zauzima ceo ekran. Aktivnost ije je stanje paused je potpuno iva
(objekat klase Activity se nalazi u memoriji, zadrava sva stanja i
ostaje u window manager-u), meutim ova aktivnost moe da bude
ubijena u sluaju niske slobodne memorije.
Stopped
o Aktivnost ije je stanje stopped je i dalje iva, ali radi u pozadini.
Objekat klase Activity i dalje se nalazi u memoriji, uva sva stanja,
ali se vie ne nalazi u okviru window manager-a. Ovu aktivnost vie
ne vidi korisnik i u sluaju potrebe za memorijom sistem moe da je
ubije.
44
45
Metoda
Opis
onCreate()
onRestart()
onStart()
onResume()
onPause()
onStop()
onDestroy()
Moe da se
ubije
posle?
Sledea
metoda
Ne
onStart()
Ne
onStart()
Ne
onResume()
ili
onStop()
Ne
onPause()
Da
onResume()
ili
onStop()
Da
onRestart()
ili
onDestroy()
Da
nema
46
3.2.Kreiranje aktivnosti
Da bi se kreirala nova aktivnost u okviru Android aplikacije, kreira se nova klasa
koja nasleuje klasu Activity (ili njenu izvedenu klasu). U novokreiranoj klasi,
neophodno je implementirati metode opisane u prethodnom poglavlju (vidiPrimer
3.2). Najvanije je implementiranje metoda onCreate() i onPause().
Dakle, u okviru ve kreiranog Android poglavlja (vidi Poglavlje 2.1) potrebno je
kreirati novu klasu. U okviru Package Explorera koji se najee nalazi sa leve
strane u Eclipse razvojnom okruenju najpre treba izabrati folder src, a zatim
kliknuti desnim tasterom mia na paket koji je kreiran zajedno sa Android
projektom. U naem sluaju, to je net.myelab.android.mojaaplikacija(Slika ).
47
package net.myelab.android.mojaaplikacija;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class Aktivnost extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello world");
setContentView(tv);
}
}
51
52
55
4.2.Tipovi resursa
Android aplikacije koriste veliki broj razliitih tipova resursa kao to je
tekst, grafika, eme u boji za dizajn korisnikog interfejsa itd. Ovi resursi se
nalaze u res/ direktorijumu vae android aplikacije.
Fajlovi resursa sauvani u /res direktorijumu moraju da potuju sledea
pravila:
-
Naziv
XML tag
Strings
Niz stringova
Potreban
direktorijum
/res/values/
/res/values/
strings.xml
strings.xml
Boolenas
Colors
Dimensions
Integers
Meovit niz
/res/values/
/res/values/
/res/values/
/res/values/
/res/values/
bools.xml
Colors.xml
Dimens.xml
integers.xml
Arrays.xml
Jednostavni
elementi
(Drawables)
Graphics
(slike)
Meni
/res/values/
drawables.xml
<string>
<string-array>,
<item>
<bool>
<color>
<dimen>
<integer>
<array>,
<item>
<drawable>
/res/drawable/
Icon.png,
logo,jpg itd
Primer:
mainmenu.xml
helpmenu.xml
XML fajlovi
Izgled
(Layouts)
Stilovi i teme
Animacija
/res/menu/
/res/xml/
/res/layout/
/res/values/
/res/drawable/
<menu>
main.xml
styles.xml
themes.xml
Primer.
sekvenca1.xml
sekvenca2.xml
<style>
<animationlist>, <item>
4.3.Rad sa resursima
U ovom delu bie prikazano kako moete upravljati resursima u vaoj
Andoird aplikaciji, koji formati su podrani i u kom formatu se uvaju. Neke
vrste resursa kao to su tekst, boja itd. su veoma dobro podrane od
strane Eclipse editora i Andoird Plug-in Resource Editor, dok drugi kao to
su animirane sekvence, nisu i sa njima je lake raditi direktno editovanjem
u XML datotekama.
4.3.1.Rad sa stringovima
<string-array name=Predavaci>
<item>Marijana Zrakic Despotovic</item>
<item>Bozidar Radenkovic</item>
</string-array>
</resources>
Pristup resursima je veoma jednostavno, u konkretnom primeru pristup
resursu predmeti radimo na sledei nain:
String[] predmeti = getResources().getStringArray(R.array.predmeti);
4.3.3.Rad sa Boolean i Integer resursima
58
4.3.4.Rad sa bojama
<ImageView
android:id="@+id/LogoImageView "
android:src="@drawable/logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Sledei kod, na primer, postavlja i otvara logo.png sliku u kontroli
ImageView koja se zove LogoImageView, koja mora biti definisana unutar
fajla za layout (main.xml):
ImageView logoView = (ImageView)findViewById(R.id.LogoImageView);
logoView.setImageResource(R.drawable.logo);
Takoe se moe kreirati specijalni XML fajl kako bi se opisale druge
Drawable podklase, kao to je ShapeDrawable. Moe se koristiti klasa
ShapeDrawable da bi se definisali razni oblici, kao to je pravougaonik i
krug.
4.3.6.Rad sa menijima
</menu>
61
62
4.3.7.Rad sa fajlovima
Aplikacija moe sadrati .raw fajlove kao resurse. Raw fajlovi koje
aplikacija moe koristiti sadri audio, video i druge fajlove. Svi raw fajlovi
resursa bi trebali biti sauvani u /res/raw direktorijum.
Nema pravila ili ogranienja pri kreiranju raw fajlova (osim pravila o nazivu
fajla koji je ranije pomenut). Ako treba ubaciti multimedia fajlove, treba
proveriti dokumentaciju Android platforme kako bi se odredili koji su media
formati i kodeci podrani za traeni mobilni telefon. Isto vai i za bilo koji
drugi format koji treba da se ubaci u resurse aplikacije.Ako format fajla koji
treba da se koristi nije podran u poetnom Android sistemu, aplikacija e
moda zatraiti da sama odradi proveru fajlova.
Da bi se pristupilo raw fajlu programerski, jednostavno treba koristiti
komandu openRawResource(). Na primer, sledei kod bi napravio
InputStream objekat da bi pristupio resurs fajlu /res/raw/file1.txt:
InputStream iFile = getResources().openRawResource(R.raw.file1);
63
64
<style name=opciona_polja_style>
<item name=android:textColor>#FFFFFF</item>
<item name=android:textSize>12pt</item>
<item name=android:textStyle>italic</item>
</style>
</resources>
4.3.10.
Rad sa temama
66
67
pogled objekat ija prenos struktura u sebi nosi zapis izgleda i sadraja
odreenog pravougaonog podruja na ekranu, upravlja iscrtavanjem
elemenata, pomeranjem sadraja na ekranu (scrolling) i ostalim faktorima
koji utiu na izgled definisanog dela ekrana. U hijerarhijskom stablu objekti
pogled su listovi stabla. Android raspolae sa ve gotovim skupovima
objekata ove vrste kao to su dugmad, kvadratii za odabir (eng.
checkbok) i slino. Ovi objekti nasleuju klasu View;
grupe pogleda posebna vrsta objekta pogled koja sadri i upravlja
grupom zavisnih objekata pogleda i grupe pogleda ime je omoguena
kompleksnost prikaza korisnikog interfejsa. Objekti ove vrste su inastance
klase ViewGroup.
68
5.1.XML layout
Naa prva Android aplikacija (Primer 3.4) koristila je najjednostavniji pogled
TextView koji slui za prikaz teksta i bila je dizajnirana proceduralno, to znai da
nije korien XML prilikom dizajniranja korisnikog interfejsa. S obzirom da je
poeljno koristiti deklarativan dizajn prilikom kreiranja sloenijeg korisnikog
interfejsa, u daljem tekstu bie opisan postupak kreiranja Hello world
aplikacijekorienjem XML tehnologije za dizajn korisnikog interfejsa. Jedna od
najveih prednosti deklarativnog dizajna jeste potpuna odvojenost dizajna
korisnikog interfejsa od aplikacione logike. To znai da male promene u kodu
nee uticati na dizajn aplikacije i obrnuto. Deklarisanje TextView pogleda pomou
XML-a obavlja se na sledei nain:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/zdravo"/>
Primer 5.6 XML prikaz TextView pogleda
Ovo predstavlja XML layout fajl, u kome je opisan dizajn korisnikog interfejsa.
Struktura ovog fajla je jednostavna. U pitanju je stablo sainjeno od XML
elemenata, gde svaki njegov vor u stvari predstavlja pogled koji se koristi u
aplikaciji (naziv View klase). U ovom primeru naveden je samo jedan View
element, a to je TextView. U okviru XML layout fajla mogue je koristiti bilo koju
klasu koja je izvedena (nasleena) iz klase View, to podrazumeva i korisnike
izvedene klase.
U primeru 5.1 korien je samo jedan element TextView sa svojih pet atributa.
Znaenje ovih atributa prikazano je u sledeoj tabeli:
Atribut
xmlns:android
android:id
Znaenje
Ovo predstavlja naziv XML imenskog prostora. Poto je vrednost ovog atributa
android, to znai da e se koristiti atributi deklarisani u okviru Android imenskog
prostora. vorovi najvieg hijerarhijskog poloaja u Android layout fajlu moraju da
poseduju ovaj atribut.
Ovaj atribut dodeljuje jedinstveni identifikator elementu TextView. Dodeljeni ID je
mogue koristiti za referenciranje ovog pogleda u izvornom kodu ili drugim XML
deklaracijama.
69
android:layout_width
android:layout_height
android:text
Ovaj atribut odreuje koliko e ovaj pogled da zauzme irine ekrana. U ovom sluaju,
ovo je jedini pogled koji se koristi, te je mogue zauzeti itav ekran, to oznaava
vrednost atributa "fill_parent".
Ovaj atribut se ponaa slino atributuandroid:layout_width. Razlika je u tome to se
atribut android:layout_height odnosi na dostupnu visinu ekrana.
Ovde se ubacuje eljeni tekst koji TextView treba da prikae. U ovom primeru, koristi
se resurs tipa string (umesto direktno unete vrednosti stringa). Ovaj string je
definisan u fajlu res/values/strings.xml . Prilikom ubacivanja stringova u aplikaciju
preporuuje se korienje resursa, a ne direktni unos vrednosti stringova. Ovo je
dobra praksa zato to omoguava lokalizaciju aplikacije, odnosno mogunost
viejezinosti, bez imena koda layout fajla.
70
odgovarajuim
XML
layout-ima
se
pristupa
pozivanjem
atributa
odgovarajueg
uvaju
okviru
fajla
5.2.Layouts
5.2.1.LinearLayout
LinearLayout predstavlja grupu pogleda koja prikazuje vie pogleda, horizontalno
71
72
73
5.2.2.RelativeLayout
RelativeLayoutpredstavlja grupu pogleda koja prikazuje vie View elemanata
74
layout_below,
75
5.2.3.TableLayout
TableLayoutje grupa pogleda koja prikazuje svojeView elemente u redovima i
kolonama.
76
78
5.2.4.GridView
GridViewpredstavlja grupu pogleda koja prikazuje elemente u dvodimenzionalnoj
79
80
Najpre
se
implementiraju
metode
roditeljske
klase
BaseAdapter.
Metoda
getCount() vraa ukupan broj elemenata ovog adaptera. Metoda getItem() vraa
81
5.2.5.TabLayout
Korienje kartica (tabova) prilikom izrade korisnikog interfejsa veoma je
popularno. Android platforma omoguava dva razliita pristupa prilikom izrade
ovakvog korisnikog interfejsa. Prvi pristup jeste jednostavna promena pogleda u
okviru iste aktivnosti prilikom izbora eljene kartice, a drugi pristup je promena
itave aktivnosti prilikom izbora kartice. U bilo kom sluaju, neophodno je
korienje klasa TabHostiTabWidget. TabHost predstavlja koreni vor layout-a. U
okviru njega nalaze se elementi TabWidget za prikaz dostupnih kartica i
FrameLayout za prikaz sadraja izabrane kartice.
82
kod
odnosio
se
U ovom primeru, ista ikona e se koristiti za svaku karticu. Slike ikona bi trebalo
ubaciti u folder res/drawable/. U istom folderu treba kreirati novi XML fajl i
nazvati ga ic_tab_artists.xml. Kod koji treba ubaciti u fajl je sledei:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Ikona koja se koristi za izabranu karticu -->
<item android:drawable="@drawable/ic_tab_artists_grey"
android:state_selected="true" />
<!-- Ikona koja se koristi za ostale kartice -->
<item android:drawable="@drawable/ic_tab_artists_white" />
</selector>
Primer 5.19 Fajl ic_tab_artists.xml
83
Ovaj layout e prikazati kartice i omoguiti navigaciju izmeu svih ranije kreiranih
aktivnosti. Element TabHost zahteva elemente TabWidget i FrameLayout unutar
sebe. U zavisnosti od eljenog rasporeda ovih elemenata, mogu se koristiti
razliiti layout-i za njihovo pozicioniranje. Na primer, za njihovo vertikalno
pozicioniranje moe se koristiti LinearLayout. Element FrameLayout trenutno je
prazan zato to se sadraj trenutne kartice uzima iz tekue aktivnosti koja se
odnosi na tu karticu. Treba primetiti elementi TabWidget i FrameLayout imaju svoje
identifikatore. To su tabs i tabcontent, respektivno. Ova imena moraju da se
koriste kada neko referencira ove elemente.
Sada treba napraviti jo jednu aktivnost. Moe se izabrati njen proizvoljan naziv,
ali je vano da se u Manifest fajlu definie da je u pitanju poetna aktivnost. Ova
aktivnost e se razlikovati od ostalih, ranije spominjanih aktivnosti, zato to ona
nasleuje klasu TabActivity. U nastavku je dat skraeni kod poetne aktivnosti
(nije prikazan paket kojem klasa pripada, kao ni uvezene klase):
public class HelloTabWidget extends TabActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // Uzimaju se resursi
TabHost tabHost = getTabHost(); // Aktivnost TabHost
TabHost.TabSpec spec; // TabSpec za svaku karticu
Intent intent; // Intent za svaku karticu
// Instanciranje Intent-a
intent = new Intent().setClass(this, ArtistsActivity.class);
// Instanciranje TabSpec-a za svaku karticu i dodavanje TabHost-u
spec = tabHost.newTabSpec("artists").setIndicator("Artists",
res.getDrawable(R.drawable.ic_tab_artists))
.setContent(intent);
tabHost.addTab(spec);
// Sledi isti postupak za ostale kartice
intent = new Intent().setClass(this, AlbumsActivity.class);
spec = tabHost.newTabSpec("albums").setIndicator("Albums",
res.getDrawable(R.drawable.ic_tab_albums))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, SongsActivity.class);
spec = tabHost.newTabSpec("songs").setIndicator("Songs",
res.getDrawable(R.drawable.ic_tab_songs))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(2);
}
}
Primer 5.21 Poetna aktivnost aplikacije sa karticama
84
5.2.6.ListView
ListViewpredstavlja
Prvo je potrebno napraviti layout. Fajl sa sledeim sadrajem treba snimiti kao fajl
/res/layout/list_item.xml. Navedeni layout definie izgled svakog elementa
pojedinano u listi.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>
Primer 5.22 Sadraj fajla res/layout/main.xml
Zatim treba kreirati poetnu aktivnost, koja umesto klase Activity nasleuje
klasu ListActivity. Priloenom kodu treba dodati naziv paketa u kome se nalazi i
uvezene klase, odnosno pakete.
public class HelloListView extends ListActivity {
@Override
85
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
}
static final String[] COUNTRIES = new String[] {
"Srbija", "Madjarska", "Bugarska", "Rumunija", "Italija"
};
}
Primer 5.23 Glavna TabView aktivnost
86
5.3.Meniji
Meniji su sastavni deo korisnikog interfejsa u veini aplikacija. Za prezentovanje
korisnikih akcija i drugih opcija u aktivnostima potrebno je koristiti
android.view.Menu klasu. Za sve tipove menija Android prua standardni XML
format za definisanje menija. Meniji se ne definiu u kodu aktivnosti ve se meniji
sa svim stavkama i podstavkama definiu u vidu XML datoteke u folderu
res/menu/ a zatim ukljuuju u aktivnost. Korienjem menija kao resursa
omogueno je razdvajanje menija od koda kao i kreiranje alternativnih menija za
razliite Android verzije, razliite veliine ekrana, itd. Da bi definisali meni
potrebno je u okviru projekta kreirati XML dokument u res/menu direktorijumu.
Obavezni delovi menija su:
<menu>
Ovaj element je koreni element sadri jedan ili vie
<item> i <group> elementa.
<item>
Kreira stavku menija. Ovaj element moe sadrati ugnjeden
<menu> element I na taj nain se formira struktura podmenija.
<group>
87
88
90
Ovaj meni je veoma koristan kada je u pitanju interfejs pomou kojeg se neka
opcija ukljuuje ili iskljuuje ili za grupu meusobno iskljuivih opcija.
93
95
Poziva
se
kada
se
kreira
Sve ove metode su jedini lanovi svojih interfejsa. Da bi se ove metode definisale
potrebno je implementirati ugnedene interfejse u okviru Aktivnosti ili ih
definisati kao anonimne klase. Nakon toga, alje se instanca implementiranog
interfejsa ka odgovarajuem View. SetListener (na primer poziva se
setOnClickListener() a njemu se prosleuje OnClickListener).
U primeru je prikazano kako se registruje on-click listener za Button view:
// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
}
};
protected void onCreate(Bundle savedValues) {
...
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
...
}
Ili se on-click listener moe implementirati u okviru Aktivnosti:
96
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="check it out"
android:onClick="onCheckboxClicked"/>
U okviru Aktivnosti potrebno je ubaciti implementaciju odgovarajue metode:
public void onCheckboxClicked(View v) {
98
99
100
101
5.5.3.Dialog notifikacije
Dijalog notifikacija se najee javlja u okviru trenutno aktivne aktivnosti. Dijalog
od aktivnosti preuzima interakciju sa korisnikom. Dijalozi su objanjeni u sekciji
5.6.
5.6.Dijalozi
Android omoguava prikazivanje interaktivnih dijaloga koji u sebi mogu da sadre
bilo koje elemente korisnikog interfejsa. Neke vrste dijaloga dolaze sa
predefinisanim izgledom i namenom, a mogue je definisati i spostveni layout za
dijalog ili ak napraviti sopstvenu klasu na osnovu klase Dialog koja predstavlja
zajedniku nadklasu za sve vrste dijaloga.
102
103
104
6.
Intents
Tri kljune komponente svake aplikacije aktivnosti, servisi i broadcast risiveri se
aktiviraju preko poruka intents. Razmena poruka preko intenta omoguava
kasno povezivanje tokom izvravanja izmeu izmeu komponenata u okviru iste
ili razliitih aplikacija. Objekat Intent je pasivna struktura podataka koja dri
apstraktan opis operacija koje treba da se izvre, ili u sluaju broadcast risivera,
opis neega to se dogodilo ili se objavljuje. Postoje odvojeni mehanizmi za
dopremanje intenta svakoj od tri navedene komponente:
Intent
objekat
se
alje
ka
Content.Activity()
ili
Activity.startActivityForResult() da bi se pokrenula aktivnost ili pozvala
postojea aktivnost da uradi neto novo (Takoe, Intent moe biti poslat ka
Activity.setResult() da bi se vratila informacija ka aktivnosti koja je pozvala
startActivityForResult().
Znaenje
CATEGORY_BROWS
ABLE
CATEGORY_GADGE
T
CATEGORY_HOME
107
6.1.Vrste Intent-a
Intente moemo odeliti u dve grupe:
Eksplicitne intente odreuju ciljnu komponentu po imenu. Korienje
imena komponente nije dobar nain za korienje komponente iz drugih
aplikacija pa se ovaj pristup koristi za interne poruke aplikacije (za
pokretanje podreenog servisa ili za pokretanje aktivnosti na istom nivou.)
Implicitni Intenti ne specificiraju Java klasu koju treba pozvati. Samo se definie
naziv akcije koju treba realizovati i opciono URI koji treba upotrebiti za akciju. Na
primer sledei intent govori Android OS-u da prikae veb stranicu. Iako je veb
brauzer registrovan za ovaj intent i druge komponente mogu biti prijavljene za
ovaj intent:
108
Action
Data (i URI i tip podataka)
Category
109
110
Ukoliko filter nema navedenu nijednu akciju ne postoji nita sa ime intent
moe da se podudara tj. svi intnti ne prolaze test. Nijedan intent ne prolazi
kroz filter.
Ukoliko Intent objekat ne precizira akciju automatski prolazi test sve dok
filter sadri barem jednu akciju
Category test
Element <intent-filter> prikazuje listu kategorija kao podelemente. Na primer:
<intent-filter . . . >
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
Konstante definisane u manifest fajlu se ne koriste ve se koriste puni nazivi
stringa. Na primer "android.intent.category.BROWSABLE" string je primer koji
korespondira sa CATEGORY_BROWSABLE konstantom definisanom ranije. Slino i
string "android.intent.action.EDIT" korespondira sa ACTION_EDIT konstantom.
Da bi intent proao test kategorije svaka kategorija u intent objektu mora se
poklapati sa kategorijom u filteru. Filter moe imati i dodatne kotegorije ali mora
sadrati sve koje su u intent-u. Iz tog razloga Intent objekat bez kategorija uvek
prolazi test bez obzira ta je u filteru. Meutim postoji jedan izuzetak. Android sve
implicitne intent-e koji su prosleeni ka startActivity() metodi tretira kao da
sadre barem jednu kategoriju i to "android.intent.category.DEFAULT"
(CATEGORY_DEFAULT konstantu). Iz tog razloga aktivnosti koje ele da primaju
implicitne intente moraju ukljuiti "android.intent.category.DEFAULT" u svoje
intent
filtere.
Filteri
sa
"android.intent.action.MAIN"
i
"android.intent.category.LAUNCHER" podeavanjima su izuzeci. Oni oznaavaju
aktivnosti koje poinju nove zadatke i koji se prikazuju na poetnom ekranu. One
mogu ukljuivati "android.intent.category.DEFAULT" u listi kategorija ali ne
moraju.)
Data test
Kao i action i category i data specifikacija je u vidu podelementa i moe se
pojavljivati vie puta. Na primer:
<intent-filter . . . >
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="audio/mpeg" android:scheme="http" . . . />
...
</intent-filter>
111
114
Dakle, kategorija DEFAULT je obavezna za sve filtere, osim za one koji sadre akciju
MAIN i kategoriju LAUNCHER.
116
3.
4.
5.
Akcija: android.intent.action.MAIN
Opis: Pokree aktivnost bez definisanih podataka.
Akcija: android.intent.action.MAIN
Kategorija: android.intent.category.LAUNCHER
Opis: Pokree aktivnost bez definisanih izabranih podataka. Ovo je intent
koji se koristi od strane pokretaa da popuni svoju glavnu listu. Sve
aktivnosti sa filterima koji sadre ovu akciju i kategoriju dodaju se na listu.
Akcija: android.intent.action.VIEW
Podaci: content://com.google.provider.NotePad/notes
Opis: Trai od aktivnosti da prikae sve beleke iz
content://com.google.provider.NotePad/notes. Korisnik moe da pregleda listu
i da dobije sve informacije o njenim stavkama.
Akcija: android.intent.action.PICK
Podaci: content://com.google.provider.NotePad/notes
Opis: Trai od aktivnosti da prikae listu beleaka iz
content://com.google.provider.NotePad/notes. Korisnik moe da izabere
beleku iz liste, a aktivnost e vratiti URI te stavke natrag aktivnosti koja je
startovala aktivnost NoteList.
Akcija: android.intent.action.GET_CONTENT
Tip podataka: vnd.android.cursor.item/vnd.google.note
Opis: Trai od aktivnosti da vrati jednu beleku iz podataka aplikacije
Belenica.
117
118
Ova
aktivnost
koristi
jedan
Editor naslova osim klasine kategorije DEFAULT podrava i dve ostale standardne
kategorije ALTERNATIVE i SELECTED_ALTERNATIVE. Ove kategorije identifikuju aktivnosti
koje mogu da budu predstavljene korisnicima u meniju sa opcijama na slian
nain kao to kategorija LAUNCHER identifikuje aktivnosti koje se predstavljaju
korisniku prilikom startovanja aplikacije. Treba obratiti panju da filter takoe
obezbeuje i eksplicitnu labelu (pomou android:label="@string/resolve_title"),
radi bolje kontrole ta korisnici mogu videti kao alternativne podatke podacima
koje trenutno pregledaju, kada im se prezentuje ova aktivnost (videti metode
PackageManager.queryIntentActivityOptions() i Menu.addIntentOptions()).
Ovde se koristi sledei intent:
1.
Akcija: com.android.notepad.action.EDIT_TITLE
Podaci: content://com.google.provider.NotePad/notes/ID
Opis: Trai od aktivnosti da prikae naslov beleke sa odreenim ID-om.
Omoguava korisniku da izmeni naslov.
6.2.Intents primeri
Pozivanje dve aktivnosti pomou intenta
public class IntentA extends Activity implements OnClickListener {
/** Called when the activity is first created. */
119
<uses-permission
7.2.Kreiranje servisa
Kreiranje servisa i njegov rad e biti demostrirano na primeru servisa koji reaguje
na pomeranje korisnika, tj. promenu njegovih koordinata (latitude i longitude).
Prvo emo napraviti obinu android aplikaciju sa jednom aktivnou koju emo
nazvati ServisKontroler. Ova aktivnost e se koristiti da pokrene/ugasi na servis,
pa emo u skladu sa time aktivnosti dodati dva dugmeta u lejaut fajl a zatim
pokupiti reference na njih u kodu.
Lejaut aktivnosti (main.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
124
126
se
poziva
po
// 1 - ID notifikacije
}
Prvo kreiramo objekat klase Criteria. Poto jedan telefon moe imati vie naina
da odredi svoju lokaciju (pomou mobilne mree, pomou GPS-a, pomou
interneta itd.), koristimo objekte ove klase da specificiramo kakav mehanizam za
odreivanje lokacije bi nam najvie odgovarao. U ovom sluaju specificiramo da
nam treba mehanizam sa malim utrokom baterije, a bez ikakvih posebnih
zahteva po pitanju preciznosti.
Poto smo to podesili u Criteria objektu, predajemo objekat LocationManager-ovoj
metodi getBestProvider a kao rezultat dobijamo ime mehanizma koji najbolje
odgovara onome to smo traili.
127
new
obavestenje.flags |= Notification.FLAG_AUTO_CANCEL;
Intent toLaunch = new Intent(getApplicationContext(), ServisKontroler.class);
toLaunch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent intentBack = PendingIntent.getActivity(getApplicationContext(),
0, toLaunch, 0);
// Saljemo notifikaciju sa vrednostima latitude i longitude
obavestenje.setLatestEventInfo(getApplicationContext(), "GPS
"Lokacija: " +
location.getLatitude() + "," + location.getLongitude(), intentBack);
pracenje",
notifikacije.notify(1, obavestenje);
}
U ovoj metodi ponavljamo proceduru sa slanjem notifikacije, jedina je razlika to
sada u tekst naih notifikacija stavljamo vrednosti latitude i longitude koje
dobijamo kao parametar metode onLocationChanged u okviru objekta Location.
Nakon korienja servisa potrebno je jo oistiti servis nakon korienja. U
nastavku sledi primer kako se to radi:
@Override
public void onDestroy() {
// odjavljujemo se od prijema obavestenja o promeni lokacije
if (lokacija != null) {
lokacija.removeUpdates(this);
lokacija = null;
}
// saljemo notifikaciju da je servis ugasen
Notification obavestenje = new
Notification(android.R.drawable.stat_notify_more,
"GPS pracenje", System.currentTimeMillis());
128
obavestenje.flags |= Notification.FLAG_AUTO_CANCEL;
Intent toLaunch = new Intent(getApplicationContext(),
ServisKontroler.class);
PendingIntent intentBack =
PendingIntent.getActivity(getApplicationContext(), 0, toLaunch, 0);
obavestenje.setLatestEventInfo(getApplicationContext(),
"GPS pracenje", "Pracenje je stopirano!", intentBack);
notifikacije.notify(1, obavestenje);
super.onDestroy();
}
Na kraju odjavljujemo servis od primanja obavetenja o promeni lokacije i aljemo
notifikaciju o tome.
8. Skladitenje podataka
Android nudi nekoliko opcija za skladitenje podataka. Koji nain e se koristiti
zavisi od specifinih potreba, da li su podaci dostupni drugim aplikacijama ili su
privatni, kao i koliko prostora zauzimaju ti podaci.
Andoird nudi sledee opcije za skladitenje podataka:
8.1.Zajednika podeavanja
130
U nastavku sledi primer koda kako se uvaju podaci na ovaj nain. Prikazan je
primer kako se uva vrednost koja je uneta prilikom izraunavanja kod
kalkulatora:
131
Primer:
// Get the app's shared preferences
SharedPreferences app_preferences =
PreferenceManager.getDefaultSharedPreferences(this);
// Get the value for the run counter
int counter = app_preferences.getInt("counter", 0);
// Update the TextView
TextView text = (TextView) findViewById(R.id.text);
text.setText("This app has been started " + counter + " times.");
// Increment the counter
SharedPreferences.Editor editor = app_preferences.edit();
editor.putInt("counter", ++counter);
editor.commit(); // Very important
132
8.2.Interne memorije
Interne memorije omoguavaju da se skladite podaci direktno na memoriju
ureaja. Podrazumevano je da podaci koji se koriste na memoriji ureaju su
privatni i ostale aplikacije tim podacima ne mogu pristupiti. Kada se apliakcija
ukloni sa ureaja, nestaju i podaci.
Da bi upisali podatke na internoj memoriji koriste se sledee metode:
openFileOutput()
write()
close()
133
134
136
137
ivotnog
ciklusa
Cursora,
pozivajui
metodu
139
140
9. Internet
Android ureaji obino imaju vie naina za uspostavljanje konekcije sa
internetom, pa se i mnoge aplikacije oslanjaju na tu mogunost ili su
kompletno izgraene oko nje. Programerima Android aplikacija se na
raspolaganju nalazi nekoliko alata:
1. Klasnine Java biblioteke za rad sa soketima i streamovima
2. Apache HTTP klijent
3. HttpURLConnection
Rad sa soketima se u Androidu ni najmanje ne razlikuje od rada u
klasinom Java okruenju pa nee detaljnije biti opisan ovde. Appache
HTTP biblioteka je dosta obimna i kvalitetna i preporuuje se za upotrebu
na starijim verzijama Androida. HttpURLConnection je jednostavniji za
upotrebu i kontinualno se radi na njegovom poboljavanju pa je preporuka
da se koristi u novijim verzijama.
Da bi vaa aplikacija mogla da koristi internet, potrebno je prvo u
manifestu dodati:
<uses-permission android:name="android.permission.INTERNET"/>
9.1.HttpURLConnection
Osnovni objekat za komunikaciju je ovde HttpURLConnection objekat. Da
bi se kreirao ovaj objekat, prvo kreiramo objekat klase URL koji e
predstavljati adresu koju elimo da otvorimo, a zatim nad njime pozivamo
metodu openConnection.
URL url = new URL("http://www.fon.rs");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
Poto
smo
dobavili
konfigurisanje:
HttpURLConnection
objekat,
prelazimo
na
con.setConnectTimeout(1500);
con.setReadTimeout(1000);
con.setRequestMethod("GET");
con.setDoInput(true);
BufferedReader(new
141
BufferedReader(new
reader.close();
TextView tv = new TextView(this);
tv.setText(rezultat);
setContentView(tv);
}
catch (Exception e)
{
}
finally {
if(con != null)
con.disconnect();
}
Primer slanja podataka sa HTML forme:
public static String excutePost(String targetURL, String urlParameters)
{
URL url;
142
143
10.1.
Lokacijski servisi
lokaciju
Kretanje korisnika
Preciznost lokacije
145
10.2.
148
149
I uneti na lokaciji:
http://code.google.com/android/maps-api-signup.html
Ovime ete konano dobiti API key koji moete da ubacite u xml layoutu:
android:apiKey="dobijeni_kljuc"
151
BitmapFactory.decodeResource(getResources(),
152
153