Sunteți pe pagina 1din 9

Introducere n Android

Lupacu Andrei

Android este o soluie funcional livrat cu toate componentele subsistemelor utilizate. Pachetul conine sistemul de operare , middleware i aplicaii cheie pentru funcionarea sistemului. Google Inc. a cumprat n 2005 developerul principal al sistemului , Android Inc. . Sistemul de operare este bazat pe un kernel de Linux. Google mpreun cu ali membri ai Open Handset Alliance au colaborat n crearea i lansarea sistemului. Proiectul Android Open Source este responsabil pentru dezvoltarea viitoare a Android-ului. Android este la momentul de fa cea mai bine vndut platform pentru smartphones. Android are o comunitate mare de developeri care scriu aplicaii care extind funcionalitatea dispozitivelor. Aplicaiile sunt scrise n mare parte n Java, dar n industrie se folosesc tool-uri de translatare a codului, astfel o aplicaie mobil scris n C# poate fi translatat pentru platform Android sau IOS. Lansarea distribuiei Android pe 5 Noiembrie 2007 a fost anunat odat cu fondare Open Handset Alliance, un consoriu de 80 de companii de hardware, software i telecom, devotate avansrii standardelor pentru dispozitive mobile. Google a lansat cea mai mare parte a codului Android sub licena Apache , o licena gratuit pentru software open-sourced. Softaware-stack-ul care definete Android-ul const n aplicaii Java care ruleaz pe un framework orientat obiect , bazat pe Java , deasupra librriilor de nucleu Java care ruleaza pe o main virtuala Dalvik ce conine compilare JIT. Librriile scrise in C includ managerul de suprafa, framework-ul media OpenCore,sistemul relaional de management de baza de date SQLite, OpenGL

Figura 1:Diagrama arhitecturii Android.

ES 2.0 3D, motorul WebKit, motorul grafic SGL, SSL si Bionic libc. Platforma hardware este bazata pe arhitectura ARM. Exista si suport pentru x86 in proiectul Android-x86 si Google TV foloseste o versiune speciala x86 de Android. Primul telefon comercial care a rulat sistemul Android a fost HTC Dream, lansat pe 22 octombrie 2008. La nceputul anului 2010 Google a colaborat cu HTC si au lansat nava amiral a dispozitivelor Android , Nexus One. Acesta a fost urmat in 2010 de Nexus S realizat de Samsung. IOS si Android 2.3.3 "Gingerbread" pot si fi setate in dual-boot pentru a rula pe IPhone si IPod Touch cu ajutorul utilitarului OpeniBoot si iDroid. Kernelul Android este derivat din kernelul de Linux. Google a contribuit cu cod la kernelul Linux in cadrul efortului lor in dezvoltarea Android-ului, dar anumite feature-uri , in mod special un feature de management al consumului de energie numi wakelock a fost respins de principalii dezvoltatori de kernele, astfel Andoird-ul este o versiune separata a Kernelului Linux. Frameworkul aplicaie: datorita faptului ca se ofer o platforma deschisa, Android ofer programatorilor abilitatea de a crea aplicaii deosebit de bogate si inovatoare. Programatorii sunt liberi sa se bucure de tot suportul hardware al sistemului, de accesul la informaiile de localizare , sa ruleze servicii de background, sa seteze alarme, sa adauge notificri in bara de status ,si multe altele. Programatorii au acces deplin la acelai framework ca si aplicaiile nucleului. Arhitectura aplicaiei este creata ca sa simplifice reutilizarea componentelor; orice aplicaie poate s-i publice capabilitile si orice alta activitate poate folosi aceste capabiliti. Exact aceasta caracteristica permite utilizatorului sa nlocuiasc componentele sistemului. La baza tuturor aplicaiilor se afla o parte de servicii si de sisteme cum ar fi: - Un set bogat de View-uri care pot fi folosite in construcia aplicaiilor, incluznd liste, tabele, texbox-uri, butoane, si chiar un web browser pe poate fi integrat in aplicaii. -Content Providers care permit aplicaiilor acces la datele altor aplicaii (ex: lista de contacte) , sau s-i mprteasc datele proprii. -Resource Manager , care permite folosire resurselor cum ar fi stringuri localizate, resurse grafice si fiiere de layout. -Notification Manager , care permite tuturor aplicaiilor sa afieze mesaje in bara de status. -Activity Manager, care are grija de ciclurile de via ale aplicaiilor si ofer o stiva de aplicaii in background. O activitate este o componenta a unei aplicaii care ofer utilizatorului un ecran in cadrul aplicaie. Fiecare activitate este o fereastra in care se deseneaz coninutul interfeei grafice. Fereastra tipic umple ecranul , dar poate si fi si mai mica (floating). O indicaie de obicei este compusa din mai multe activiti care sunt slab conectate intre ele. Tipic o activitate ntr-o indicaie este designata ca fiind activitatea "main" , care este prezentata utilizatorului cnd deschide aplicaia. Fiecare activitate poate la randul ei sa deschid o alta activitate pentru a efectua diferite task-uri. De fiecare data cnd o activitate este pornit , activitatea curenta

