Documente Academic
Documente Profesional
Documente Cultură
Informatică Economică
LUCRARE DE LICENȚĂ
BUCUREȘTI
2014
Cuprins
Introducere ..................................................................................................................................
Context ................................................................................................................................................
Concluzii ...................................................................................................................................................
ANEXE ......................................................................................................................................................
Bibliografie .............................................................................................................................................
Introducere
2
Context
În ultimele decenii, odată cu dezvoltarea tot mai rapidă a tehnologiei, piața a început să se
concentreze tot mai mult în jurul conceptului de smartphone (telefon mobil multimedia multifuncțional,
conectat la o rețea GSM sau UMTS). Este o tendință normală, având în vedere faptul că traficul de date a
devenit tot mai rapid și mai accesibil ca costuri, smartphone-urile oferind aproape toate funcționalitățile
cu care este obișnuit un utilizator de computer (agendă, calendar, navigare GPS, e-mail, browser, editor
de text, minicalculator, aparat foto-video și chiar soft-uri de specialitate precum Adobe Photoshop).
Treptat, mijloacele clasice de comunicare între dispozitivele mobile sunt tot mai puțin utilizate, locul lor
fiind luat de aplicații ce comunică prin Internet. De exemplu, utilizând Facebook Messanger sau Skype
poți vorbi gratuit oriunde în lume consumând foarte puţin din traficul de date disponibil.
Primul dispozitiv pentru care s-a folosit acest termen , smartphone , a fost modelul GS88
„Penelope” prezentat de compania Ericsson în anul 1997. După această lansare principalii producători
de telefoane mobile : Nokia , Motorola , Sony Ericsson şi Samsung s-au concentat asupra procucerii de
smartphone-uri. Sistemele de operare Symbian şi RIM de la Nokia respectiv BlackBerry dominau piaţa la
sfârşitul anului 2007.
(sursă: http://techcrunch.com/2014/05/06/android-still-growing-market-share-by-winning-first-time-
smartphone-users/ )
3
Android 187.027,721 188.227,483 150.621,7 44% 39% -1% 24%
Primul smartphone pe care a rulat sistemul de operare Android a fost HTC Dream, cunoscut şi
sub numele de T Mobile G1. În februarie 2009, telefonul este lansat pe piaţă cu versiunea 1.5, alias
Cupcake, dar care are câteva lipsuri. Totuşi, comparativ cu prima versiune, 1.0, Cupcake face posibilă
afişarea tastaturii virtuale pe ecran şi personalizarea ecranului de pornire cu widget-uri.
Începând din 2009 Google a lansat constant noi versiuni ale sistemului de operare Android,
înbunătățind de fiecare dată problemele apărute la versiunea precedentă si adaugând noi
funcţionalităţi. Astfel în tabelul 2 sunt prezentate versiunile stemului de operare:
(sursă : http://ro.wikipedia.org/wiki/Android_(sistem_de_operare )
4
Sistemul de operare Android beneficiază, de asemenea, de cel mai mare magazin virtual de
aplicaţii, Google Play, care a devansat recent pe cel de la Apple. Acesta oferă posibilitatea dezvoltatorilor
de a adăuaga aplicaţia lor contra unei taxe unice. Pe lângă aplicațile publicate în Google Play se mai
găseşte şi conţinut video, cărţi şi muzică.
Obiectivul propus este acela de a dezvolta o aplicaţie ce va rula pe sistemul de operare Android.
Pentru a realiza această aplicație este necesar să studiem structura sistemului de operare precum și
tehnologiile folosite.
Funcţia principală a aplicaţiei prezentate în cadrul acestei lucrari este aceea de a alcătui un top
al preferinţelor prietenilor selectați ai unui utilizator al reţelei de socializare Facebook. În urma studierii
magazinului virtual Google Play, am constatat lipsa unei astfel de aplicaţii care să prezinte unui utilizator
principalele preferințe ale prietenilor.
Necestiatea poate fi justificată prin numărul mare de utilizatori al acestei reţele de socializare,
dintre care majoritatea folosesc smartphone-uri pentru a o accesa şi prin dorinţa acestora de a vedea
preferințele prietenilor.
Structura lucrării
În cadrul acestei lucrări vor fi abordate toate noţiunile teoretice necesare pentru a îndeplini
obiectivul propus, acela de a construi o aplicație ce va rula pe sistemul de operare Android.
Ultimul capitol al acestei lucrări prezintă posibile dezvoltări ulterioare ale aceste aplicaţii precum
şi concluziile la care am ajuns în urma dezvoltării.
Tehnologii folosite
În acest capitol vom detalia tehnologiile folosite pentru a dezvolta aplicaţia prezentată.
5
Proiectul a fost realizat folosind tehnologii şi tool-uri open-source. Această alegere a fost făcută
deoarece prezintă următoarele avantaje:
Costul redus de dezvoltare al aplicaţiei, neexistând taxe de licenţiere pentru aceste tehnologii
Aplicaţia este destinată dispozitivelor mobile ce rulează Android şi, prin urmare, aceasta a fost
realizată folosind Android SDK. Deoarece s-a dorit conectarea la reţeaua de socializare Facebook şi
folosirea anumitor date ale utilizatorilor, a fost folosit şi Facebook SDK. Ambele SDK-uri sunt disponibile
pentru a fi descărcate în mod gratuit de pe site-urile oficiale.
Mediul de programare ales este ADT (Android Developer Tools). Acesta este o extensie a mediului de
programare Eclipse IDE, având integrat Android SDK.
În continuare vor fi detaliate tehnologiile folosite în realizarea aplicaţiei, precum şi justificarea folosirii
acestora.
Platforma Android
Caracteristici Android
Android este un sistem de operare din familia Unix, bazat pe kernel-ul Linux, cu o interfață
utilizator bazată pe manipulare directă, proiectată în primul rând pentru dispozitive mobile cu ecran
tactil (touchscreen), folosind input-uri de tip atingere.
Un aspect foarte important legat de Android îl constituie faptul că are codul sursă publicat de
către Google sub licențe open-source. Acest lucru a format o comunitate activă de dezvoltatori ce
folosesc codul sursă al proiectului AOSP (Android Open Source Project) pentru a dezvolta și distribui
propriile versiuni modificate ale sistemului de operare. Acestea aduc deseori funcționalități noi și
actualizări pentru dispozitive mai repede decât producătorul oficial sau operatorul de telefonie mobilă,
totuși, fără a garanta funcționarea la parametri optimi. De asemenea, comunitatea oferă suport
continuu pentru dispozitivele mai vechi ce nu mai primesc actualizări oficiale și ajută utilizatorii
neexperimentați să porteze Android pe dispozitive ce oficial rulează alte sisteme de operare. Versiunile
lansate de comunitate sunt de cele mai multe ori pre-rooted și conțin modificări inadecvate pentru
utilizatorii neinițiați în acest domeniu, cum ar fi capacitatea de supraturare sau subturare a procesorului.
CyanogenMod este versiunea comunitară cea mai populară și stă la baza majorității celorlalte.
Sistemul de operare Android este structurat, conform figurii 3, pe mai multe nivele, fiecare nivel
depinzând de funcţionalităţile oferite de nivelul inferior acestuia.
7
Figură
1 : Arhitectura sistemului Android
(sursă : http://www.cprogramming.com/android/android_getting_started.html)
Nivelul Linux Kernel stă la baza arhitecturii Android şi asigură funcţionalităţi de bază precum
gestionarea proceselor, gestionarea sistemului de fişiere, gestiunea retelistica a dispozitivului şi
driverele. Sistemul de operare Android este derivat din Linux Kernel 2.6 și este de fapt creat de la sursă
Linux, compilate pentru dispozitive mobile. Kernel-ul acționează ca un strat de abstractizare hardware
între hardware și stiva software-ul Android. Librăria standard de C a Android-ului, Bionic, a fost
dezvoltată special de Google, ca o derivare a librăriei BSD. Bionic conține o suită majoră de
funcționalități noi, specifice kernel-ului Linux, aflându-se în prezent într-o continuă dezvoltare
(independent de alte baze de cod sursă Android).
Nivelul Libraries cuprinde un set de librării C/C++ ce stau la baza funcţionării componentelor sistemului
Android. O librărie prezentă în acest nivel este SQLite pe care am folosit-o în cadrul aplicaţiei prezentate
pentru a stoca date persistente.
SQLite este o bibliotecă publică în cadrul căreia se găseşte implementarea unui motor de baze
de date, de sine stătător, care nu necesită server sau alte configuraţii speciale.
Citirea şi scrierea datelor se face direct pe disk, o bază de date completă SQL cu mai multe
tabele, view-uri, indexi şi triggeri fiind stocată sub forma unui singur fişier. Aceste fişiere sunt salvate în
memoria dispozitivului în directorul:
8
DATA/data/NUMELE_APLICAŢIEI/databases/NUMELE_BAZEI_DE_DATE
Formatul fişierelor stocate este cross-platform, facilitând portarea bazelor de date SQLite.
Tipurile de date ce pot fi folosite în SQLite sunt TEXT (echivalentul tipului de date String din
Java), INTEGER (echivalentul tipului de date long din Java) și REAL (echivalentul tipului de date double
din Java) însa nu se face validarea automată a tipurilor de date înainte ca acestea să fie introduse în baza
de date.
Android SDK conţine o serie de clase cu ajutorul cărora poate fi accesat SQLite şi se poate
efectua operaţii asupra bazelor de date. Aceste clase sunt în pachetul android. Database și android.
Database. Sqlite.
Surface Manager: Suportă diferite formate și codec-uri audio și video, inclusiv redarea și înregistrarea
lor.
System C Libraries: Un subset al librăriei standard C (libc) special adaptată pentru dispozitive mobile pe
care rulează Linux
OpenGL ES Libraries: Acestea sunt bibliotecile grafice pentru randare grafica 2D și 3D.
Nivelul Android Runtime include un set de librării care au disponibile marea parte a funcţionalităţilor
disponibile pentru limbajul de programare Java. În cadrul acestui nivel fişierele. Class sunt convertite de
sistemul Android în fişiere. Dex (un tip special de bytecode optimizat pentru dispozitive mobile fiind
necesare puţine resurse). Android rulează în mașina virtuală Dalvik; de la versiunea 4.4, este suportată o
nouă mașină virtuală experimentală, ART, care nu este însă activată în mod implicit. Aceasta rulează
fişierele. Dex, fiindu-i alocată câte o maşină virtuală fiecărei aplicaţii.
Nivelul Application Framework oferă dezvoltatorilor un set foarte mare de API-uri pentru ca aceştia să
nu fie nevoiţi să scrie fiecare acţiune întreprinsă de sisiemul de operare atunci când dezvoltă o aplicaţie
Android. Aceste servicii şi mecanisme stau la baza funcţionării tuturor aplicaţiilor. Dintre acestea
amintim:
Activity Manager: gestionează ciclul de viaţă al aplicaţiilor şi poate avea mai multe stări; o aplicaţie
poate avea mai multe activiatati care pot avea ciclul lor de viaţă; există o activitate principală care
porneşte atunci când aplicaţia este lansată; o activitate se încheie atunci când este lansată o altă
activitate
Resource Managers: Aplicații au nevoie de resurse externe, cum ar fi imagini, şiruri de caractere, etc
Toate aceste resurse sunt gestionate de către managerul de resurse, care le face disponibile într-un mod
standardizat.
Content Provider: Aplicații împărtășesc, de asemenea date. Din când în când, o singură cerere poate
avea nevoie de unele date din altă aplicație. Acest acces la date la altă aplicație este activată de către
content provider
Nivelul Applications este ultimul nivel şi este reprezentat de aplicaţiile create de către dezvoltatori şi
care pot fi folosite de utilizatorii finali.
O aplicație constă într-un fișier. Apk (android package) și conține, de obicei, 3 componente:
9
• Fişierul executabil Dalvik – reprezintă codul sursă Java compilat pentru a obține executabilul şi care e
rulat de maşina virtuală Dalvik.
• Resurse – orice nu este cod sursă este o resursă. Aplicația poate să conțină imagini, fișiere
audio/video și numeroase fișiere XML care descriu layout-ul, etc.
• Librării native – Opțional, aplicația poate conţine librării native, C/C++, care sunt incluse în fișierul
Apk.
Aceste aplicaţi sunt formate din componente slab cuplate, legăturile fiind făcute printr-un fişier
manifest.xml. În cadrul acestui fişier sunt prezente metadate despre fiecare componentă şi cum
interacţionează cu altă componentă.
Elemente componente
Pentru a putea trece la detaliile de implementare, trebuie să explicăm mai întâi câteva componente
specifice platformei:
Un intent este un obiect de mesagerie ce poate fi folosit pentru a solicita o acțiune din altă componentă
a aplicației. Deși intent-urile facilitează comunicarea între componente în diferite moduri, putem separa
trei cazuri de utilizare fundamentale:
O activitate reprezintă un singur ecran al aplicației. Puteți începe o nouă instanță a unei activități pasând
un intent ca parametru funcției startActivity (). Acesta descrie activitatea ce urmează să pornească și
conține toate datele necesare.
Dacă doriți să primiți un rezultat în momentul în care activitatea se termină, trebuie să apelați metoda
startActivityForResult (). Activitatea dumneavoastră va primi rezultatul sub forma unui intent separat, în
cadrul callback-ului onActivityResult ().
Un serviciu este o componentă care efectuează operațiuni în fundal, fără a avea nevoie de o interfață
utilizator. Puteți porni un serviciu pentru a efectua o operațiune o singură dată (cum ar fi descărcarea
unui fișier), pasând un intent metodei startService (). Acesta descrie serviciul ce urmează să pornească și
conține toate datele necesare.
În cazul în care serviciul este proiectat cu o interfață client – server, vă puteți lega la serviciu din altă
componentă a aplicației pasând un intent funcției bindService ().
Un broadcast reprezintă un mesaj ce poate fi primit de orice aplicație. Sistemul transmite astfel de
mesaje pentru diverse evenimente, cum ar fi atunci când sistemul pornește sau când dispozitivul începe
să se încarce. Utilizatorul poate trimite și el mesaje de tip broadcast către alte aplicații pasând un intent
10
către una din următoarele trei metode: sendBroadcast(), sendOrderedBroadcast(),
sendStickyBroadcast().
Din punct de vedere al specificității, putem de asemenea deosebi două tipuri de intent-uri:
Explicite – specifică numele componentei ce trebuie să pornească (mai exact numele complet al clasei).
Veți folosi de obicei un intent explicit pentru a porni o activitate sau un serviciu din cadrul propriei
aplicații, deoarece cunoașteți numele clasei componentei respective. De exemplu, declanșați o nouă
activitate ca răspuns la o acțiune efectuată de utilizator sau porniți un serviciu pentru a descărca un
fișier în fundal.
Implicite – nu denumesc o componentă specifică însă declară o acțiune generală, ceea ce permite unei
componente din altă aplicație să o efectueze. De exemplu, dacă doriți să arătați utilizatorului o locație
pe hartă, puteți utiliza un intent implicit pentru a solicita ca o altă aplicație capabilă să facă acest lucru.
Atunci când creați un intent explicit pentru a porni o activitate sau un serviciu, sistemul lansează imediat
componenta specificată. În cazul unui intent implicit, sistemul caută cea mai potrivită componentă prin
compararea conținutului acestuia cu filtrele de intenție (intent filters) – declarate în fișierele manifest –
ale altor aplicații instalate pe dispozitiv. Dacă sistemul găsește o singură potrivire, lansează imediat
componenta. Altfel, afișează o fereastră (de tip dialog) prin care utilizatorul poate alege ce aplicație să
fie utilizată.
(sursă : http://developer.android.com/guide/components/intents-filters.html )
Schema din Figura 2 ilustrează cum este pasat un intent implicit prin intermediul sistemului pentru a
începe o nouă activitate. Așadar, activitatea A crează un intent ce conține o descriere a acțiunii de
efectuat și îl pasează metodei startActivity (). Sistemul caută în toate aplicațiile un intent filter potrivit
pentru intent-ul primit. Atunci când găsește o potrivire, sistemul pornește acea activitate (în cazul
nostru, activitatea B) prin invocarea metodei onCreate () căreia îi pasează intent-ul.
Un intent filter este o expresie – aflată în fișierul manifest al aplicației – ce specifică tipurile de intent-uri
pe care componenta acceptă să le primească. De exemplu, prin declararea unui intent filter pentru o
11
activitate, devine posibil ca aceasta să fie deschisă de către alte aplicații prin intermediul unui anumit
intent. De asemenea, dacă nu este declarat niciun filtru pentru o activitate, atunci ea poate fi pornită
doar explicit.
Din motive de securitate, este recomandat ca pornirea serviciilor să fie făcută printr-un intent explicit,
fără a declara filtre. Folosind un intent implicit, nu poți fi sigur cine îl va prelua, iar utilizatorul nu poate
vedea ce serviciu pornește.
2. Activity
O activitate este o componentă a aplicației care oferă un ecran cu care utilizatorii pot interacționa în
scopul de a face ceva, cum ar fi să formeze un număr de telefon, să facă o fotografie, să trimită un e-
mail, sau pentru a vizualiza o hartă. Fereastra umple tipic ecran, dar poate fi mai mică decât acesta și
poate sta deasupra altor ferestre.
O aplicație poate conţine una sau mai multe componente de tip Activity în funcție de design, una dintre
acestea fiind marcată ca și activitatea principală a aplicației. Activitate principală va fi lansată în execuţie
la pornirea aplicației.
Pentru a crea o activitate, trebuie să creați o subclasă de Activity. În această subclasă trebuie să
suprascrieti metodele care sunt apelate atunci când activitatea trece dintr-o stare în alta pe parcursul
ciclului de viaţă, ca de exemplu la creare, la oprire, la revenire sau la distrugere. Cele mai importante
metode care trebuie suprascrise sunt:
onCreate (): această metodă trebuie implementată obligatoriu pentru a putea fi apelată când este
creată activitatea.În cadrul acestei metode trebuie iniţializate componentele de bază ale activităţii.
onPause (): sistemul apelează această metodă la primul semn ca utilizatorul a părăsit activitatea curentă.
12
Figură 3 : Ciclul de viață al unui Activity
(sursă : http://developer.android.com/guide/components/activities.html )
13
Figura 3 ilustrează diverse căi pe care le poate lua o activitate între diferite stări ăla acesteia.
Dreptunghiurile reprezintă metodele suprascrise care le puteți implementa pentru a efectua operațiuni
în cazul în care în activitatea respectivă se face tranziția între stări.
Resumed: Activitatea este în prim-planul ecranului fiind utilizată. (Această stare este uneori menționată
ca „stare activă”.)
Paused: Activitatea nu se află în prim-plan dar este încă vizibilă. Componentele activităţii aflate în
această stare nu interacţionează cu utilizatorul însă sunt ataşate manager-ului de ferestre fiind vizibile
utilizatorului.
Stopped: Activitatea este complet acoperit de o altă activitate (activitatea este acum în "background").
Cu toate acestea, acesta nu mai este vizibil pentru utilizator și poate fi închisă de sistem atunci când este
nevoie de memorie în altă parte.
În cazul în care o activitate este întreruptă sau oprită, sistemul poate scădea din memorie, fie prin
solicitarea ca aceasta să se termine (apelul metodei finish ()), sau pur și simplu închiderea procesului.
Când activitatea este deschisă din nou (după ce a fost terminată sau închisă), acesta trebuie să fie creaţă
peste tot.
3. Fragments
14
(sursă : http://developer.android.com/guide/components/fragments.html )
Într-o activitate se pot combina mai multe (obiecte de tip) fragmente pentru a construi o
interfaţă grafică, iar un fragment poate fi utilizat în mai multe activităţi. Ciclul de viaţă al unui obiect de
tip Fragment este similar cu cel al unui obiect de tip Activity. Pentru a adăuga un obieect de tip
Fragment la o nouă activitate se poate proceda în două moduri:
În acest caz se specifică propietatile fragmentului la fel ca pentru un view. De exemplu pentru o
activitate cu două fragmente vom avea:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_height="match_parent">
<fragment class="com.example.android.apis.app.FragmentLayout$TitlesFragment"
android:id="@+id/titles" android:layout_weight="1"
android:layout_width="0px" android:layout_height="match_parent" />
</LinearLayout>
După cum se observă, fiecare fragment trebuie să aibă un identificator unic pentru ca atunci când
activitatea este repornită, sistemul să poată restaura fragmentul.
În orice moment, în timp ce activitatea se execută, se poate adăuga fragmente la activitate. Trebuie doar
se fie specificat ViewGroup-ul la care se adaugă.
Pentru a putea face diferite acţiuni cu fragmente într-o activitate (adăugare, ştergere sau înlocuire)
trebuie să folosim API-ul FragmentTransaction. O instanţă de FragmentTransaction se poate obţine
astfel:
Pentru a adăuga un fragment se foloseşte metoda add () specificând fragmentul de adăugat şi view-ul în
care se doreşte adăugarea. Spre exemplu:
15
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
Se poate adăuga un fragment care să conţină operaţii de background, nu doar componente grafice.
Acest lucru se face tot cu ajutorul metodei add (Fragment, Strâng) oferind însă un strâng de identificare
unic în loc de id-ul view-ului.
4. Services
O componentă a unei aplicație poate începe un serviciu și va continua să ruleze în fundal, chiar dacă
utilizatorul trece la altă aplicație.
5. Content Providers
Obiectele de tip Content Providers gestionează accesul la un set structurat de date. Acestea
încapsulează datele şi pune la dispoziţie mecanisme de definire a securităţii datelor. Obiectele Content
Providers sunt interfeţe standard care conectează datele dintr-un proces cu codul care rulează într-un
alt proces. Unele elemente de bază ale sistemului Android conţin componente de tip ContentProvider
pentru a face datele disponibile altor aplicaţii.
Datele puse la dispoziţie de un anumit furnizor sunt accesate folosind un obiect de tip
ContentResolver. Acesta este un obiect client care asigură operaţii de creare, citire, update şi ştergere
asupra datelor din ContentProvider.
Datele gestionate de un obiect de tip ContentProvider pot fi: audio, video, imagini şi fişiere de
baze de date SQLite.
Android SDK
Android SDK reprezintă o colecţie de software şi de tool-uri specifice cu ajutorul cărora se pot dezvolta
aplicaţii pentru sistemul de operare Android. Această colecţie poate fi descărcată separat prin
intermediul SDK Manager-ului.
(sursă : http://developer.android.com/sdk/exploring.html )
SDK Platform Există o platforma SDK pentru fiecare versiune de Android <sdk>/platforms/
lansată, care poate fi aleasă ca și platformă țintă pentru <android-
aplicații. version>/
System Images Fiecare platformă oferă una sau mai multe imagini sistem <sdk>/platforms/
pentru procesoarele ARM sau X86.Aceste imagini sistem <android-
sunt necesare emulatorului de Android pentru a putea rula. version>/
Samples for SDK Exemple care ilustrează funcționalitațile diverselor API-uri <sdk>/platforms/
de Android. <android-
version>/samples
/
Google API Pachet special ce permite unei aplicații să apeleze servicile <sdk>/add-ons/
oferite de Google prin intermediul Google API.
Android Support Librarie de suport care poate fi inclusă în aplicații pentru a <sdk>/extras/and
putea oferii acestora funcționalități disponibile unui nivel roid/support/
API superior în cazul în care acestea trebuie să ruleze pe o
versiune de Android mai nouă.
Google Play Billing Librărie statică care permite integrarea unui serviciu de <sdk>/extras/goo
taxare în aplicații. gle/
Facebook SDK oferă o soluţie simplă şi rapidă pentru a integra uşor platforma de socializare cu aplicaţiile
dezvoltate pentru sistemul de operare Android. Acest SDK oferă suport pentru autentificarea în cadrul
17
aplicaţiei cu datele unui utilizator al platformei de socializare, manipularea obiectelor prezente în API-ul
Facebook precum şi suport pentru componentele interfeţei grafice specifice.
Graph API este principala modalitate de a adăuga şi extrage date din platformă de socializare. Cu
ajutorul acestui API este posibilă interogarea datelor, încărcarea pozelor şi multe alte activităţi necesare
unor aplicaţii ăla acestei platforme.
ADT este un mediu de dezvoltarte Eclipse care are integrat SDK-ul de Android.
Eclipse este un mediu de dezvoltare software folosit pentru a scrie aplicaţii în Java. Este structurat sub
forma unei ierarhii de plugin-uri care asigură diferite funcţionalităţi.
ADT a fost creat pentru a facilita dezvoltarea aplicaţiilor destinate dispozitivelor care rulaeaza sistemul
de operare Android. Acesta extinde capabilităţile mediului de dezvoltare Eclipse, oferind în plus
posibilitatea de a proiecta interfeţe grafice special
Tot cu ajutorul acestui tool se poate adăuga noi versiuni de API precum şi crearea unor emulatoare
pentru a putea instala aplicatile create. După cum se observa, din componenta Android SDK Manager se
poate instala versiunea de API dorită pentru a dezvolta aplicaţia.
18
Pentru a testa aplicaţia se poate opta fie pentru a utiliza un dispozitiv mobil fie prin a crea un dispozitiv
virtual care simulează toate aproape toate caracteristicile unui dispozitiv mobil.
Dezvoltarea aplicaţiei
În acest capitol vom prezenta structura aplicației , cum funcționează aceasta și elementele folosite
pentru dezvoltarea ei.
Structura aplicației
Interfața aplicației cuprinde 7 ferestre. Când este lansată aplicația se afișază activitatea principala
(MainActivity). Această activitate conține un intent care este folosit pentru a obține date de la aplicația
Facebook utilizate pentru a se putea realiza conexiunea la contul deja autentificat în aplicație. Tot din
această activitate principală se vor putea accesa celelalte ferestre ale aplicației. Astfel se v-a putea
ajunge la fereastra care permite selectarea prietenilor. Dupa selectarea prietenilor pentru care se
dorește să se facă topul preferințelor , o alta fereastra v-a fi afișată ,iar din aceasta se va putea alege
topul care se dorește a fi vizualizat. Pentru fiecare top va fi deschisă alta fereastra în care acesta va fi
afișat. Navigarea în aplicație se va face cu ajutorul butoanelor prezente în fiecare fereastră.
19
Figură 8 Ferestrele aplicației
Figura de mai sus ne prezintă cele 7 activități și posibilitatea de a naviga printre acestea. Pentru
a putea face legătura între cele 7 activități am folosit obiecte de tip Intent. Aceste obiecte conțin
informații pentru a putea conecta două componente ale aplicației. Intent-ul creat conține doi
parametrii : clasa din care este apelat intent-ul respectiv și clasa căruia sistemul ar trebui să transmită
intent-ul.
Obiectul intent este apelat din clasa MainActivituy și este transmis clasei select_preferences.
O activitate nouă este lansată cu ajutorul comenzii startActivity() care primeste ca parametu un
Intent. Sistemul primește apelul și pornește o instamță a Activity-ului specificat de intent.
În continuare vom prezenta Activity-urile și clasele declarate, evidențiind felul în care acestea se
leagă între ele. Aceasta aplicație folosește anumite obiecte prezente în SDK–ul oferit de Facebook
dezvoltatorilor și vor fi folosite ca atare , precizându-se scurt principalele lor caracteristici.
MainActivity
Această activitate este lansată la prima interacțiune a utilizatorului cu aplicația. Din cadrul
acestei ferestre pot fi accesate celelalte activități ale aplicației , și anume selectarea prietenilor pentru
care se dorește să se alcatuiască topul preferințelor și afișarea acestui top. (informații despre versiunea
curentă a aplicației).
20
În această fereastră utilizatorul poate efectua doua acțiuni prin intermediul a două butoane.
Prima acțiune accesată prin butonul Pick Friends lansează o nouă activitate care permite selectarea
prietenilor in listă. A doua acțiune disponibila prin butonul Show Top 10 Preferences lansează o nouă
acțiune care la randul ei are mai multe opțiuni de a alege topurile dorite.
Întrucât din această fereastră se face navigarea către alte doua Activity-uri au fost definite doua
butoane cărora li s-a asociat un listener care la apasarea butonului face trecerea la activitatea noua
precizată prin obiectul Intent.
21
PickFriendsActivity
Această clasă utilizează FriendPickerFragment pentru a afișa lista de prieteni a utilizatorului. Metoda
populateParameters() este folosita pentru a popula ce dorim sa transmitem obiectului
FriendPickerFragment.
În această clasă în metoda suprascrisă onStart() folosim un obiect FriendPickerApplication care contine o
listă de utilizatori (GraphUser).
În această metodă se apeleaza loadData() din clasa FriendPickerFragment care la randul ei seteaza lista
lista de prieteni cu obiectele preluate cu ajutorul Graph API
Select_preferences
Această activitate este apelată tot din MainActivity și cuprinde 5 butoane care permit lansarea unei noi
activitați. Acete butoane sunt :
22
Figură 13 Figura 3.6 Declarearea butoanelor clasei Select_preferences
Această navigare către celelalte ferestre se face tot cu ajutorul unui listener pentru fiecare buton care
transmite obiectul de tip Intent.
Show_top
Aceste 5 activitați conțin un obiect ListView și un obiect UserDataSource care conține informațiile
salvate anterior. Prin parcurgerea obiectelor UserDataSource sunt inserate in ListView valorile
elementelor în funcție de topul la care se referă. Acest lucru este realizat în metoda onCreate() cand
este lansată activitatea.
Persisiența datelor
Pentru a stoca preferințele utilizatorilor selectați s-a folosit SQLite . Aceste preferințe sunt salvate după
ce sunt selectați prietenii din lista cu ajutorul metodei getFriendsLikes() din MainActivity.
23
În cadrul acestei metode după ce ne asiguram că sesiunea este deschisă , pentru fiecare prieten
din listă este apelat fqlQuery = "SELECT movies,books,music,tv,games FROM user where uid ="+
names.get(i); Acest query este transmis în request împreună cu metoda
parsePagesFromGRAPHResponse();
Aceasta metoda dupa cum se observa foloseste un obiect JSON si un array JSON cu ajutorul carora
parseaza datele obtinute din bundle-ul transmis. Dupa ce se parseaza , datele necesare sunt introduse
intr-un array de String-uri . Dupa un obiect de tipul respectiv este inserat in baza de date cu functia
insert.
MySQLiteHelper
Aceasta clasa este folosita pentru a defini modelul bazei de date . Pentru inceput sunt definite
numele bazei de date precum și versiunea.
Tabelele bazei de date au fost definite cu doua coloane , respectiv id si nume. Au fost create
tabelele table_movies, table_music, table_books, table_tv si table_games.Pentru a fi create a fost
executate comanda execSQL.
24
Figură 16 Crearea tabelelor din BD
UserDataSource
În aceasta clasa sunt executate operatiile asupara bazei de date . Aceste operatii sunt folosite
atat in MainActivity cat si in Activity-urile in care sunt introduse datele in ListView-uri si afisate
utilizatorului.
Pentru fiecare dintre cele 5 date pe care doream sa le obtinem am efectuat operatii de insert si
extragere . Vom prezenta aceste operatii pentru tabela movies , celelealte fiind similare .
Aceasta metoda insereaza un obiect de tip movies transmis ca parametru. In caoloanele declarate in
MySQLiteHelper inseram valorile preluate din obiectul transmis ca parametru.
Metoda insert() este apelata in MainActivity dupa ce s-a efectuat parsarea inserând in tabela
corespunzatoare obiectul respectiv.
25
Figură 18 Inserarea apelata in MainActivity
Metoada de extragere este folosita pentru a afisa elementele dorite. Aceasta foloseste urmatoarea
interogare pentru a extrage primele 10 elemente din lista ordonate dupa numarul lor de apariții , luate
descrescator:
String sql = "SELECT name from movies GROUP BY name ORDER BY count(name) desc limit 10";
Acest query returneaza un obiect de tip Cursor . Un Cursor reprezinta rezultatul unui query si pointeaza
un rand din rezultatul intors de query. In acest fel , sistemul Android trateaza rezultatele intoarse de
query-uri eficient , nefiind nevoie de a salva toate datele in memorie
Pentru a ne deplasa intre diferite randuri ale rezultatului putem folosi metodele moveToFirst() si
moveToNext() . Metoda isAfterLast() permite verificarea sfarsitului rezultatelor.
Fișiere de resurse
Pe langa clasele prezentate pana acum , un proiect Android conține și multe fișiere de resurse. Aceste
sunt folosite pentru a construi interfața grafica a aplicației sau pentru a face referire la anumite variabile
care au o valoare constantă.
AndroidManifest.xml
26
Fiecare aplicatie trebuie sa aiba un fisier AndroidManifest.xml in radacina proiectului. Acest
fisier manifest prezinta informatii esentiale despre aplicatie sistemului de operare Android, informatii pe
care sistemul trebuie sa le aiba inainte sa poata rula codul aplicatiei. Printre alte lucruri , in fisierul
manifest se gasesc urmatoarele :
Declara ce permisiuni trebuie sa aiba aplicatia pentru a putea accesa parti protejate ale API-ului si sa
interactioneze cu alte aplicatii
Declara si ce permisiuni trebuie sa aiba alte aplicatii pentru a putea sa interactioneze cu aplicatia.
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>
Android pune la dispoziție un limbaj XML care cuprinde subclase ale View si ViewGroup. Pe baza
acestora se pot defini elemente de interfață folosint XML .
27
Figură 20 Ierarhia View si ViewGroup
View-urile sunt widget-uri ale interfetei cu utilizatorul ca de exemplu butoane , campuri text, etc.
Aceste view-uri au atribute pe baza carora se poate configura aspectul si comportamentul lor.
Un ViewGroup este responsabil pentru aranjarea celorlalte View-uri , acesta mai fiind cunoscut si ca
layout manager .Clasa de baza pentru acest layout manager este android.view.ViewGroup care extinde
la randul ei android.view.View , clasa de baza a View-urilor.
Interfetele cu utilizatorul ale unei activitati sunt de obicei descrise cu ajutorul unui fisier XML (layout
files) . Aceste pot fi construite și prin intermediul grafic , Android punand la dispozitie un set de View-
uri (Custom & Library Views) , propietatile putand fi setate din tabelul Properties , fara a fi nevoie de
editarea fisierului XML.
28
Figură 21 Custom & Library Views si Properties
main.xml
Acest fisier construieste interfata pentru MainActivity , activitatea cu care se lanseaza aplicația. Are la
baza un RelativeLayout care are setat ca background o imagine referita in alt fisier de resurse , si anume
drowable.
pick_friends_activity.xml
Acest layout contine un FrameLayout care face referire la fragmentul oferit de Facebook care permite
selectarea prietenilor.
android:id="@+id/friend_picker_fragment"
select_preferences.xml
Pentru acest layout s-a folosit un RelativeLayout si cuprinde 5 butoane , fiecare buton avand propietatea
android:background setate cu o referire la fisierul back_button.xml din drawable care contine unele
caracteristici ale unui buton ca forma , culoare si asezarea acestuia.
29
Figură 23 Layout select_preferences
activity_list_view.xml
Acest layout contine un View de tip ListView pentru a afisa topul respectiv.
Aceste layout-uri sunt referite in cadrul activitatilor principale in metodele suprascrise onCreate().
setContentView(R.layout.main);
setContentView(R.layout.pick_friends_activity);
setContentView(R.layout.select_preferences);
30
setContentView(R.layout.activity_list_view);
Un alt fisier de resurse important se gaseste în folderul values. Acesta conține pe lângă numele aplicației
și un identificator unic oferit de Facebook.
Pentru a putea folosi functionalitațile oferite de Facebook SDK este necesară înregistrarea pe platforma
de socializare a unui cont de dezvoltator. În acest cont trebuie sa înregistram un HashKey generat de un
tool prezent în Android SDK. Pentru aceasta aplicatie , generarea HashKey-ului s-a facut în cadrul clasei
MainActivity în metoda onCreate() prin adaugarea urmatorului cod:
31
Figură 26 Generare HashKey
Dupa ce acest cod este generat , el se adauga in tabul Sample App din contul de dezvoltator al
platformei Facebook.
Urmatorul pas il constituie crearea aplicatiei , acest lucru facandu-se astfel 'Apps' > 'Create a New App':
Dupa ce ste creata aplicatia va aparea codul aplicatiei care trebuie introdus in fisierul de resurse
strings.xml .
32
Pentru aplicatia creata de la Settings va trebui sa adaugam platforma pe care dorim sa o folosim. În acest
caz am adaugat Android și am introdus numele pachetului folosit și al activitații principale.
Nu în ultimul rând atrbuie să trimitem o cerere pentru a putea folosi toate facilitațile platformei
Facebook. Odata aprobata aceasta cerere , aplicația dezvoltată poate beneficia de toate serviciile
implementate cu ajutorul Facebook SDK.
33
Figură 30 Cerere pentru aprobarea folosirii conținutului Facebook
Concluzii
Această aplicație mi-a oferit ocazia studierii unei tehnologii foarte populare și pentru care în
urmatorii ani se prognozează creșterea folosirii acestora. Aplicațiile pentru sistemul de operere Android
au un numar foarte mare de utilizatori , mai ales cele cu specific social.
Am reușit să înțelg principalele componente ale sistemului Android cât și principalele modalitați
de utilizare ale resurselor puse la dispoziție dezvoltatorilor de platforma de socializare Facebook.
În momentul finalizării redactarii acestui document , aplicația se afla într-o stare ce îi conferă
utilitate , putând-i fi aduse îmbunatațiri. Printre viitoarele dezvoltari ulterioare , cele mai importante ar
putea fi :
Adaugarea unui buton care să permită selectarea tuturor prietenilor din listă.
Afișarea unui grafic care să permita vizualizarea numarului de prieteni care au dat like la elementele din
top.
În concluzie , consider că am reușit să îndeplinesc obiectivul prezentat la începutul lucrarii , iar aplicația
prezentată implementează facilitățile enumerate. În forma ei actuala această aplicație poate fi folosită
de utilizatorii rețelei de socializare Facebook care au deja aplicația de socializare instalata și sunt
34
autentificați. Acestia pot , cu ajutorul aplicației prezentate, să selecteze prietenii pentru care doresc să
afle ce preferințe au și să vizualizeze preferințele lor pentru urmatoarele lucruri : carți , filme , muzică ,
seriale și jocuri. După ce vor fi adaugate funcționalitațile prezentate ca dezvoltări ulterioare , aplicația va
fi publicată în magazinul virtual Google Play deoarece , după cum am menționat la începutul acestei
lucrari , lipsește o astfel de aplicație.
Lista tabelelor
Lista figurilor
ANEXE
Bibliografie
[1] STEE2010 STEELE James , TO Nelson , The Android Developer’s Cookbook Building
Application with the Android SDK , Addison-Wesley , Crawfordsville , 2010
36