Szakdolgozat Miskolci Egyetem Személyi edző alkalmazás készítése Készítette: Gyökeres Vilmos 4. évfolyam, Programtervező informatikus szak Témavezető: Krizsán Zoltán Miskolc, 2013
Miskolci Egyetem Gépészmérnöki és Informatikai Kar Alkalmazott Matematikai Tanszék Szám: Szakdolgozat Feladat Gyökeres Vilmos (N6ISMW) programtervező informatikus jelölt részére. A szakdolgozat tárgyköre: Androidos alkalmazásfejlesztés A szakdolgozat címe: Személyi edző alkalmazás készítése A feladat részletezése: 1. Vizsgáljon meg több hasonló Adnroid alkalmazást, majd készítsen egy prioritásos funkció listát! 2. Tervezze meg az alkalmazást! Definiálja a szerver és az Android alkalmazás közötti kommunikáció módját! 3. Készítse el az alkalmazást! 4. A fejlesztést iteratív módon több lépcsőben végezze el, az új funkciók beillesztését a létező részrendszer minimális átszervezésével oldja meg! Az Android rendszeren futó alkalmazás feladata, hogy a telefon beépített GPS vevőjét kihasználva, pontos adatokat adjon a sebességéről, átlagos sebességéről, megtett útról stb. A jelenlegi helyzet megjelenítése grafikus módon, a Google Maps API-ját használva történik. Az így kinyert adatokat a program SQLite adatbázisban tárolja, hogy azok későbbi lekérdezésekhez elérhetőek legyenek! Témavezető: Krizsán Zoltán egyetemi tanársegéd A feladat kiadásának ideje: 2012 szeptember 20.................................. szakfelelős
1. A szakdolgozat feladat módosítása szükséges (módosítás külön lapon) nem szükséges................................................. dátum témavezető(k) 2. A feladat kidolgozását ellenőriztem: témavezető (dátum, aláírás): konzulens (dátum, aláírás):................................................................................. 3. A szakdolgozat beadható:................................................. dátum témavezető(k) 4. A szakdolgozat................... szövegoldalt................... program protokollt (listát, felhasználói leírást)................... elektronikus adathordozót (részletezve)...................................... egyéb mellékletet (részletezve)................... tartalmaz.................................................. dátum témavezető(k) 5. bocsátható A szakdolgozat bírálatra nem bocsátható A bíráló neve:............................................................................................. dátum szakfelelős 6. A szakdolgozat osztályzata a témavezető javaslata:................ a bíráló javaslata:................ a szakdolgozat végleges eredménye:................ Miskolc,......................................................... a Záróvizsga Bizottság Elnöke
Tartalomjegyzék 1. Bevezetés 1 2. Téma elméleti kifejtése 3 2.1. Az Android fejlődése............................ 3 2.1.1. Android Cupcake.......................... 3 2.1.2. Android Donut........................... 4 2.1.3. Android Eclair........................... 4 2.1.4. Android Froyo............................ 4 2.1.5. Android Eclair........................... 5 2.1.6. Android Honeycomb........................ 5 2.1.7. Android Ice Cream Sandwich................... 5 2.1.8. Az Android jelene.......................... 6 2.2. Elérhető programok bemutatása...................... 6 2.2.1. Endomondo............................. 6 2.2.2. SportyPal.............................. 7 2.2.3. adidas micoach........................... 7 2.2.4. Nike+ Running........................... 8 2.2.5. Runkeeper.............................. 8 2.3. Az Androidról részletesen......................... 9 2.3.1. A telepíthető Andridos alkalmazások............... 10 2.3.2. Android alkalmazások felépítése fejlesztői szempontból..... 11 2.4. Funkciók listája............................... 12 3. Fejlesztői dokumentáció 14 3.1. Az Android fejlesztőkörnyezet....................... 14 3.1.1. A telepítés lépései.......................... 14 3.2. Az Androidos alkalmazások felépítése................... 15 3.2.1. Android alkalmazás komponensei................. 16 3.2.2. Manifest XML állomány...................... 17 3.2.3. Erőforrás állományok........................ 17 3.3. Az Activity és életciklusa.......................... 18 3.4. Több Activity kezelése egy alkalmazásban................ 20 3.4.1. Activity indítása.......................... 21 3.4.2. Explicit Intent............................ 22 3.4.3. Implicit Intent............................ 22 3.4.4. Visszatérési értékkel rendelkező Activity............. 22 3.5. Felhasználói felület............................. 23 3.6. User Interface elemek............................ 26 i
3.6.1. Felugró ablakok........................... 26 3.7. Helyzetmeghatározás............................ 27 3.7.1. Wifi alapú helymeghatározás.................... 28 3.7.2. Cellaalapú helymeghatározás.................... 28 3.7.3. GPS alapú helymeghatározás................... 29 3.7.4. A gyakorlati megvalósítás..................... 29 3.8. Google Maps használata.......................... 30 3.8.1. Rajzolás a térképre......................... 31 3.9. SQLite adatbázismotor........................... 32 3.9.1. Az adatbázis elérése........................ 32 3.9.2. A korábbi edzések adatainak eltárolása az adatbázisban..... 33 3.10. Beállítások mentése és kiolvasása..................... 34 3.11. A kész program szemléltetése....................... 36 4. Összefoglalás 42 4.0.1. English Summary.......................... 43 Irodalomjegyzék 44 Adathordozó használati útmutató 46 ii
1. fejezet Bevezetés Mi is az az okostelefon? A Wikipédia szerint, nincs olyan egységes megfogalmazás, hogy mitől válik egy telefon okostelefonná. De viszonylag elfogadott az a nézet miszerint: "Az okostelefon az a mobil, aminek teljes értékű operációs rendszere szabványosított interface-eket és platformot nyújt az alkalmazásfejlesztők számára." Tehát az okostelefon az egy olyan integrált miniatűr számítógép, ami képes telefonként is működni. A legtöbb ilyen telefonon egy jól meghatározható operációs rendszer fut. Ilyenek például az Apple IOS-e, a Microsoft Windos Phone-ja vagy a Google Android-ja. A Google az Android rendszerrel 2008-ban alapjaiban változtatta meg, amit akkor a mobilkommunikációról gondoltunk. Korábban az okostelefonok egyet jelentettek a bonyolult, átláthatatlan és kezelhetetlen menürendszerekkel. Persze vitathatatlan, hogy a legelsők között az Apple jelent meg az iphone-nal, de azt is hozzá kell tenni, hogy míg az első ilyen készülék 2007 júniusában jelent meg, de az első bétás SDK verzió csak 2008 márciusában vált elérhetővé a fejlesztők számára. Addig lényegében csak egy érintőkijelzős telefonként lehetett használni. Míg az Adroidnál az SDK bár már 2007 novemberében megjelent, de az első ilyen operációs rendszerrel felszerelt telefonra, a G1-re egészen 2008 szeptemberéig kellett várni, viszont, az rögtön az 1.5-ös Android operációs rendszerrel érkezett. De hogy mi is az az Android? Az Androidot az Open Handset Alliance hozta létre. Ez egy multinacionális szövetség, olyan tagokkal mint a Google, Samsung vagy a Vodafone. Főleg mobiltelefonokra lett létrehozva, de a fejlődést követve, az újabb verziók már táblagépeken is nagyszerűen működnek. Az operációs rendszer megalkotásánál a fő szempontok között volt, hogy minél több gyártó készülékén fusson, kihasználja az internet adta lehetőségeket valamint hogy egy könnyen kezelhető rendszert hozzanak létre. Persze ennek ára is van. Csak olyan készülékek használhatnak Androidot, ami rendelkezik GPS-szel, vezeték nélküli internettel, kamerával, gyors adatkapcsolattal, és négy fizikai billentyűvel. 1
Az Android korszak elején ezek a feltételek leginkább csak a csúcskategóriás telefonokban teljesültek, de az idő múltával az olcsóbb kategóriában is megjelentek. Ráadásul a feltételek is módosultak: már olyan készüléket is ki lehet adni ezzel az operációs rendszerrel szerelve, ami nem rendelkezik fizikai gombokkal. Manapság már a belépő kategóriában is találhatók a Google operációs rendszerével szerelt telefonok. A program megírásának célja Szakdolgozatomban az Android-alapú szoftverfejlesztés jellegzetességeinek a bemutatására fogok törekedni. Ennek a széleskörűen alkalmazható platformnak a segítségével szeretnék létrehozni egy működő, a futók számára is hasznos alkalmazást. Reményeim szerint a program tartalmazni fog egy Google Maps térképet is használó képernyőt, aminek a segítségével megjeleníthető lesz a térkép, azon pedig a megtett út. A program ezen része mindenképpen tartalmazni fog egy külön részt a képernyőn ami az aktuális legfontosabb információkat fogja mutatni. Az elkészült program a futás során keletkező adatokat egy SQLite adatbázisba fogja menteni, amit aztán a későbbiekben meg is fog tudni jeleníteni. Ehhez a funkcióhoz egy külön menüpontot tervezek. A sokféle felbontás miatt az is fontos, hogy a felhasználó felület felbontásfüggetlen legyen. Ennek a feladatnak a megoldására majd egy külön fejezetet szánok. Fontos még egy ilyen programnál az is, hogy meg tudjuk adni a fizikai adatainkat, mint például a magasság vagy a testsúly. Ez azért fontos, mert különböző testi adottságokkal rendelkező embereknél eltérhetnek az edzés hatásai. Ezeket az adatokat mindenképp el kell menteni, különben minden indításkor újra és újra meg kell adni azokat. Amennyiben időm és lehetőségem lesz rá, szeretnék írni egy szerver oldali alkalmazást is, ahonnan az edzéseket a program le, az edzés adatait pedig fel tudja tölteni. 2
2. fejezet Téma elméleti kifejtése 2.1. Az Android fejlődése Az első kiadásra ugyan 2008 szeptemberéig kellett várni, de azóta a Google szüntelenül ontja az újabb és újabb verziókat. Ez egyben előny és hátrány is. Előny, hogy így az olcsóbb kategóriában induló telefonok is megfelelő sebességű operációs rendszerrel lehetnek felszerelve. Hátránya azonban a fregmentáltság. Hiába egységes a platform, ahogy az alábbi ábrán is jól látható, a jelenlegi elérhető 7 féle verzió és számtalan képernyőfelbontás miatt nehéz az egységes felhasználói felület megteremtése. 2.1. ábra. Az Android rendszer fregmentációja 2013 márciusában 2.1.1. Android Cupcake Az első nyilvános kiadás a T-mobile G1-el megjelent 1.5-ös verzió volt, melyet Cupcake néven ismert meg a nagyvilág. Újdonság volt a korábbi kiadásokkal szemben, hogy már lehetett videót is felvenni, valamint azokat közvetlenül Youtube-ra feltölteni. A szoftveres billentyűzet immár tartalmazott szókiegészítő/javító funkciót. Előre lépés történt a bluetooth eszközökkel kapcsolatban is az új kiadás már támogatta a A2DP-t, ami a sztereó Bluetooth headsetekhez volt elengedhetetlen, valamint az automatikus kapcsolódást. Megjelentek még új animációk és widgetek is és már a böngészőben is lehetett használni a copy/paste funkciót. 3
2.1. Az Android fejlődése 2.1.2. Android Donut 2.2. ábra. T-mobile G1 - az első Androidos telefon A következő, a Donut verzió inkább a hibajavításokra helyezte a hangsúlyt. Továbbfejlesztették az Android Market-et, a galériát, a hangalapú keresést és a keresőt. De kerültek be új technológiák is a frissítésbe, mint a CDMA/EVDO, 802.1x VPN, gesztusok és szövegfelolvasó-motor. 2.1.3. Android Eclair 2009-ben érkezett el a következő lépcsőfokához az Android rendszer, amikor is megjelent a 2.0- ás változat, más néven Eclair. Ebbe ismét több fontos illetve kevésbé fontos újítás, és hibajavítás került. Elsősorban javult az egész operációs rendszer sebessége. Ahogy egyre több és több Androiddal szerelt készülék jelent meg, egyre több felbontással és képaránnyal, fontossá vált hogy mindenféle kombinációban megfelelő elrendezésben jelenjen meg a tartalom a képernyőn, így ebbe a verzióba sokféle variáció bekerült. A kezelőfelület is átalakításra került, aminek hatására a felhasználók nagyobb szabadságot kaptak mobiltelefonuk testreszabására. Bekerült még egy új böngésző is html 5 támogatással és egy új névjegyzék is. Frissítésre került a Google maps és a virtuális billentyűzet. Beépítésre került még több, várt funkció is, mint például a többujjas technológia, a fényképezőgépnél a vaku és a digitális zoom vagy az élő háttérképek. 2.1.4. Android Froyo A 2.2-es kiadásban ismét a javításoké volt a főszerep. Ismét gyorsítottak a rendszer sebességén. Ezen belül gyorsabb lett a Java sebessége, a különböző nyelvű billentyűzetek közötti átváltás. De több mára fontossá vált funkció is akkor jelent meg először. Ilyen a Wifi hotspot lehetősége, amelynek a segítségével a telefonból, mobilinternet segítségével vezeték nélküli routert hozhatunk létre. Ez volt az első olyan kiadás, aminek segítségével teljesen kikapcsolhattuk a mobilinternetet. Immáron böngésző segítségével is tölthettünk fel fájlokat. Fontos funkció volt még, hogy lehetőségünk lett az akkor még Android Market névre hallgató azóta Google Play-re átkeresztelt szoftverboltból 4
2.1. Az Android fejlődése letöltött alkalmazásainkat áttelepíteni a memóriakártyára. Ez akkor igen fontos bejelentés volt, mivel az akkori telefonok meglehetősen kicsi belső memóriával rendelkeztek. A 2010 januárjában megjelent az Android zászlóshajójának kinevezett, csúcskategóriás Nexus One is 512 mb memóriával rendelkezett, de abból csak 218 Mb volt felhasználható a programok számára. 2.1.5. Android Eclair A következő kiadás 2010. december 6.-án érkezett az első szerencsés felhasználókhoz. Ez a kiadás is főleg szintén a hibajavításról és optimalizálásról szólt, de itt is voltak többé-kevésbé fontos újítások és funkciók. A felhasználói felület, ha csak minimális módon, de frissítésen esett át. Javítottak a virtuális billentyűzeten, a copy/paste pedig már egy érintéssel is működött. Az energiagazdálkodás is javításra került, így egy feltöltéssel már hosszabb ideig élvezhettük az Android előnyeit. Optimalizálásra került a rendszerkód is, és új grafikus és audió driver került beépítésre. Ekkor kerültek be olyan funkciók is, amik azóta elengedhetetlenné váltak. Ilyen volt a NFC (Near-field Communication másnéven rövid hatótávú kommunikációs szabvány) és a VOIP internet hívás. A fájlrendszer is lecserélésre került. Azóta a YAFFS helyett a Linux rendszerek alól jól ismert ext4 került. A programozók szempontjából is sok fontos változás történt ebben a verzióban. Az alkalmazások már szabadon használhatták a kamerát, új szenzorok támogatása is bekerült. Például giroszkóp, gravitáció és barométer. 2.1.6. Android Honeycomb Időközben megjelent egy külön a táblagépkre optimalizált változat, Honeycomb néven. Ez a rendszer nem szervesen kapcsolódik a telefonos Androidokhoz, úgyhogy ennek a verziónak a bemutatásától eltekintek. 2.1.7. Android Ice Cream Sandwich A tabletes és a telefonos vonal az Android 4.0-ban ért össze. Ez a verzió az eddigi egyik legnagyobb frissítése a Google operációs rendszerének történetében. A legfontosabb, a majdnem minden új verzióban jelen levő, sebességbeli- és teljesítménybeli optimalizálások. A fontosabb újítások közé tartoznak a felhasználói felület hardveres gyorsítása, a fizikai gombok megszűnése, az átméretezhető minialkalmazások, a mappák létrehozásának lehetősége, a közösségi funkciók integrálása és a képernyő feloldása arcfelismerés alapon. A galéria kapott egy egyszerűbb képszerkesztőt. Immár az ios-hez hasonlóan készíthetünk pillanatképet az aktuális képernyőről. Ebben a verzióban jelent meg a valós idejű speech to text, melynek segítségével hanggal is írhatunk sms-t. A fejlődő kamerákat kihasználva már lehetőségünk van 1080p, azaz fullhd videók, vagy éppen panorámafotók készítésére. Természetesen az Android jóval többet tud mint amit itt felsoroltam, de mégis látható, hogy egy elég robusztus, minden igény kielégítő operációs rendszerről van szó. 5
2.2. Elérhető programok bemutatása 2.1.8. Az Android jelene Jelen pillanatban az Android 4.0.3 a legfrisebb kiadás amelyben a legfontosabb újítások, a már szokásos optimalizálás mellett a Project Butter és a Google Now. A Project Butter a felhasználói felület folyamatosságra van hatással úgy, hogy a kirajzolást mindig ott kezdi ahol a felhasználó megérintette a kijelzőt. A Google Now, pedig egy az Apple Siri-ére hasonlító hang alapú asszisztens program. Jelenleg az Android operációs rendszer, ahogy az ábra is mutatja, piacvezető szerepet tölt be a mobil operációs rendszerek között. 2.3. ábra. Mobil eszközök eloszlása 2012 végén 2.2. Elérhető programok bemutatása A Google Play-en fellelhető néhány programot is átnéztem, hogy azoknak az erősségeit, illetve gyengeségeit kijegyzeteljem, és hogy a programot ezen irányelvek alapján kezdjem el fejleszteni. 2.2.1. Endomondo A felhasználói felülete, egyszerű, letisztult, kellemes zöld színárnyalattal rendelkezik. Funkciói sokrétűek. Többféle sporttevékenységet is támogat, pl futás, biciklizés stb. Alapértelmezetten az időt, a távolságot és az átlagos sebességet mutatja. Térképen nyomon tudjuk követni a saját helyzetünket, valamint jelzi azt is, hogy korábban merre jártunk. Persze ezek kijelzése tetszés szerint változtatható. Az edzés végeztével meg tudjuk nézni az összegzés képernyőt, ami mutatja az utunkat térképen, hogy mikor kezdtük el, az időtartamot, a távolságot, az átlagos sebességet, a pihenéssel töltött időt, az elégetett kalóriák számát, végül pedig a folyadékveszteséget. Ahogy egy modern programtól elvárható, támogatja a közösségi funkciókat is. A felhasználóknak lehetőségük van hozzászólni -így támogatást nyújtani- a már teljesített edzéseinkhez. Lehetőségünk van többféle edzésprogramból kiválasztani a nekünk megfelelőt. Természetesen, ha ezzel nem szeretnénk vesződni, választhatjuk az egyszerű edzésprogramot is. Beállíthatjuk a képességeinkhez illő célt, készíthetünk útvonaltervet, 6
2.2. Elérhető programok bemutatása legyőzhetjük egy ismerősünk szintidejét, vagy akár a saját magunkét is. Sokféle pulzusmérő eszközt támogat, ilyen például Polar WearlinkŽ-et vagy a Zephyr szívritmus érzékelőjét. Az Endomondo-ból létezik ingyenes és fizetős verzió is. A fizetős változat annyival tud többet az ingyenestől, hogy tud grafikonokat rajzolni, a korábbi időnk ellen is versenyezhetünk, és beállíthatunk többféle célt, mint az ingyenes változatban. 2.2.2. SportyPal Csak ingyenes változatban létezik, viszont alkalmazáson belüli vásárlással bővíthetjük az elérhető funkciók körét. Az alap verzióban, a szokásosnak mondható lehetőségek érhetőek el, mint például idő, sebesség, távolság mérése. Ezeken kívül figyelemmel kísérhetjük, az adott edzés folyamán elégetett kalória mennyiségét vagy ha megfelelő eszközzel párosítva van a telefonunk, az aktuális pulzust is. Viszont itt nincs automatikus szünet, ha pihenni szeretnénk manuálisan kell ezt az opciót kiválasztani. Természetesen ez a program is támogat többféle sporttevékenységet, viszont itt valamiért a gépkocsi is elérhető opció. Ilyen módon viszont funkcionalitásaiban egy egyszerűbb gps programmal sem veszi fel a versenyt. Ez az alkalmazás is a Endomondo-hoz hasonlóan a Google térképszolgáltatását használja, hogy megjelenítse az aktuális helyzetünket. Bluetooth-on keresztül az alábbi pulzusmérőket támogatja: ANT+, Zephyr HxM, Polar WearLink+, viszont ez a funkció csak a fizetős változatban érhető el. Szintén a fizetős változat része az interneten megszerkeszthető, és a telefonnal szinkronizálható edzésprogram. Felhasználói felülete nem éppen a mai elvárásoknak megfelelő. A Endomondo ilyen szempontból sokkal fejlettebb. 2.2.3. adidas micoach A korábbi programokhoz hasonló, viszont funkcionalitásában kissé lemarad azoktól. Itt is a Google Maps-on követhetjük a helyzetünket, mind szatelit, mind utca nézetben. Megadhatjuk a céljainkat is viszont ellentétben a korábbi programokkal itt nem csak helymozgást igénylő sportokat állíthatunk be, hanem talajgyakorlatokat is. Valamint különlegessége még az is, hogy widgetként ki lehet rakni a telefon kezdőképernyőjére. Ilyen módban mutatja az összesen megtett kilométerek, az elégetett kalóriák, és az edzéssel töltött órák számát. A sporttevékenység befejezése után itt is kapunk egy összefoglaló képernyőt, grafikonnal, térképpel, valamint itt egy rövid jegyzetet is hozzáfűzhetünk az aznapi teljesítményünkhöz. A program teljesen ingyenes. Előnye még a többi programhoz képest, hogy ez a magasságot is méri, így az emelkedő nem egyenrangú a sík tereppel. Előre elkészített edzéstervekből is lehet a honlapjukon választani, majd azt elküldeni a telefonra. Könnyen hozzáférhetünk a zenéinkhez is, így nem kell a futást szüneteltetni, ha éppen át akarunk ugrani egy számot a lejátszás listánkban. Futás közben a cipő elhasználtságát is méri, így idejében tud jelezni, hogy megvegyük az új adidas futócipőt. 7
2.3. Az Androidról részletesen 2.2.4. Nike+ Running Ennek a programnak is hasonló a felépítése mint a legtöbb futóprogramnak. A futás közbeni képernyő nagyon egyszerű és letisztult. Nagy számokkal mindössze a megtett utat, a sebességet és az időt láthatjuk. Azt is nyomon követhetjük, hogy mennyi hiányzik még a napi megadott távolsághoz. Mutatja még a GPS jel erősségét és egy kis zeneléptető panelt. Itt megadhatunk egy úgynevezett powersong-ot is, aminek segítségével extra motivációhoz juthatunk. Szünethez pause módba állíthatjuk, illetve másodlagos képernyőn megnézhetjük a helyzetünket a Google Maps által szolgáltatott térképen. Utólag is visszanézhetjük a futásról elmentett adatokat. Itt például megjelölhetjük hogy hogy éreztük magunkat futás közben, illetve, hogy milyen szintkülönbséggel futottunk. Ebben a menüpontban grafikus úton is nyomon követhetjük az általunk lefutott utakról elmentett információkat. Egyedi ebben az alkalmazásban, hogy a rekordjainkat is nyilván tartja, így mindig tudjuk, hogy mi az, amit túl kell teljesítenünk. Hasznos funkciója a programnak, hogy a futásról készült útvonalat különböző színnel jelöli annak függvényében hogy, milyen sebességgel futottunk az adott szakaszon. A manapság oly divatos közösségi funkciók itt is beépítésre kerültek. Például egy gombnyomással megoszthatjuk az általunk lefutott útat Facebookon illetve Twitteren. A futásunk adatait fel is tölthetjük nikeplus.com oldalára, ahol nagyobb méretben is áttanulmányozhatjuk a korábbi eredményeinket, illetve megadhatunk új célokat, vagy éppen magunknak megfelelő futóútvonalat is kereshetünk. 2.2.5. Runkeeper Már a Google Play letöltőoldalán is büszkén hirdetik, hogy már több mint 10 millió ember használja az ő programunkat. A futók körében ez az egyik legnépszerűbb program. A mai divatnak megfelelően többféle sportágban is betáplálhatjuk a teljesített kilométereinket. Van például, futás, biciklizés, túrázás és így tovább. A szokásos funkciókkal ez az alkalmazás is rendelkezik: nyomon követhetjük helyzetünket, sebességünket és a megtett időt. Tartalmaz még audió instrukciókat is, hogy anélkül tudjuk hogy hol járunk, hogy rá kellene pillantanunk a készülékükre. Az adidas programjához hasonlóan, itt is kapunk egy kezelőpanelt a zenelejátszónkhoz. Támogat még különféle szívritmusszenzorokat is, hogy tudjuk, hogy a pulzusunk a megfelelő tartományon belül van-e. Ennek az alkalmazásnak különlegessége, hogy az utunk során képeket tudunk vele csinálni, és ezt meg tudjuk osztani a barátainkkal, bár véleményem szerint, ez nem éppen egy futó programba való. A program ingyenes, de lehetőségünk van feliratkozni az úgynevezett RunKeeper Elite szolgáltatásra. Ennek segítségével valós időben követhetjük barátaink helyzetét az edzésük során. Természetesen tárolja az általunk elért rekordokat, és értesít is arról minket, ha megdöntöttük egy korábbi csúcsunkat. Összegezve: Kinézet szempontjából szerintem az Endomondo letisztult és a Nike+ Running professzionalista gui-ja messze a mezőny többi tagja felett áll. Funkcionalitás szerint pedig szerintem szintén az Endomondo a legkiemelkedőbb, de a Runkeepert és a SportyPal-t is nyugodtan tudnám ajánlani. 8
2.3. Az Androidról részletesen 2.3. Az Androidról részletesen Az Android egy Linux-kernel-alapú operációs rendszer. A következőkben szeretném bemutatnia platform felépítését, szerkezetét és az egyes rétegek szerepét. A következő ábra az Android platform szerkezetét mutatja be. 2.4. ábra. Az Android architektúrája Összességében elmondható a rendszerről, hogy logikus és áttekinthető. A legalsó rétegben a Linux-kernel található, amelynek az a feladata, hogy kezelje a memóriát, ütemezze a folyamatokat valamint a teljesítménykezelés. Ez az utóbbi azért fontos, mivel az Android operációs rendszer főleg mobiltelefonokban található meg, és ezen a területen nagyon fontos a megfelelő energiagazdálkodás. Szintén ezen a szinten találhatók meg a hardvert kezelő eszközmeghajtók programjai. Ezeket a programokat általában azok a gyártók készítik el, akik szeretnék ezt az operációs rendszert futtatni a készülékeiken. A kernel fölött a különféle programkönyvtárak, vagy szolgáltatások találhatók. Ilyenek például a libc, SSL(titkosítás), Webkit, vagy az általam is használt SQLiteadatbázismotor. Ezek a könyvtárak jellemzően C vagy C++ nyelven íródtak. Részben ezekre a könyvtárakra épül az Android futtatókörnyezet, amelynek fő eleme a Dalvik virtuális gép. A virtuális gép feladata az Androidra írt Java alkalmazások számítógépen történő futtatása, ahogy azt már a PC-s Java alkalmazások futtatásánál már megszokhattuk. A Dalvik egy jelentősen újratervezett, átdolgozott és optimalizált verziója a PC-s JavaVirtual Machine-nek, melynek a főbb jellemzői a következők: Nem kompatibilis a korábbi Sun virtuális géppel Megújult utasításkészlettel dolgozik 9
2.3. Az Androidról részletesen A Java programok fordítás után a számítógépen megszokottal ellentétben nem class-állományokba kerülnek fordítás után, hanem egy nagyobb Dalvik Executable formátumba,.dex kiterjesztéssel és általában a mérete is kisebb szemben a.class állományoknál, mivel több Java fájlban megtalálható konstansokat csak egyszer fordítja be a fordító A Java csak, mint nyelv jelenik meg A Dalvik virtuális gépen egy úgynevezett felügyelt kód fut. Ez a megoldás rendkívül biztonságos, ugyanis így az alkalmazás nem, vagy csak nagyon ritkán tudja megbénítani az egész rendszert. Ebben a környezetben a memóriakezelés tipikusan garbage collectorral történik, ám ennek ellenére azért ügyelnünk kell arra, hogy hatékony kódot írjunk. A legfelső rétegben már csak Java-alapú megoldásokat találunk, amelyet a virtuális gép futtat, és ez adja az Android lényegét, magát az operációs rendszer szemmel látható és tapintható részét, valamint az azon futó programokat. A virtuális gép akár teljesen el is rejtheti a Linuxos filerendszert, és csak az Android Runtime által biztosítottat láthatjuk. Az Android Runtime két fő részegységre bontható. Az alkalmazás-keretrendszerre és magukra az alkalmazásokra. A keretrendszernek az a feladata, hogy az alkalmazásokat kiszolgálja és hogy hozzáférést biztosítson a rendszer különböző erőforrásaihoz. A legfelső alkalmazásréteg feladata, hogy kezelje a felhasználó által elérhető programokat. 2.3.1. A telepíthető Andridos alkalmazások Az Android platformon a programok telepítése úgynevezett apk fájlok segítségével lehetséges, amelyek leginkább a Symbian platformon megszokott.sis fájlokhoz hasonlítanak leginkább. Ezt a fájlt letölthetjük a Google Play-ről, de akár átmásolhatjuk a memória kártyára is ahonnan telepíthetjük. Magát a telepítést az úgynevezett PackageManagerService végzi. Telepítés során az alábbi lépések játszódnak le: meta-információk áttekintése céltároló kiválasztása (készülékre vagy memóriakártyára) az alkalmazás hozzáférési jogosultságainak áttekintése(például internet hozzáférés vagy GPS hozzáférés) Telepítés során mindig megnézhetjük, hogy az adott alkalmazás milyen erőforrásokhoz kér erőforrást. Ezt mindig alaposan tekintsük át, mert lehetséges, hogy valamilyen kártékony programot telepítünk. Sajnos a Google Play-en "feltehető" kártékony programok száma rohamosan nő, ezért fontos, hogy figyeljünk arra, hogy mit telepítünk fel a telefonunkra. A következő ábrán a vírusok platform szerinti eloszlását lehet megtekinteni. 10
2.3. Az Androidról részletesen 2.5. ábra. A vírusok eloszlása mobilplatformok szerint Az apk állomány tulajdonképpen egy tömörített állomány, ami az alábbi részeket tartalmazza: META-INF könyvtár, ami tartalmazza az alkalmazástanúsítványt, a meta-információkat és az erőforrások listáját Res könyvtár, ami az erőforrásokat tartalmazza AndroidManifest.xml név, verzió, jogosultság, könyvtárak classes.dex lefordított könyvtárak a virtuális gép számára resource.arsc erőforrások 2.3.2. Android alkalmazások felépítése fejlesztői szempontból Az Android platformon az alkalmazások fejlesztéséhez általánosan Java nyelvet szokás használni, amihez a fejlesztői környezetet, az SDK-t a Google által szállított Android SDK szolgáltatja. Az SDK egy betűszó, jelentése Software Development Kit, magyarul szoftverfejlesztői készlet vagy csomag. Az Androidos programok fejlesztésekor magasabb szintű Java nyelvi elemeket is használhatunk. A kész Java nyelven írt programok a virtuális gépen futnak zárt, kontrollált környezetben. A memória felszabadítását a Garbage Collector végzi, de ez nem jelenti azt, hogy felelőtlenül bánhatunk az erőforrásokkal. Törekednünk kell, hogy folyamatosan felszabadítsuk a már feleslegessé vált objektumokat. Az eseménykezelés a Java-ban már megszokott módon történik. Minden objektumhoz, amihez eseményt szeretnénk csatolni, úgynevezett Listener-eket kell definiálnunk. Ha az esemény bekövetkezett akkor a megfelelő interface függvényen keresztül kapunk értesítést. Az Androidos alkalmazások fejlesztésekor a felhasználói felület és a forráskód külön válik. Bár ez a két rész kettéválik, de persze lehetőségünk van arra, hogy a forráskódból elérjük az XML-ben definiált interfész elemeket. 11
2.4. Funkciók listája Ha egy új Android projectet hozunk létre akkor a forráskód az src könyvtárban, míg a felület leírására szolgáló XML fájlok a res könyvtárban találhatók. Az erőforrásállományokat egy R.java fájl köti össze a forráskóddal. Ha lefordítjuk a projectet akkor kimenetül a már korábban említett apk fájlt kapjuk. 2.4. Funkciók listája A program fejlesztésének elkezdése előtt az alábbi funkciók lettek kiválasztva. Ezekkel a funkciókkal rendelkezik egy modernebb futóprogram. Persze mindegyik megvalósítása egy szakdolgozatban nem lehetséges. Számomra egy egyszerűbb működőképes program megvalósítása volt a cél. Audió visszajelzés (a készülékre való nézés nélkül lehessen tudni, hogy hol tartunk) Sebesség kiíratása Átlagos sebesség kíratása Elégetett kalóriák száma Sporttal töltött idő kijelzése Nagy pontosság Térkép mutatása Offline módon történő működés Támogasson külső eszközöket (pl szívritmus-érzékelő) Korábbi futások listája Legyen intuitív a gui, ne kelljen, vagy csak minimális módon help Közösségi funkciók integrálása (Facebook, Twitter...) Saját edzésterv létrehozásának lehetősége Célok megadásának lehetősége Visszajelzés a GPS jel erősségéről Legyen pause mód az edzés alatt A kijelzőn a fontos számok nagy betűvel/számmal jelenjen meg, hogy könnyebben olvasható legyen Lehessen a korábbi edzés ellen versenyezni Ismerősök kihívásának a lehetősége 12
2.4. Funkciók listája Legyen összeköttetés a zenelejátszóval, ne kelljen kilépni a programból számváltáshoz Interneten keresztül is el lehessen érni az eredményeket Jelezze a folyadékveszteséget ahogy a kalóriát is Grafikon megjelenítése a különböző adatokról A térképen állítható legyen a szatelit és az utca nézet Vagy kövesse a mozgást a térkép vagy legyen egy gomb, ami középre rakja az aktuális helyzetet Rajzolja be az utat térképen A térképen berajzol út színe függjön a sebességtől Pihenéssel töltött idő elmentése Testsúly elmentésének a lehetősége, a pontosabb kalóriaszám megbecslése érdekében A kalóriánál jelezhetné, hogy az milyen ételnek felel meg, hogy szemléletesebb legyen Powersong azaz egy olyan zeneszám ami extra lökést ad az utolsó kilométerekhez 13
3. fejezet Fejlesztői dokumentáció 3.1. Az Android fejlesztőkörnyezet Az SDK egy olyan fejlesztői csomag, ami nem csak a fordításhoz szükséges eszközöket tartalmazza, hanem példaprogramokat, tesztelést segítő emulátort, dokumentációt és drivereket is. 3.1.1. A telepítés lépései SDK letöltése és telepítése Eclipse ADT plugin telepítése Megfelelő Android verzió telepítése az SDK segítségével Emulátor létrehozása Ahhoz, hogy használhassuk az Android emulátort, és programokat futtathassunk rajta, szükségünk van a következő előfeltételekre: JDK 6 (Java Development Kit) Eclipse (nyílt forráskódú platformfüggetlen szoftverkeretrendszer),de más program is megfelel. Telepítéskor először az Android SDK-t kell telepítenünk, aztán az Eclipse plugint, ami kapcsolatot teremt az Eclipse és az SDK között. A fejlesztőkészlet feltelepítésével feltelepítődik a számítógépünkre az SDK manager nevű program is, ami segítségével frissíthetjük a komponenseinket, vagy új Android verziót tölthetünk le. Ezeknek a letöltött Android verziók segítségével hozhatunk létre emulátorokat, amik az Android Virtual Device segédprogram segítségével indíthatók el. Az AVD-ben az alábbi beállítások adhatók meg az új emulátor létrehozásakor: Neve Android verzió SD kártya mérete 14
3.2. Az Android fejlesztőkörnyezet megjelenítési mód képernyő tulajdonságok(felbontás, pixel sűrűség, stb.) Az Eclipse plugin feltelepítése után egy úgynevezett DDMS perspektíva is elérhetővé válik a Java szerkesztőben. A Dalvik Debug Monitor Server az alábbi lehetőségeket adja a fejlesztő kezébe: debugeszköz az Eclipse alá port forwarding képernyőkép lementési lehetősége szál, heap és egyéb memóriainformációk LogCat nézet processz felügyelet mobilrádió állapot hívás és sms emuláció helyzetmeghatározás 3.2. Az Androidos alkalmazások felépítése Napjainkban egyre inkább elterjedőben vannak az okostelefonok, és így az okostelefonokra írt alkalmazások is. Ezek a programok abban különböznek a korábbi, egyszerűbb telefonokra írtaktól, hogy itt a program életciklusa nem feltétlen kell, hogy csak addig tartson amíg egy másik kerül az előtérbe. Lehetőségünk van olyan programok írására, amelyek már a rendszer indításakor elindulnak, bizonyos eseményekre reagálnak, vagy egyszerűen csak a háttérben futnak. A programok telepítésük után, egy saját, biztonságos környezetben futnak. Ezt a környezetet security sandboxnak hívják. Mivel az android is egyfajta Linux verzió, tulajdonképpen az alkalmazások egyfajta felhasználóknak tekinthetők. A Linux minden programhoz egy felhasználói azonosítót rendel. Minden processznek saját virtuális gép példánya van, így az alkalmazás kódja elkülönülten fut a többi alkalmazásétól. Az Android rendszer összetett memóriakezeléssel rendelkezik. Alapértelmezetten a rendszer engedélyezi az alkalmazásoknak a háttérben való futást, de ha a rendelkezésre álló memória mennyisége egy bizonyos szint alá csökken, a prioritási sort figyelembe véve, leállítja a legkevésbé fontos processzeket, hogy a fontosabbak számára memóriát szabadítson fel. Az Android a "legkevesebb jogosultság" elvét érvényesíti, tehát minden program csak azokhoz az erőforrásokhoz képes hozzáférni, amihez feltétlenül szükséges, így védve mind a rendszert, mind a többi programot. Ezt az elvet a rendszer úgy tartatja be, hogy a programozónak meg kell jelölnie, hogy mely erőforrásokhoz kíván hozzáférni. Ezeket a kéréseket az úgynevezett manifest XML állományban lehet beállítani. Ha a programozó nem választja ki a megfelelőt, akkor semmilyen módon nem fog tudni hozzáférni. 15
3.2. Az Android fejlesztőkörnyezet 3.2.1. Android alkalmazás komponensei Az Android platformon egy alkalmazás 4 féle komponensből épülhet föl, de az is elég, ha csak egyet tartalmaz ezek közül. Ugyanakkor lehetőség van arra is, hogy egy típusból több darabot is tartalmazzanak. Ezek eltérő életciklus modellel rendelkeznek. A komponensek a következők: Activity Service ContentProvider BroadcastReceiver Ezekről röviden: Activity: Ez a legtöbbször alkalmazott komponenstípus. Saját felülettel rendelkezik, amit szintén egy XML állományon belül adhatunk meg. Egy alkalmazáson belül általában több Activity is található. Az Android rendszer rugalmasságát jellemzi, hogy egy program arra is képes lehet, hogy egy másik program Activity-ját elindítsa. Ennek köszönhetően, hatékonyabbá válhat a programozás, hiszen ha tudjuk, hogy a másik alkalmazás tartalmaz már egy Activity-t arra a feladatra amire nekünk szükségünk van, akkor gond nélkül használhatjuk azt. Service: Ez a komponens egy hosszabb ideig a háttérben futó feladatot jellemez. Jellemzője, hogy nincs saját felhasználói felülete, de indíthat más Activity-t vagy használhat felugró ablakot. Az aktuálisan futó Service-eket a rendszerbeállítások menüben nézhetjük meg. Ezzel a komponenstípussal szokták megvalósítani a szinkronizálásokat, a zenelejátszókat vagy a nagyobb letöltéseket. Használatával vigyázni kell, mert könnyen írhatunk olyan programot, ami feleslegesen nagy adatforgalmat generál, vagy gyorsan lemeríti az akkumulátort. ContentProvider: Ez a tartalomszolgáltató komponens. Feladata az adatforrás kezelése és a kérések kiszolgálása. Adatforrás bármi lehet az adatbázistól kezdve az RSS-ig. Minden ContentProvider egyedi URI azonosítóval rendelkezik, amelyen keresztül más alkalmazások is elérhetik. BroadcastReceiver: Ennek a komponensnek az a feladata, hogy különféle események hatására aktiválódjon, és valamilyen feladatot végrehajtson. Az Android rendszer sok eseményt jelez broadcast(sugárzás) formájában. Ilyen lehet például egy bejövő hívás vagy az alacsony akkumulátorszint jelzése. Nem rendelkezik saját felhasználói felülettel, de a Service-hez hasonlóan indíthat más Activity-t vagy használhat felugró ablakot. Ha egy broadcast sugárzás bekövetkezik az Android rendszer megvizsgálja, hogy mely alkalmazások tarthatnak erre igényt, de ezeknek az eseményeknek a lekezelése már a programozó feladata. Nem csak fogadni tudunk broadcast eseményt, de indítani is. Az Activity-hez hasonló jellemzője a komponensnek, hogy ennek a segítségével is elindíthatjuk egy másik alkalmazás egy Activity-jét. 16
3.2. Az Android fejlesztőkörnyezet 3.2.2. Manifest XML állomány A manifest XML állomány legfőbb célja, hogy definiálja az alkalmazás komponenseit. Ez alapján fogja a rendszer tudni, hogy a program milyen komponenseket tartalmaz, és hogy milyen külső események lehetnek számára fontosak. Itt adhatjuk meg azt is, hogy melyik a futtatáshoz szükséges minimális Android verzió, vagy hogy milyen jogosultságokra tartunk igényt (például helymeghatározás, internetelérés, sms küldése és így tovább). Részei összefoglalva: Csomag neve, ami alkalmazásonként egyedi kell, hogy legyen Verzió Minimális Android API verzió Engedélyek Külső könyvtárak használata Alkalmazáskomponensek listája Jelzés arra, hogy milyen eseményt kell lekezelnie, és melyik alkalmazáskomponensnek A manifest XML állomány egy szabályos XML állomány. Gyökere a manifest elem. Attribútumai között szerepel a csomagazonosító, package néven. A szükséges minimális sdk verziót a minsdkversion értékeként olvashatjuk ki. Itt nem szerepel konkrét verzió, csak egy szám. Például, ha itt hetest látunk az a Android 2.1-et jelenti. Ezek után következik az application elem, aminek attribútumaként az alkalmazás neve és ikonja van definiálva. Az application elemen belül helyezkednek el a megvalósított komponensek. Az activity elem android:name attribútuma adja meg a komponenst megvalósító osztályt, android:label pedig a látható nevét. Az action tag jelzi, hogy ez a fő belépési pontja, míg a category azt jelzi, hogy az Activity jelenjen meg a indítható alkalmazások listájában. Ha szeretnénk külső könyvtárat is használni, akkor azt a uses-library alatt jelezhetjük. Például, ha a Google Maps térképét szeretnénk az alkalmazásunkon belül használni, akkor azt így adhatjuk meg: <uses-library android:name="com.google.android.maps"/> Viszont, ha a térképet használjuk akkor érdemes az internet és a GPS koordináták használatához is hozzáférést kérnünk. Ugyanis ezek nélkül, vagy nem jelenik meg a térkép, vagy nem tudjuk az aktuális koordinátákat lekérni. Ezt a kövekező módon tehetjük meg: <uses-permision android:name="android.permision.internet"/> <uses-permision android:name="android.permision.access_fine_location"/> 3.2.3. Erőforrás állományok Az android platform egyik nagy előnye, hogy lehetővé teszi a programkód és a grafikus felhasználói felület szétválasztását. Ezt úgy valósították meg az Android platformon, hogy minden projekt tartalmaz egy res nevu erofőrráskönyvtárat amely tartalmazza az 17
3.3. Az Activity és életciklusa összes erőforrás jellegű elemet. Ezek lehetnek: képek hangfájlok UI elrendezések animációk menük stílusok szöveges állományok (például többnyelvű alkalmazások esetén) Erőforrások létrehozásakor a fejlesztőkörnyezet automatikusan frissíti az R.java állományt, ami minden erőforráshoz egy statikus int típusú változót rendel. Ezeknek a változóknak a segítségével tudunk egy-egy erőforrásra hivatkozni. Az azonosítók hozzárendelése elmarad, ha hibás a szintaxis. 3.3. Az Activity és életciklusa Maga az Activity hasonlóképen képzelhető el, mint a Windowsos környezetben az ablakok. Lehetnek vagy teljes képernyősek, vagy felugró ablakok. Azonban Android alatt nincs klasszikus értelemben vett ablakkezelés. Itt nincs lehetőség az ablakok átméretezésére, vagy áthelyezésére. Egy Androidos alkalmazás általában több Activity-ből áll. Legtöbbször létezik egy kitüntetett Activity, ami az induláskor jelenik meg, és innen tudjuk elérni a többit is. Ha elindítunk egy új Activity-t akkor a korábbi Stopped állapotba kerül. Ez azt jelenti, hogy a rendszer megőrzi egy úgynevezett Back Stack-en. Amikor az új Activity elindul, az is rákerül a Back Stack-re, majd megkapja a vezérlést. A Back Stack egy last in first out típusú verem, amely a példányosított Activity-ket tartalmazza, de mindig csak egy van aktív állapotban. Minden Androidos eszköz rendelkezik egy "visszalépés" gombbal. A korábbi készülékeken ez fizikai gomb volt, de a mostanában megjelenteken (főleg tableteken) lehet virtuális gomb is. Ennek a gombnak az a szerepe, hogy a verem legfelső eleme kikerül, és a vezérlés átadódik az alatta lévőnek. Amikor elindítunk egy Activity-t, és ennek következtében leáll a korábbi, akkor mindkettő értesítést kap az eseményről egy úgynevezett életciklus(callback) metóduson keresztül. A callback metódusok lehetnek: oncreate() Létrehozáskor fut le, beállítja a megfelelő állapotokat. ondestroy() Lefoglalt erőforrásokat szabadítja fel onstart() Az Activity látható és kezelhető a rajta található vezérlőkkel. 18
3.4. Több Activity kezelése egy alkalmazásban onstop() Az Activity már nem látható onrestart() Az Activity leállása (onstop()) majd újraindulása után hívódik meg, még az onstart() előtt. onresume() Az Activity újra láthatóvá válik onpause() Az Activity háttérbe kerül, de valamennyire látszik. Például egy másik Activity Pop-up jelleggel előjön. Az Activity 3 fő állapotban lehet. Minden váltáskor a megfelelő callback függvény hívódik meg. Az állapotok a következőek: Resumed Az Activity az előtérben van és rajta van a vezérlés Paused Az Activity még él, de nem az előtérben van, de még látszik. Vagy a transzparens, vagy a popup jellege miatt. Stopped Activity még él, de nem az előtérben van és nem is látszik. Alacsony memória esetén az utóbbi két állapotban lévő Activity-ket felszabadíthatja a rendszer. Ezért fontos, hogy az alkalmazásunkat megfelelően előkészítsük az életciklus-állapotváltásokra. Azonban ha előre tudjuk, hogy az adott Activity-re később nem lesz szükség akkor a finish() függvényhívással leállíthatjuk azt. Fejlesztői szempontból fontos kérdés, hogy az Android rendszer mikor állíthatja le az Activity-ket, hogy memóriát szabadítson fel a rendszer számára. Ezt az alábbi táblázat foglalja össze: Metódus Felszabadítható utána? Következő metódusok oncreate() Nem onstart() onrestart() Nem onstart() onstart() Nem onresume() vagy onstop() onresume() Nem onpause() onpause Igen onresume vagy onstop() onstop Igen onrestart() vagy ondestroy() ondestroy Igen A "felszabadítható utána" oszlop jelzi, hogy a rendszer a függvény visszatérése után leállíthatja-e a processzt, anélkül, hogy további kódrészt hívna meg az Activity kódjából. Az onpause()-nál ez biztosan megtörténik, addig a másik két metódusnál ez nem garantált. Ahol Nem van a cellában, ott a rendszer védi a processzt a bezárástól. Amikor egy Activity újból az előtérbe kerül, a felhasználó szempontjából el kell hogy fedjük, hogy azt a rendszer újra létrehozta-e vagy a memóriából nyitotta-e meg. Ennek a kezelésére szolgál a onsaveinstancestate(). Ha a rendszernek le kellett állítania az Activity-t, újraindításkor kap egy Boundle objektumot, ami az elmentett állapotváltozókat tartalmazza. Ez a metódus főleg belső tagváltozók és kiemelt UI elemek értékeinek tárolására szolgál, nem pedig perzisztens adatok tárolására. Ennek működéséről legkönnyebben a kijelző elforgatásával győződhetünk meg, ugyanis ilyenkor a rendszer újraindítja az Activity-t. 19
3.4. Több Activity kezelése egy alkalmazásban 3.1. ábra. Activity életciklus modell 3.4. Több Activity kezelése egy alkalmazásban Az Androidos alkalmazások nagy része több Activity-ből áll. Példaként említve a saját programomat, külön Activity kezeli a főképernyőt, a történelmet, a beállításokat és az edzés képernyőt is. Ha az egyiket elindítjuk, akkor az ahhoz tartozó Activity kerül az előtérbe. Tegyük fel, hogy az alkalmazásunkban az egyik Activity-ről a másikra váltunk. Ekkor az alábbi életciklusfüggvények futnak le, ebben a sorrendben: Az első Activity-nek meghívásra kerül az onpause() függvénye A második Activity-nek meghívásra kerül az oncreate(), onstart() és onresume() függvénye Az első Activity-nek meghívásra kerül az onstop() függvénye Ahogy már korábban írtam, az alkalmazáson belüli Activity-k egy last in first out típusú verembe, más néven Back Stack-be kerülnek. Mindig az előtérben lévő Activity van a verem tetején. A felhasználói interakció, vagy egy másik Activity következtében az alkalmazás átvált egy másik Activity-re, akkor a korábban legfelül lévő eggyel lejjebb kerül a veremben, és rákerül az új. 20
3.4. Több Activity kezelése egy alkalmazásban Álltalában a Back Stack viselkedése kielégíti az igényeket, azonban néha szükség lehet a felüldefiniálására. Szükség esetén azt is megoldhatjuk, hogy a vissza hatására mindig a főképernyőn kössünk ki. Ezt vagy a manifest állományban szereplő különböző beállítások segítségével, vagy az Activity-t indító startactivity() függvény paraméterezésével állíthatjuk be. Az <activity> elem lehetséges attribútumai segítségével meghatározhatjuk, hogy hogyan viselkedjen a többi Activity-hez képest. taskaffinity: eldönti melyik task-hoz tartozik launchmode: indítási mód allowtaskreparenting: új task-hoz kerül át cleartaskonlaunch: minden Activity-t töröl a task-ból alwaysretaintaskstate: eldönti, hogy a rendszer kezelje-e a task állapotát finishontasklaunch: le kell-e állítani az Activity-t ha a felhasználó kilép a taskból A startactivity() függvény paraméterei meghatározzák, hogy az éppen elindított Activity hogyan viselkedjen azzal az Activity-vel, ami elindítja: FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_SINGLE_TOP 3.4.1. Activity indítása Az Intent objektumot komponensek közötti kapcsolat megvalósítására használatos, legsűrűbben az alkalmazás egyik képernyőjéről a másikra ugrásra. Ezt a feladatot a start- Activity() végzi melynek hatására az Android rendszer elindítja, vagy ha már fut, folytatja a paraméterként meghatározott Activity-t. Intent intent = new Intent(); startactivity(intent); A startactivity hatására a rendszer megkeresi a kapott intent beállításainak leginkább megfelelő Activity-t, és elindítja azt. Ha ezzel a módszerrel indítunk egy új komponenst akkor a hívó fél semmilyen értesítést nem kap arról, hogy befejeződött vagy nem fejeződött be az az új komponens. Ha szeretnénk erről információt kapni akkor a startactivityforresult() metódusra lesz szükségünk. A intent megadására kétféle lehetőségünk van: Explicit Intent: Megadjuk az intent komponensnév mezőjét. Ekkor a rendszer a komponensnév objektum osztálynév és csomagnév attribútumai alapján megkeresi az implementáló osztályt, és attól függően, hogy fut-e az adott Activity vagy újat indít vagy folytatja a korábbit. 21
3.5. Felhasználói felület Implicit Intent: Az Intent akció mezőjét töltjük ki. Ezzel a megadással nem a pontos Activity-t adjuk meg, hanem az elvárt eseményt, amely alapján az operációs rendszer kiválasztja a megfelelő Activity-t. Mind a két esetben lehetőségünk van az indítandó komponenssel kapcsolatban további kritériumok megadására is. 3.4.2. Explicit Intent Ha az alkalmazásunkban akarunk az egyik Activity-ből a másikba lépni, ez a legkézenfekvőbb megoldás. Mivel mi hoztuk létre az indítandó Activity komponensnevét, ezért az meg is tudjuk adni. Ezt a megoldást a programomban található megoldás segítségével szeretném ismertetni: Intent setting_intent; setting_intent = new Intent(v.getContext(), SettingsHandler.class); startactivity(setting_intent); 3.4.3. Implicit Intent Abban az esetben, ha nem tudunk pontosan megadni az indítandó komponenst, akkor nem kell kitöltenünk a komponensnév mezőt. Ilyenkor azt kell specifikálnunk, hogy milyen akciót szeretnénk végrehajtani, és az operációs rendszerre bízni, hogy megkeresse a megfelelő Activity-t. Ha ez az akció önmagában nem értelmezhető, akkor az Intent adat mezőjében kell megadnunk az adatra mutató Uri-t. Ahhoz hogy használni tudjuk ezt a megadást, fontos hogy a meghívandó Activity fel legyen készítve az Implicit Intentek kiszolgálására. Tipikusan olyan műveletek esetén használunk Implicit Intent-et, amiket valamely előtelepített program el tud látni. Ilyenek lehetnek például: egy weboldal megnyitása, zene lejátszása, fényképezés stb. Nekünk is lehetőségünk van olyan programot írni, ami fel van készítve Implicit Intent-ek fogadására. Néhány esetben az is előfordulhat, hogy az adott Intent-et egynél több, vagy kevesebb Activity képes kiszolgálni. Ha többet talált a rendszer az Activity kiválasztása a felhasználóra van bízva. Ha viszont egyet sem, akkor a startactivity hívás ActivityNotFoundException kivételt dob, amit a programozónak a hívóoldalon kell elkapnia és lekezelnie. 3.4.4. Visszatérési értékkel rendelkező Activity A startactivity metódus nagyon jól és egyszerűen használható, ha csak az alkalmazásunk képernyői közötti váltásra szeretnénk használni. Viszont ennek végrehajtásáról nem kapunk semmiféle értesítést. Ha szükségünk van visszatérési értékre, abban az esetben a startactivityforresult függvényre lesz szükségünk. Ekkor az új Activity mint egy al-activity jön létre a veremben, és befejezéskor a hívóoldalon lefut egy eseménykezelő, amiben a különböző visszatérési módokat tudjuk lekezelni. Ezt a módszert akkor érdemes használnunk, amikor egy Activity-t azért indítunk, hogy valami visszatérési adatot szolgáltasson a hívó félnek. Ezek az Activity-k nem különböznek a visszatérés nélküli társaiktól, kivéve azt, hogy befejezésük után lefut az onactivityresult eseménykezelő. 22