este oprita , dar sistemul prezerva starea acesteia ntr-o stiva ("back stack"). Cnd o noua activitate este pornit , este adugata in stiva si preia focusul. Back stack-ul funcioneaz pe principiul "first in , last out" , astfel in cat cand utilizatorul termina de folosit activitatea curenta si apsa butonul "Back" se ntoarce la activitatea anterioara, care este scoasa din stiva. Cnd o activitate este oprita deoarece o noua activitate este pornit , este notificata de aceasta schimbare de stare prin metodele de callback ale ciclului de viaa al activitii.

Figura 2: Diagrama de funcionare a back stack-ului - sursa: developers.android.com

Un task este o unitate coeziva care poate fi mutata in background , cnd un utilizator ncepe un nou task sau cnd utilizatorul se ntoarce la ecranul "Home", apsnd butonul "Home".In acest timp in background , toate activitile din cadrul taskului sunt oprite , dar back stack-ul taskului rama ne activ , taskul a pierdut doar focus-ul cat timp o alta aplicaie ocupa ecranul. Un task se poate ntoarce in "foreground" astfel nct userul s-i continue activitatea. Mai multe taskuri pot fi rulate in "background" simultan. Daca userul ruleaz multe activiti in background , exista posibilitatea ca sistemul sa le distrug ca sa obin memorie, cauznd pierderea strii activitii. Deoarece activitile din "background" nu sunt rearanjate , daca activitatea pemite utilizatorului sa porneasc o anumit activitate din mai multe , o activitate noua este creata si adugat pe stiva in loc sa se aduc activitatea de stiva . De exemplu o activitate din aplicaie poate fi instantiata de mai multe ori , chiar si din task-uri diferite. La navigarea in apoi (butonul "Back") se poate trece prin fiecare instant a aceleiai activiti in

ordinea in care au fost deschise, fiecare avnd propria stare a interfeei grafice. Acest comportament poate fi corectat. Salvarea strii activitii se face in momentul in care o activitate este oprita. Astfel cnd userul se ntoarce la o activitate precedenta , interfaata isi menine starea. Oricum starea curenta in momentul navigrii la o alta activitate trebuie salvata, utiliznd metodele callback , in cazul in care activitatea este distrusa si trebuie recreata. Cnd sistemul oprete una dintre activiti , este posibil ca acea activitate sa fie distrusa. Cnd se ntmpla aa ceva , informaiile referitoare la starea activitii sunt pirdute. Sistemul inca tie ca activitatea ocupa o poziie in back stack, dar cnd este repornit este si recreata. Ca sa se evite pierderea strii , trebuie sa se implementeze metoda de callback onSaveInstanceState(). Modalitatea in care sistemul Android face management la taskuri , prin plasarea lor pe o stiva funcioneaz perfect pentru majoritatea aplicaiilor , si programatorul nu ar trebui sa se preocupe de modul in care activitile sunt asociate unui task. Dar in caz ca se dorete modificarea comportamentului standard , se pot face modificri in fiierul Androidmanifest.xml , in cadrul tagului <activity> si in flag-urile pasate metodei startActivity(). -taskAffinity -launchMode -allowTaskReparenting -clearTaskOnLaunch -alwaysRetainTaskState -finishOnTaskLaunch

Flag-urile metodei startActivity() sunt: -FLAG_ACIVITY_NEW_TASK -FLAG_ACIVITY_CLEAR_TOP -FLAG_ACIVITY_SINGLE_TOP Un serviciu este o componenta a aplicaiei care poate face operaii de durata lunga in "background" si nu ofer interfaa grafica. O componenta a altei aplicaii poate porni un serviciu si el va continua sa ruleze in "background" chiar daca userul pornete o alta aplicaie. Adiional , o componenta se poate lega de un serviciu pentru a interaciona cu el si chiar pentru a realiza comunicaii "interprocess" (IPC). De exemplu un serviciu poate efectua tranzacii pe reea, reda fiiere media , efectua operaii I/O sau poate interaciona cu un content provider , toate acestea din "background". Un serviciu poate avea doua stri:

Started un serviciu este pornit cnd o aplicaie l pornete printr-un apel la metoda startService(). Odat pornit, un serviciu poate rula in background o perioada nedefinita, chiar daca componenta care l-a pornit este distrusa. De obicei un serviciu efectueaz o singura operaie si nu returneaz un rezultat. Cnd operaia este finalizata serviciul ar trebui sa se opreasc. Bound un serviciu este "bound" cnd o aplicaie se leag de el, printr-un apel al metodei bindService(). Un serviciu "bound" ofer interfaa client-server prin care componenta poate interaciona cu el, trimite cereri ,primi rspunsuri si chiar peste granitele procesului (IPC) . Un serviciu "bound" ruleaz att timp cat ruleaz si aplicaia care s-a legat de el. Mai multe componente se pot lega de acelai serviciu , dar cnd toate se elibereaz de serviciu, acesta este distrus. Un serviciu trebuie sa ruleze in threadul principal al procesului ce i-l gzduiete, serviciul nu i creeaz propriul thread si nu ruleaz ntr-un proces separat(dect daca este specificat). Daca serviciul va efectua operaii intensive pe procesor, care pot bloca thread-ul principal al aplicaiei este bine ca serviciul sa creeze un nou thread in care sa efectueze aceste operaii. Utiliznd un thread secundar , se reduce riscul obinerii erorilor de tipul Application Not Responding (ARN) , si threadul principal al aplicaiei poate fi dedicat interaciunilor cu utilizatorul. Intent si filtre de Intent

Cele trei componente ale aplicaiei sunt activiti , servicii si broasca-i receiver-ere sunt activate prin mesaje numite Intent-uri. Mesageria prin Intent-uri este o funcionalitate pentru runtime binding intre componentele unei complicaii. Intent-ul nsui , un obiect Intent , este o structura de date pasiva, care deine o definiie abstract a operaiilor ce pot fi efectuate sau in unele cazuri de transmitere , a descrierii unui eveniment ce s-a produs si este anunat. Obiectul Intent este o colecie (Bundle) de informaii. Conine informaii de interes pentru acea componenta care primete intent-ul plus informaiile de interes pentru sistemul Android. Un Intent in principal conine: -Numele componentei : numele componentei ce va efectua aciunea. Campul este un obiect ComponentName si este o combinaie intre un nume pe deplin calificat de clasa si numele pachetului din manifest , unde se gsete componenta vizata. Numele pachetului din ComponentName si din manifest nu este neaprat nevoie sa fie identice. Numele componentei este opional. Daca este setat , obiectul Intent este unei instante a clasei designate. Daca nu este setat , Android utilizeaz informaiile pe care le deine si cuta o tinta pentru obiect.

livrat

- Actiunea : un string ce descrie aciunea de efectuat sau in cazurile difuzare de intent, aciunea ce a avut loc .Clasa Intent definete un numr de aciuni implicite.

Constanta
ACTION_CALL ACTION_EDIT ACTION_MAIN ACTION_SYNC ACTION_BATTERY_LOW ACTION_HEADSET_PLUG ACTION_SCREEN_ON ACTION_TIMEZONE_CHAN GED

Componenta tinta
activity activity activity activity broadcast receiver broadcast receiver broadcast receiver broadcast receiver

Actiunea
Initiaza un apel telefonic Afiseaza date de editat Porneste ca aplicatie principala fara date de intrare sau de iesire Sincronizeaza datele de pe server cu cele de pe dispozitiv Un mesaj de warning despre starea bateriei Un mesaj de atentionare despre starea castilor Ecranul a fost optrit Setarile zonei de timp au fost schimbate

- Datele : URI-ul datelor ce vor fi procesate si tipul MIME al datelor. Aplicaii diferite sunt asociate specificaiilor de date diferite. Daca aciunea este ACTION_EDIT , campul de va conine URI-ul unui document ce va fi deschis pentru editare. Daca aciunea este ACTION_CALL , campul de date va fi un URI "tel:" cu numrul ce va fi sunat. Aciune ACTION_VIEW are asociat un camp de date de tipul "http:" , si se vor downloada si vizualiza datele refereniate. Categorie: un string ce conine informaii asupra tipului de componente ce vor prelua Intent-ul. Orice categorie poate fi plasata in campul categorie, desi sistemul ofer cteva constante:

date

Constanta
CATEGORY_BROWSAB LE CATEGORY_GADGET CATEGORY_HOME CATEGORY_LAUNCHE R CATEGORY_PREFEREN CE

Insemnatate
Tinta poate fi deschisa de un browser pentru a afisa informatiile Activitatea poate fi integrata intr-o alta activitate ce suporta gadgets Activitatea viata este ecranul Home Activitatea poate fi punctul de intrare a taskului Activaitatea este o fereastra de preferinte

-Extra : perechi cheie-valoare de informaii adiionale care vor fi livrate aplicaiei tinta. Obiectul Intent ofer metode put...() si get...() pentru adugarea informaiilor adiionale si pentru recuperarea lor. Aceste metode sunt paralele de cele oferite de obiectul Bundle.
Rezoluia Intent-urilor : Intent-urile pot si mprite in doua categorii:

Intent-uri explicite : care definesc tinta prin nume. Cum numele aplicaiilor tinta nu vor fi tiute de programatori , acest tip de Intent-uri sunt folosite pe activitile interne. Intent-uri implicite : nu prezint campul de nume . Sunt folosite pentru activarea componentelor altor activiti. Sistemul Android lanseaz un intent explicit ctre o instant a unei clase. Nimic in afara de numele componentei din obiectul Intent nu ajuta la gsirea aplicaiei tinta. O strategie diferita este necesara in cazul Intent-urilor implicite. In absenta unei tinte prestabilite , sistemul Android trebuie sa caute cea mai potrivita componenta care sa primeasc Intent-ul o singura activitate sau un serviciu care sa efectueze activitatea descrisa in receptorii de difuzare. Realizeaz acest lucru comparnd coninutul Intent-ului cu filtrele de Intent , structuri asociate componentelor care pot fi poteniale tinte. Filtrele publica capabilitile unei activiti si pot defini Intent-ul care sa o foloseasc. Ele deschid aplicaia ctre posibilitatea de a primi un Intent implicit de tipul prezentat. Daca o componenta nu are filtre de intent, poate primi doar Intent-uri explicite.

Procese si fire de execuie


Cnd o componenta a unei aplicaii pornete si aplicaia nu are alte componente care ruleaz, sistemul Android , pornete un nou proces Linux pentru aplicaie , cu un singur fir de execuie. Implicit toate componentele aplicaiei ruleaz in acelai proces si fir de execuie. Daca o aplicaie pornete si ea este deja pornit , ea pornete in spatiu procesul instanei precedente si in firul de execuie al acesteia. Anumite componente pot rula in procese diferite , si pot crea fire de execuie adiionale. Toate componentele unei aplicaii ruleaz in acelai proces , in mod implicit, si mare parte din aplicaii ar trebui sa respecte acest lucru. Procesul care gzduiete o componenta poate fi definit in fiierul manifest. Elementele manifest-ului pentru tipurile de componente suporta un atribut "adroid:process" , care poate specifica un proces care sa ruleze componenta. Fiecare componenta poate fi pornit in acelai proces sau in procese diferite. Se poate seta atributul "android:process" astfel nct componente ale aplicaiilor diferite sa ruleze in acelai proces att timp cat aplicaiile dein acelai Linux ID si au acelai certificat. Cnd o aplicaie este pornit , sistemul creeaz un fir de execuie pentru aplicaie , numit "main". Firul de execuie este foarte important deoarece face management la evenimentele componentelor grafice. Este de asemenea firul de execuie in care interfaa grafica interacioneaz cu aplicaia. Firul principal de obicei este numit firul UI. Sistemul nu creeaz un thread separat pentru fiecare instan a unei componente. Toate componentele ruleaz in acelai proces si sunt instantiate in thread-ul UI , si toate apelurile sistemului ctre componente sunt efectuate prin intermediul acestui thread. Astfel metodele care rspund la funciile de callback ale sistemului ruleaz pe threadul UI. Cnd aplicaia efectueaz munca intensiva , modelul de fir de execuie singular poate oferi performante slabe daca aplicaia nu este realizata corect. Deasemenea daca totul se ntmpla in thread-ul UI , operaiile de lunga durata de acces la reea sau la baza de date vor bloca interfaa

grafica. Cnd thread-ul UI este blocat , evenimentele nu pot fi lansate (nici cele de redesenare). Din perspectiva utilizatorului aplicaia pare blocata. Si mai ru , daca threadul Ui este blocat pentru o perioada mai lunga de 5 secunde , dialogul ANR este prezentat utilizatorului.