București, 2019 Universitatea POLITEHNICA din București [613321]
București, 2019 Universitatea POLITEHNICA din București
Facultatea de Electronică, Telecomunicații și Tehnologia Informației
Aplicație mobilă Android de tip Memento pentru
gestionarea activităților unei persoane
Lucrare de licență
Prezentată ca cerință parțială pentru obținerea
titlului de Inginer
în domeniul Electronică, Telecomunicații și Tehnologia Informației
programul de studii Tehnologii și Sisteme de Telecomunicaț ii
Conducător științific
Ș. L. Dr. Ing. Șerban OBREJA
Absolvent: [anonimizat]
2
3
4
5
6
7
Cuprins
CUPRINS ………………………….. ………………………….. ………………………….. ………………………….. ………….. 7
LISTA FIGURILOR ………………………….. ………………………….. ………………………….. …………………….. 8
LISTA ACRONIMELOR ………………………….. ………………………….. ………………………….. ……………… 9
INTRODUCERE ………………………….. ………………………….. ………………………….. …………………………. 11
Contextul actual ………………………….. ………………………….. ………………………….. …………………………. 11
Scopul proiectului ………………………….. ………………………….. ………………………….. ………………………. 12
Structura proiectului ………………………….. ………………………….. ………………………….. …………………… 13
1 FUNDAMENTE TEORETICE ………………………….. ………………………….. …………………………. 15
1.1 Android ………………………….. ………………………….. ………………………….. ………………………….. …. 15
1.1.1 Descrierea hardware ………………………….. ………………………….. ………………………….. ……… 15
1.1.2 Sistemul de operare Android ………………………….. ………………………….. ……………………… 18
1.1.3 Componentele aplicațiilor Android ………………………….. ………………………….. …………….. 19
1.2 Java ………………………….. ………………………….. ………………………….. ………………………….. ………. 24
1.2.1 Limbajul de programare Java ………………………….. ………………………….. …………………….. 24
1.2.2 Execuția unui program Java ………………………….. ………………………….. ………………………. 26
1.2.3 Structura unui program Java ………………………….. ………………………….. ………………………. 28
1.2.4 Avantajele limbajului de programare Java în programarea pe Android ………………….. 29
2 STUDIU DE CAZ ………………………….. ………………………….. ………………………….. …………………. 31
2.1 Aplicația “Memento” ………………………….. ………………………….. ………………………….. ………… 31
2.1.1 Descrierea aplicatiei ………………………….. ………………………….. ………………………….. ……… 31
2.1.2 Baza de date ………………………….. ………………………….. ………………………….. …………………. 31
2.1.3 Clasele de activități ………………………….. ………………………….. ………………………….. ………. 33
2.1.4 Alte clase utilizate în realizarea aplicației ………………………….. ………………………….. …… 42
2.1.5 Fișierele XML și Manifestul ………………………….. ………………………….. ……………………… 45
CONCLUZII ȘI PROPUNE RI PENTRU DEZVOLTARE A APLICAȚIEI …………………….. 51
BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. …………………………. 53
8
Lista Figurilor
Figura 1 – Telefoane mobile cu sistem de operare Android (Smartphone -uri) [3] ………………………….. …. 11
Figura 2 – Arhitectura MCP [8] ………………………….. ………………………….. ………………………….. ……………. 16
Figura 3 – Structura sistemului de operare Android [12] ………………………….. ………………………….. ……… 19
Figura 4 – Conceptul de obiect [19] ………………………….. ………………………….. ………………………….. ……… 26
Figura 5 – Procesul prin care se interpretează și execută un program Java [14] ………………………….. ……. 27
Figura 6 – Arhitectura JVM [14] ………………………….. ………………………….. ………………………….. …………… 28
Figura 7 – Previzualizar ea aplicației Memento ………………………….. ………………………….. …………………… 31
Figura 8 – Metoda prin care se creează un tabel în baza de date ………………………….. ……………………….. 32
Figura 9 – Metodele de inserare și actua lizare a bazei de date ………………………….. ………………………….. 32
Figura 10 – Metode pentru încărcarea și afișarea datelor ………………………….. ………………………….. ……. 33
Figura 11 – Metodă pentru inițializare / actua lizare date ………………………….. ………………………….. …….. 34
Figura 12 – Metodă de salvare și verificare a datelor introduse ………………………….. …………………………. 35
Figura 13 – Mesajul de eroare pentru câmpul de Edi tText ………………………….. ………………………….. …… 36
Figura 14 – Mesajul de notificare „Încearcă din nou ” afișat prin Toast ………………………….. ………………. 36
Figura 15 – Mesajele de notificare a activității actualizate / adăugate prin Toast ………………………….. …. 37
Figura 16 – Metode de formatare a datei și a orei ………………………….. ………………………….. ………………. 38
Figura 17 – Metoda prin care se setează d ata în EditText ………………………….. ………………………….. ……. 38
Figura 18 – Metoda prin care se afișează DatePickerDialog ………………………….. ………………………….. …. 39
Figura 19 – Interfața DatePicker -ului pe ecranul tel efonului ………………………….. ………………………….. … 39
Figura 20 – Metoda prin care se setează ora în EditText ………………………….. ………………………….. ……… 40
Figura 21 – Metoda prin care se afișează TimePickerDialog ………………………….. ………………………….. …. 40
Figura 22 – Interfața TimePicker -ului pe ecranul telefonului ………………………….. ………………………….. … 41
Figura 23 – Metode de creare a Cursorilor pentru cele trei categorii de liste ………………………….. ………. 42
Figura 24 – Clasa ConversionFunction și metodele sale ………………………….. ………………………….. ………. 43
Figura 25 – Metoda de preluare a datelor din clasa ListAdapter ………………………….. ……………………….. 43
Figura 26 – Clasa NoScrollListView și metodele sale ………………………….. ………………………….. …………… 44
Figura 27 – Fișierul AndroidManifest.xml ………………………….. ………………………….. …………………………. 45
Figura 28 – Structura Linear Layout din MainActivity ………………………….. ………………………….. ………….. 46
Figura 29 – Elementul de tip ProgressBar ………………………….. ………………………….. …………………………. 46
Figura 30 – Structura elementului de tip TextView pentru categoria “Astăzi” ………………………….. ……… 47
Figura 31 – Structura Elementului CardView în care este inclus NoScrollListView ………………………….. … 48
Figura 32 – Structura elementului Toolbar ………………………….. ………………………….. ……………………….. 48
Figura 33 – Structura elementului ImageView folosit ca „înapoi” din meniul de adăugare …………………. 49
Figura 34 – Structura elementului ImageView folosit ca „salvare” din meniul de adăugare ………………… 49
Figura 35 – Structura elementelor EditText pentru metodele de TimePicker și DatePicker ………………… 49
Figura 36 – Structura elementului EditText pentru scrierea titlului notiței ………………………….. ………….. 50
Figura 37 – Structura elementelor TextView din li stă………………………….. ………………………….. ………….. 50
9
Lista acronimelor
CDMA – Code Division Multiple Acces
GSM – Global System for Mobile Communication
GPS – Global Positioning System
ARM – Advanced RISC Machine
NAND – Not AND
RAM – Random Acces Memory
MCP – MultiChip Package
SD – Secure Digital
USB – Universal Serial Bus
VM – Virtual Machine
SMS – Short Message Service
API – Application Programming Interface
URI – Uniform Resource Identif ier
OS – Operating System
PC – Programming Computer
ASCII – American Standard Code for Information Interchange
ME – Micro Edition
SQL – Structured Query Language
XML – eXtensible Markup Language
10
11
Introducere
Contextul actual
Telefoanele mobile au adus o schimbare majoră în viața de zi cu zi a oamenilor încă de la
apariția lor pe piață. Un telefon mobil este un dispozitiv car e funcțione ază fără intermediul unui
fir, pe baza rețelelor de tip CDMA sau GSM și are ca scop principal stabilirea unei comunicații
între persoane la o distanță mare [ 1].
De-a lungul timpului , tehnologiile folosite pentru operarea acestor dispozitive mobi le au
evoluat foarte mult atingând performanțe de top, acestea numindu -se ulterior smartphone -uri. Un
smartphone reprezintă un telefon mobil c are poate îndeplini mai multe funcții speciale printre
care putem enumera calendar, agendă telefonică, calculator științific, cameră foto precum și un
sistem de navigare prin GPS, aducând astfel o mulțime de opțiuni utilizatorului, permițând
oamenilor să -și desfășoare activitatea zilnică într -un mod mai practic și mai ușor [2].
Figura 1 – Telefoane mobile cu sistem de operare Android (Smartphone -uri) [3]
În acest sens au fost dezvoltate diverse aplicații mobile care acoperă o arie vastă de
domenii de activitate ce au ca scop realizarea obiectivelor pentru care au fost create. Ace ste
obiective au fost atinse din ce în ce mai eficient odată cu creșterea popularității telefoanelor în
rândul utilizatorilor, stârnind dorința producătorilor de a satisface nevoile pieței.
12
În ziua de azi , unul dintre cele mai populare sisteme de operare pentru dispozitivele
mobile este Android . Android -ul este un sistem de operare și totodată o platformă software1
dedicată dispozitivelor mobile ce se bazează pe nucleul Linux conceput de compania Google și
dezvoltat ulterior de Open Handset Alliance. Dispo zitivele ce folosesc Android sunt controlate
prin intermediul bibliotecilor Java create de către Google [ 4].
În rândul utilizatorilor, Android ocupă primul loc la nivelul pieței. Un studiu realizat de
StatCounter prin analiză web arată că Android a depășit sistemul de operare Windows în martie
2017, lucru ce pune capăt conducerii acestuia încă din anii 1980 [6]. În dezvoltarea acestui sistem
de operare este folosit limbajul de programare Java, acesta fiind un limbaj versatil, lucru ce aduce
o multitudine de opțiuni in ceea ce privește realizarea de aplicații.
Scopul proiectului
Tema proiectului de licență se numește “Aplicație mobilă Android de tip Memento pentru
gestionarea activităților unei persoane” . Motivul alegerii acestei teme a fost acela de a permi te
oamenilor să -și înregistreze evenimente din programul lor zilnic (de exemplu: zilele libere
planificate pentru concediu, evenimente sociale la care trebuie să participe, ședințele de la locul
de muncă etc.) pentru a le putea gestiona mai ușor .
Subiectul pe care doresc să îl abordez în lucrarea mea presupune realizarea unei aplicații
pentru dispozitivele mobile ce va trimite către utilizatori diverse alarme și notificări pentru a -i
avertiza cu privire la apropierea termenelor dif eritelor activități progra mate.
O aplicație reprezintă o colecție de programe informatice având același scop scrise sub
forma mai multor algoritmi de tip cod sursă. Acești algoritmi sunt concepuți într -un limbaj de
programare specific ce permite programatorului să descrie amănunțit modul în care trebuie s ă
funcționeze aplicația [ 7].
Scopul aplicației proiectului este de a avea o privire de ansamblu asupra programului pe
care o persoană îl are de realizat și gestionarea rapid ă și eficient ă a acestuia. Proiectarea aplicației
s-a real izat folosind mediul de dezvolt are Android Studio ce utilizează limbajul de programare
Java iar rularea acesteia va avea loc pe un dispozitiv mobil ce folosește sistemul de operare
Android.
1 sistem de programe pentru calculatoare ce includ procedurile lor de aplicare [5]
13
Acest proiect cuprinde două aspecte importante și anume: gestionar ea rapidă și eficientă a
activităților unei persoane în viața de zi cu zi în vederea realizării acestora în timp util și totodată ,
dezvoltarea unei aplicații pe o platformă pentru dispozitivele mobile folosind cunoștinte în
limbajul de programare Java.
Structura proiectului
Lucrarea de licență a fost dezvol tată și structurată în 2 capitole la care se va adăuga
bibliografia.
Introducere cuprinde informații despre contextul actual în ceea ce privește apariția și
dezvoltarea dispozitivelor mobile și a aplicaț iilor specifice acestora bazate pe sistemul de operare
Android . De asemenea , în primul capitol este realizată descrierea lucrării, evidențiindu -se scopul
pentru care a fost conceput proiectul de față și totodată structura acestuia.
Capitolul 1 – Fundamente teoretice conține informații referitoare la p latfoma hardware
și a sistemului de operare bazat pe Android precum și componentele importante care stau la baza
creării aplicațiilor acestuia. De asemenea , în acest capitol este consolidat și limbajul de
progr amare Java ce descrie multitudinea de posibilități în crearea aplicațiilor pe platforma
Android.
Capitolul 2 – Studiu de caz oferă o privire de ansamblu asupra aplicației pe care am
dezvoltat -o. Sunt puse în evidență clase, obiecte și metode ce stau la baz a funcționării aplicației
precum și detalii legate de asamblarea interfeței de utili zator și legarea acesteia prin fișierele
.xml.
14
15
1 Fundamente teoretice
1.1 Android
În acest capitol se vor prezenta diferite informații ce fac referire la detalii despre par tea
hardware cât și partea software a sistemului de operare Android, precum și principii importante
ce stau la baza creării aplicațiilor pentru dispozitivele ce folosesc acest sistem.
1.1.1 Descrierea hardware
Android a fost conceput pentru a rula pe mai multe tipuri de dispozitive diferite, de la
telefoane până la tablete și televizoare. Ca și programator, domeniul de diversitate al
dispozitivelor aduce o audiență cu potențial uriaș pentru aplicații. Pentru ca ap licațiile să fie de
succes pen tru toate dispoziti vele, aceastea trebuie să tolereze anumite variații de facilități și să
aducă o interfață de utilizator care să se poată adapta la diferite configurații de ecrane. Din acest
motiv, compatibilitatea Android -ului cu o gamă largă de componente hardware define ște o
caracteristică importantă a acestuia privind capacitate a producătorului de a mulțumi majoritatea
consumatori lor [9].
Primele dispozitive Android foloseau în structura lor procesoare de tip ARM, acestea
fiind destul de puternice și având un consum re dus de energie. Ulterior, unele companii au d ecis
să folosească procesoarele proprii ( ex.: Intel a creat propriul procesor numit Atom). Odată cu
evoluția tehnologiei , producătorii au adăugat telefoanelor și componente separate de modem
baseband și radio pe ntru gestionarea eficientă și performantă a comunicației mobile, sisteme ce
furnizează dispozitivelor Android transferuri de voce cât și de date [8].
Smartphone -urile facilitează două tipuri de memorie: memorie nevolatilă de tip flash
NAND și memorie cu a cces aleator RAM. Memoria de tip flash este utilizată pentru stocarea
datelor utilizatorului și a sistemului de operare , iar memoria RAM este utilizată de sistem pentru
a încărca, manipula și executa diferite părți ale sistemului de operare. Datorită spați ului restrâns
care este oferit pe dispozitivele mobile, cele două tipuri de memorie sunt asamblate într -o
componentă unică numită pachet multicip MCP [8].
16
Figura 2 – Arhitectura MCP [8]
Astfel, putem spune că două caracteristici importante pentru autonomia dispozitivelor
mobile sunt conservarea energiei acumulatorului și folosirea eficientă a resurselor de memorie
pentru componentele hardware.
O altă componentă hardware importantă este sistemul de poziționare globală GPS,
componentă care face parte din pachetul de bază Android. Acesta este utilizat pentru identificarea
locației telefonului prin sateliți GPS și de asemenea permite aplicațiilor sa acceseze și să
folosească aceste informații.
Android m ai permite pe lângă accesul la telefonia mobilă și conectarea la internet prin
intermediul opțiunii Wireless și totodată , conectarea la alte dispozitive mobile sau externe prin
intermediul opțiunii Bluetooth.
Majoritatea telefoanelor prezintă un slot2 pentru a atașa un card de memorie cunoscut sub
numele de card SD (Secure Digital). Aceste carduri au aceeași structură ca memoria nevolatilă ce
folosește tehnologia flash NAND. De asemenea , cardurile au anumite caracteristici fizice ce oferă
2 fantă specială pentru ins erarea cardului de memorie într -un dispozitiv mobil
17
posibilitatea de a fi folosite în cadrul mai multor dispozitive. Astfel , Android oferă utilizatorilor o
soluției atât practică cât și ieftină în ceea ce privește partajarea datelor între consumatori.
Un rol important în interacțiunea cu utilizatorul o constituie interfața s istemului de
operare ce poate fi accesată prin intermediul ecranului, aspect ce oferă un impact vizual cât și
fizic prin răspunsul oferit la atingere. Ecranul dispozitivelor este o componentă în continuă
evoluție, dezvoltatorii urmărind mărirea capacității de răspuns la stimuli i externi precum și a
rezoluției acestuia.
Camera telefonului este o altă componentă hardware care a evoluat din punct de vedere al
funcționalității și al ariei de utilizare. Majoritatea telefoanelor folosesc funcționalitatea camerei în
combinație cu alte aplicații, interacționând cu coordonatele oferite de GPS sau data și ora la care
s-a efectuat o poză sau un video. Aceste date multimedia se pot partaja cu alți utilizatori foarte
ușor, în special prin intermediul internetului. O altă utilizare interesantă a camerei este în
domeniul realității augmentate, componenta reușind să scaneze produse pe baza codului de bare
sau să găsească diverse imobile după coordonatele geografice.
Tastatura de la telefoanele vechi a fost înlocuită de tehno logia touch screen, tehnologie
care are acces la predicția cuvintelor ce urmează să fie scrise și de asemenea , are suport pentru
utilizarea mai multor limbi.
Consumul mare de energie al aplicațiilor pe dispozitivele ce utilizează Android reprezintă
o probl emă importantă privind durata de viață a bateriei. În acest moment se dorește
implementarea unei soluții pentru acest neajuns prin crearea unor baterii mai puternice sau prin
încărcarea telefoanelor fără intermediul unui cablu, prin Wireless.
Mare parte a dispozitivelor Android oferă suport USB (Universal Serial Bus) prin
intermediul căruia telefoanele se pot conecta la un calculator. Prin această modalitate se poate
realiza accesul la memoria SD cât și înc ărcarea bateriei telefonului.
O altă componentă har dware o reprezintă accelerometrul, componentă ce detectează
mișcările dispozitivului și poate roti poziția ecranului după felul în care este ținut telefonul .
Versiunile noi de telefoane au în pachet și un giroscop, o componentă mai senzitivă decât
accelero metrul ce a ajutat la extinderea jocurilor și la nivelul dispozitivelor mobile.
18
Ultimele componente hardware cu un impact important asupra telefoanelor o reprezintă
microfonul și difuzorul. Anumite dispozitive posedă mai multe microfoane ce au capacitatea de a
detecta și elimina eventualele zgomote de fundal , oferind utilizatorului o calitate a sunetului
superioară.
1.1.2 Sistemul de operare Android
Android este un sistem de mai mulți utilizatori bazat pe nucleul Linux, fiecare aplicație
reprez entând un utilizat or diferit. În mod normal, sistemul atribuie fiecărei aplicații un ID de
utilizator unic cunoscut doar de către acesta și setează permisiunile pentru toate fișierele din
aplicație astfel încât doar utilizatorul cu respectivul ID să le poată accesa. Fiecare proces are
propria mașină virtuală (VM) astfel încât , codul fiecărei aplicații să ruleze izolat de celelalte
aplicații. În mod normal, fiecare aplicație are propriul proces Linux. Sistemul Android pornește
procesul atunci când oricare din componentele apl icației trebuie să fie executat ă și oprește
procesul când nu mai este nevoie de el sau când sistemul trebuie să -și folosească memoria pentru
alte aplicații [10].
Sistemul de operare Android implementează principiul celui mai puțin privilegiat , prin
care „ fiecare program și fiecare utilizator privilegiat al sistemului ar trebui să opereze folosind cel
mai mic privilegiu necesar pentru a -și termina treaba” [11] . În acest mod, fiecare aplicație are
acces doar la componentele de care are nevoie pentru a -și înd eplini sarcina și nimic mai mult.
Acest aspect creează un mediu foarte securizat în care aplicația nu poate accesa părți ale
sistemului pentru care nu are permisiune. Totuși, există modalități prin care o aplicație este
capabilă să partajeze date cu celela lte aplicații sau să acces eze serviciile sistemului.
Este posibil să aranjezi ca două aplicații să partajeze același ID de utilizator Linux , caz în
care amândouă sunt capabile să acceze fișierele fiecăruia. Pentru a conserva resursele sistemului,
aplicați ile cu același ID de utilizator pot fi de asemenea aranjate să ruleze în același proces Linux
și să partajeze aceeași mașină virtuală. Aplicațiile trebuie , de asemenea , să fie semnate sub
același certificat. O aplicație poate să ceară permisiune pentru a a ccesa datele de pe dispozitiv
cum ar fi contactele utilizatorului, mesajele SMS, memoria externă (cardul SD), cameră sau
Bluetooth. În acest caz, utilizatorul trebuie să atribuie în mod explicit permisiunile [10].
19
Figura 3 – Structura sistemului de operare Android [12]
Nucleul Linux asigură software -ul necesar pentru sistemul de operare pentru coordonarea
părții hardware cât și a aplicațiilor Android. Figura 3 ne ilustrează funcțiile de nivel scăzut ce
includ atr ibuții precum administrarea energiei, a ecranului, a driverelor audio, a conexiuni
wireless și de asemenea a memoriei flash.
1.1.3 Componentele aplicațiilor Android
În acest subcapitol sunt prezentate componentele esențiale ale unei aplicații Android
precum și modul de interacțiune al acestora și , de asemenea , legătura dintre ele prin intermediul
fișierului de tip manifest al aplicației din care fac parte.
20
1.1.3.1 Clasele de bază
Următoarele elemente stau la baza definirii și construirii unei aplicații:
Activities ( Activități le) reprezintă pivotul care asigură interacțiunea cu utilizatorul.
Acestea sunt descrise printr -un singur ecr an cu o interfață de utilizator ce folosește Views
(elemente de vizualizare) pentru afișarea informațiilor și gestionarea acțiunilor
utilizatorului. O activitate facilitează , de asemenea , următoarele interacțiuni cheie între
sistem si aplicație:
– Urmărirea a ceea ce este important pe ecran pentru utilizator pentru a asigura că
sistemului rulează procesul ce menține activitatea respectivă ;
– Cunoașterea faptului că procesele anterioare aplicației conțin lucruri la care
utilizatorul se poate întoarce (activități oprite) și prioritizarea acestora pentru a putea
fi folosite când este nevoie;
– Ajutarea aplicațiilor privind încheierea anumitor procese pentru ca utilizatorul să se
poată întoarce la o activitate an terioară în starea sa inițială ;
– Asigurarea unei căi între aplicații pentru implementarea fluxurilor de utilizatori între
ele și , de asemenea , coordonarea acestor fluxuri de către sistem (un exe mplu clasic ar
fi procesul de partajare) [10].
Services (Serviciile) sunt elemente ce au ca scop general permiterea rulării în fundal a
aplicațiilor pentru diverse motive. Acesta e ste o componentă care își desfășoară activitatea
în fundal pentru executarea de operații lungi sau a anumitor procese de la distanță. Un
serviciu nu are o interfață de utilizator. De exemplu, un serviciu poate rula un proces în
fundal în timp ce utilizatorul este într -o altă aplicație ce nu are legătură cu procesul
menționat. Altă componentă, de exemplu o activitate, poate să pornească un serviciu pe
care să îl lase să meargă sau să se lege de el pent ru a putea interacționa. Există două tipuri
de semantici de servicii care îi spun sistemului cum să gestioneze o aplicație:
– Started S ervices (Servicii de start) sunt lăsate de către sistem să ruleze până c ând
acestea își finalizează activitatea. De obicei sunt folosite pentru a sincroniza informații
în fundal sau pentru a reda un flux de date (ex. muzică, videoclipuri) chiar și după ce
utilizatorul a ieșit din aplicație. Aceste două exemple reprezintă , de asemenea două
tipuri de servicii de start care modifică felul în care sistemul este capabil să le
gestioneze. Fluxul de date derulat în fundal este un lucru pe care utilizatorul dorește să
îl aibe în vedere și din acest motiv aplicația îi spune sistemului să trimită constant
21
notificări . În acest caz , sistemul știe și trebuie s ă încerce să mențină activ procesul
serviciului până la primirea de noi comenzi din partea utilizatorului. Un ser viciu ce
sincronizează informații în fundal nu este un lucru pe care utilizatorul dorește să îl
aibă neapărat în vedere și de aceea sistemul are mai multă libertate în gestionarea
procesului său. Sistemul poate să închidă sau să restarteze serviciul dacă a re nevoie de
memorie RAM pentru alte aplicații ce reprezintă o prioritate în momentul actual
pentru utilizator.
– Bound Services (Servicii de legătură) sunt servicii care rulează atunci când o aplicație
sau sistemul are nevoie de utilitatea acelui serviciu. Prin acest lucru , serviciul
furnizează un API3 pentru un alt proces. Sistemul știe că există o dependență între
aceste procese, deci dacă un proces A este legat de un serviciu în procesul B, acesta
știe că trebuie să mențină pornit procesul B și serviciul său ce rulează pentru A. De
asemenea, dacă procesul A este unul important pentru utilizator, sistemul va trata
procesul B cu aceeași prioritate. Din cauza acestei flexibilități , serviciile au devenit un
bloc de construcție folositor în conceperea tuturor s istemelor de nivel înalt [10].
Content Providers (Furnizorii de conținut) gestionează un set comun de informații despre
aplicații ce poate fi stocat în fișierele sistemului, într -o bază de date SQLite sau în orice
altă locație de depozitare persistentă ce poate fi accesată de către aplicații. Prin furnizorii
de conținut, celelalte aplicații pot să interogheze sau să modifice informația dacă are
aprobarea furnizorului. De exemplu, sistemul Android aduce un furnizor de conținut ce
gestionează informațiile de contact ale utilizatorului. Astfel, orice aplicație cu
permisiunile corespunzătoare poate să interogheze furnizorul de conținut. Este tentant să
te gândești la un furnizor de conținut ca la o abstracție a unei baze de date, deoarece există
multe API -uri și asistență pentru acestea în majoritatea cazurilor. Cu toate acestea, ele au
un scop de bază diferit din perspectiva de design a sistemului. Pentru sistem, un furnizor
de conținut este un punct de plecare pentru publicarea elementelor de date cunoscute înt r-
o aplicație, identificate după o schemă URI4. Deși o aplicație poate decide felul în care să
stocheze informațiile conținute intr -un URI, predarea acestor URI -uri către celelalte
entități sunt folositoare pentru accesul la date. Sunt totuși câteva lucrur i particulare ce
permit sistemului să gestioneze o aplicație prin URI -uri:
3 Interfață programabilă a aplicației
4 Identificator de resurse uniform
22
– Atribuirea unui URI nu necesită ca aplicația să rămână activă, deci URI -urile se
atribuie chiar și după ce aplicațiile lor s -au închis. Sistemul are nevoie să se asigure
doar că o a plicație deținătoare încă rulează atunci când este nevoie să se transmită
informațiile aplicației corespunzătoare URI -ului.
– Aceste URI -uri pot aduce , de asemenea , un important model de securitate cu
granulație fină. De exemplu, o aplicație poate plasa URI -ul pentru o imagine pe care o
are în clipboard, dar îi lasă furnizorul de conținut blocat astfel încât celelalte aplicații
să nu le poată accesa liber. Când o a două aplicație încearcă să acceseze URI -ul din
clipboard, sistemul poate să permită acelei apli cații să acceseze informația printr -o
URI permission grant (alocare de permisiune URI) temporară astfel încât aplicația să
acceseze datele doar din spatele acelui URI și nimic altceva din cea de -a doua
aplicație.
Furnizorii de conținut sunt de asemenea fol ositori pentru citirea și scrierea informației
care este privată și nepartajată [10].
Broadcast Receivers (Consumatorii de intenții difuzate) sunt componente ce permit
sistemului să livreze evenimente către aplicații în afara fluxului de bază al utilizator ului,
permițând aplicației să răspundă anunțurilor de transmisiune mari ale sistemului.
Deoarece consumatorii de intenții difuzate sunt alte elemente bine definite pentru
aplicații, sistemul poate să livreze transmisiuni chiar și aplicațiilor ce nu rulează în
momentul actual. Mulți consumatori de intenții difuzate își au originea în cadrul
sistemului; de exemplu, o transmisiune ce anunță că ecranul a fost stins, că nivelul
bateriei este scăzut sau că s -a efectuat o captură de ecran. Aplicațiile pot , de asem enea, să
inițieze transmisiuni; de exemplu, anunțarea celorlalte aplicații că anumite date au fost
descărcate și sunt gata a fi utilizate. Deși consumatorii de intenții difuzate nu afișează o
interfață de utilizator, aceștia pot crea o bară de status cu no tificări pentru a alerta
utilizatorul atunci când apare un eveniment de transmisiune. Mai comun, totuși, un
consumator de intenții difuzate este doar o cale de acces pentru celelalte componente și
este proiectat să facă un nivel de muncă scăzut [10].
Inten ts (Intențiile) sunt descrieri abstracte ale unei operații ce urmează a fi realizată. Pot fi
folosite pentru a da startul activităților, pentru a trimite informații la orice consumator de
intenții difuzate interesat sau pentru a comunica cu un serviciu din fundal. Intențiile aduc
23
o grămadă de facilități pentru procesarea codului în diferite aplicații în ultima etapă a
rulării acestora, fiind practic o structură de date pasivă ce stochează descrierea abstractă a
acțiunii ce urmează a fi executată. În practic ă există două forme simple de intenții ce pot
fi folosite:
– Intențiile explicite specifică o anumită componentă ce determină în mod exact clasa ce
trebuie să fie executată. De obicei , aceste intenții nu includ alte informații, fiind o cale
simplă de rulare a activităților interne ale unei aplicații pe măsură ce utilizatorul
interacționează cu aceasta;
– Intențiile implicite nu specifică nicio componentă; în schimb, acestea trebuie să
includă destulă informație pentru ca sistemul să determine care din component ele
disponibile este cea mai bună pentru a fi rulată în cazul acelei intenții [13].
1.1.3.2 Fișierul Manifest
Înainte ca sistemul de operare Android să poată porni componenta unei aplicații, sistemul
trebuie să știe că acea componentă există, acesta citind fișier ul de manifest al aplicației ,
AndroidManifest.xml . Aplicația trebuie să aibe declarate toate componentele sale în acest
fișier, care trebuie să fie rădăcina directorului proiectului aplicației.
Manifestul mai are și alte funcționalități pe lângă declarare a componentelor aplicației,
cum ar fi:
– Identificarea permisiunilor necesare aplicației oricărui utilizator, cum ar fi accesul la internet
sau accesul citirii contactelor utilizatorului;
– Declararea nivelului API minim necesar aplicației, bazat pe API -urile folosite de aplicație;
– Declararea funcționalităților software și hardware necesare aplicației, cum ar fi camera sau
serviciile de Bluetooth;
– Declararea librăriilor API cu care aplicația t rebuie să fie legată (diferite de API -urile Android)
cum ar fi librăria Google Maps.
24
1.2 Java
1.2.1 Limbajul de programare Java
Java este un limbaj de programare high -level5 dezvoltat de către Sun Microsystems și care
și-a făcut apariția în anul 1995. Java are ca avantaj , comparativ cu alte limbaje de programare ,
faptul că rulează pe o varietate de platforme cum ar fi Windows, Mac OS ș i pe versiuni diferite
de UNIX [15].
Limbajul de programare Java este un limbaj securizat pentru că este foarte dificil să scrii
un cod Java incorect sau un cod care ar putea să corupă sau să fure datele utilizatorului ori să
dăuneze sistemului hardware cum ar fi hard disk -ul.
Sunt mai multe tipuri de programe Java care rulează diferit:
-Aplicație: Aceasta se execută pe calculatorul clientului. Dacă este online, trebuie să fie
descărcat în ainte să fie rulată;
– Applet: Program mic scris în Java care poate fi descărcat de pe un site web și executat
într-un browser web pe calculatorul utilizatorului;
– Fișierul JAR (arhiva Java): utilizată pentru a împacheta fișiere Java într -un singur fiși er
(aproape la fel ca un fișier .zip);
– Servlet: rulează pe un server web ș i ajută să genereze pagini web;
– Aplicație Swing: utilizată pentru a dezvolta o aplicaț ie care are o interfață grafică;
– EJB: ruleaz ă pe un server web și este folosit pentru a construi site-uri web complexe și
mari [22].
De asemenea, limbajul Java este un limbaj robust. A cesta a re numeroase caracteristici
desemnate să evite un posibil crash în timpul execuției programului cum ar fi:
– interfețe și excepții;
– verificarea ma rginilor vectorilor și a șirurilor de caractere;
– lipsa adunării pointerilor ;
– garbage collection6;
– nu se sare la adrese greșite ale metodelor .
5 Un limbaj de programare apropiat de modul de înțelegere al oamenilor
6 Este o form ă automată de management al memoriei
25
1.2.1.1 Conceptul de clasă
În programarea orientată pe obiect, clasa este o construcție a limbajului de programa re ce
este folosită ca prototip pentru crearea obiectelor. Acest prototip include atribute și metode pe
care obiectele create le împart.
De obicei, o clasă reprezintă o persoană, un loc sau un lucru – este o abstractizare a unui
concept dintr -un program d e calculator. Fundamental, acesta încapsulează starea și
comportamentul pe care îl reprezintă conceptual. Procesul de încapsulare a stării se realizează
prin variabile de memorie iar comportamentul este încapsulat prin cod reutilizabil numit și
metode [17].
Mai tehnic, o clasă este un pachet coerent ce consistă într -un tip particular de metadata7.
Aceasta descrie regulile după care obiectele funcționează; aceste obiecte sunt referite ca și
instanțe ale clase i respective . O clasă are , de asemenea o interfaț ă și o structură. Interfețele
descriu felul în care clasele și instanțele acestora pot interacționa cu metodele în timp ce structura
descrie felul în care datele sunt partiționate în atributele dintr -o instanță. De asemenea , o clasă
poate avea și o reprezentare (metaobject) la runtime8, lucru ce permite manipularea metadatelor
specifice clasei [17].
În Java, există mai multe tipuri diferite de clase:
– Regular class (Clasă de bază) este cea mai utilizată deoarece este proiectată pen tru crearea
obiectelor cu scopuri normale. Aceasta include constructori pentru inițializare, metode de tip get
și set pentru instanțierea privată a variabilelor și metode specifice pentru obiecte particulare;
– Enum class (Clasă de enumerare) este o clasă folosită pentru declararea enumerărilor printr -un
constructor și metode nedefinite;
– Interface class (Clasă de interfață) este utilizată ca șablon pentru construcția claselor;
– Abstract class (Clasă abstractă) este similară unei interfețe cu diferența că are deja anumite
metode furnizate.
Tipul clasei trebuie să fie totdeauna declarat compilatorului [17].
1.2.1.2 Conceptul de obiect
În cea mai simpla întruchipare a sa, un obiect reprezintă o regiune alocată a spatiului de
stocare. De când limbajele de progr amare folosesc variabile pentru a accesa obiecte, termenii
obiect și variabilă sunt deseori folosiți în mod interschimbabil. În orice caz, până memoria nu este
alocată, obiectul nu există [18].
7 Metadat ele reprezintă date care descriu alte date
8 Runtime face referire la perioada de rulare/executare a unui program
26
Toate limbajele de programare folosesc obiecte. Prezența obie ctelor nu trebuie totuși
confundată cu conceptul de orientat pe obiect.
În programarea procedurală, un obiect poate să conțină date sau instrucțiuni, dar nu
amândouă (instrucțiunile pot lua forma unei proceduri sau ale unei funcții). În programarea
orient ată pe obiect, un obiect poate fi asociat atât cu datele cât și cu instrucțiunile ce operează pe
acele date [18].
Figura 4 – Conceptul de obiect [19]
Felul în care un obiect este creat depinde de limbajul de programare. În limb ajele bazate
pe prototip (ex. JavaScript) un obiect poate fi creat nou sau poate fi bazat pe un obiect existent. În
limbajele bazate pe clase (ex. Java) obiectele sunt derivate din clase și pot fi gândite ca niște
șabloane pentru construirea obiectelor [18 ].
1.2.2 Execuția unui program Java
Codul Java este scris în fișiere care au extensia .java. Acest cod conține caracteristici
specifice limbajului de programare Java precum clase, metode, variabile, obiecte etc.
Pentru a compila un program Java care se numește T est, se execută compilatorul, javac
specificând numele fișierului sursă în linia de comandă după cum urmează: javac Test.java
Compilatorul byte -code9 de la Java traduce un fișier sursă Java în byte-code independent
de mașină. Aceste fișiere au extensia .c lass. Byte -code -ul pentru fiecare clasă publică vizibilă este
plasat într -un fișier separat, în așa fel încât sistemul de runtime Java sau JVM poate să îl găsească
ușor. JVM citește codul, îl interpretează și execută programul după care generează date de i eșire
[14].
9 O secvență de instrucțiuni de asamblare pentru JVM
27
Este rolul mașinii virtuale Java să facă aceste traduceri pentru ca sistemul de operare și
arhitectura procesorului pe care rulează programul Java să nu prezinte importanță în timpul
dezvoltării aplicației.
Dacă programul instanțiază un obiec t al clasei A, class loader -ul caută directoarele care
există în variabilele de mediu din classpath -ul utilizatorului un fișier A.class care conține definiția
clasei și byte code -ul pentru clasa A [14].
Figura 5 – Procesul prin care se interpretează și execută un program Java [14]
Nu există o fază de conectare pentru programele Java, toată conecta rea se face dinamic la
runtime.
Pentru a executa orice cod, JVM utilizează diferite componente. JVM este împărțit în
componente precum :
– set de regiștri;
– stivă;
– un mediu de execuție ;
– o coadă garbage -collected ;
– un set de constant;
– o zonă în care sunt stocate metodel e;
– un set de instrucțiuni .
28
Figura 6 – Arhitectura JVM [14]
În mașina vi rtuală se actualizează regiștrii după fiecare linie de byte -code.
Regiștrii în mașina virtuală Java sunt PC (număratorul de program) , vars, frame, optop.
– Stiva (Stack) : toate instrucțiunile iau operanzii din stivă, lucrează pe ei și apoi scriu înapoi în
stivă ;
– Mediu de execuție (Method Area) : este folosit pentru a gestiona legăturile dinamice, returnarea
dinamică, returnarea normală a met odelor și de generarea excepțiilor;
– Garbage -Collected Heap10: fiecare program are un garbage collector la început care are o
dimensiune inițială, dar care crește pe durata execuției programului în funcție de nevoie ;
– Constante: fiecare clasă din stivă are u n număr de constante care sunt create în general la
compilare.
– Zona de stocare a metodelor similar cu mediul runtime : zona unde se face compilarea codului ;
– Instrucțiuni : codul mașină creat de compilatorul javac .
Mașina virtuală va căuta și invoca automat metoda statică precedată de main, când se
rulează aplicația Java [14].
1.2.3 Structura unui program Java
Se pornește de la o unitate de compilare care reprezintă mai exact un fișier care conține
cod sursă Java. O unitate de compilare conține un set de clase și opțional o definiție a unui
pachet. Poate să fie de asemenea, urmată de declarații import11 [15].
10 Se ocupă de eliberarea dinamică a memoriei alocate la care nu se mai face referință
11 Utilizarea claselor din pachetele API Java în aplicație
29
Acest e declarații au rolul de a permite accesul la clase care există în alte pachete. După
care se pot defini una sau mai multe clase, interfețe sau structuri enum.
Clasele conțin ca membri: câmpuri (variabile) și metode. O variabilă este o locație de
memorie cu nume căreia îi poate fi asignată o valoare. Metodele reprezintă echivalentul funcțiilor
sau procedurilor din alte limbaje de programare. O metodă se definește prin antet care conține
numele metodei, tipul returnat de metodă și posibil o listă de paramet ri transmiși de metodă și
corpul metodei care conține declarații și instrucțiuni care se execută . Acestea specifică starea și
comportamentul obiectelor din program [15].
În general, metodele vor conține instrucțiuni ce includ expresii, operatori, tipuri d e data
etc. Acest lucru înseamnă că pachetele o să conțină clase iar clasele vor conține metode. Relația
de incluziune este marcată prin punct. În cazul pachetelor, incluziunea are loc la nivelul
directoarel or din proiectul, iar în cazul claselor și metode lor incluziunea are loc în același fișier.
Limbajul Java introduce un nou set de caractere care se numește Unicode c e include și
vechiul set ASCII care au aceleași coduri la caractere. Setul Unicode este folosit în timpul
execuției aplicațiilor, dar și în timpul compilării [15].
Programele Java se împart în două categorii:
– Aplicații de sine stătătoare care nu au un context inițial precum o fereastră principală pre –
existentă
– Applets pentru programare web care reprezintă aplicații web de dimensiune mi că care sunt
scrise în Java, dar pot fi scrise și în alte limbaje de programare și pot fi compilate în byte -code
Java [15].
1.2.4 Avantajele limbajului de programare Java în programarea pe Android
Java este un limbaj de programare foarte cunoscut, mulți program atori sunt deja
familiarizați cu limbajul de programare. A crescut în popularitate rapid și a devenit unul
dintre cele mai apreciate limbaje de programare din lume. De asemenea, sunt mulți
programatori care s -au specializat în Java creând o comunitate vast ă de dezvoltatori Java
care colaborează [16].
Rulează într -o mașină virtuală, prin urmare, nu este necesară recompilarea aplicației
pentru fiecare telefon existent pe piață. De asemenea, separă ușor procesele, iar în modul
acesta previne ca o aplicație f urată să distrugă telefonul utilizatorului sau să interfereze cu
alte aplicații instalate pe dispozitivul mobil . Fiecare aplicație are asignată propria sa
adresă [16].
Numeroase telefoane folosesc deja Java ME12, de aceea Java este cunoscută în industria
telefoanelor mobile.
12 Java Platform, Micro Edition — pentru hardware cu resurse limitate, gen PDA sau telefoane mobile
30
De asemenea, Android ca și sistem de operare rulează pe multe platforme hardware
incluzând televizoare smart, accesorii android etc.
Java permite programatorilor să creeze aplicații sandbox și să creeze un model de
securitate mai bun a stfel înc ât o aplicație cu risc de securitate crescut să nu poat ă să strice
sistemul de operare.
Datorită popularității limbajului de programare Java, există un număr mare de kit -uri de
dezvoltare disponibile pentru programatori. Java are suport open -source ridicat, cu multe
librării și programe disponibile pentr u a ușura viața programatorilor [16].
31
2 Studiu de caz
2.1 Aplicația “Memento”
2.1.1 Descrierea aplicatiei
În cadrul lucrării de licență, îmi propun să dezvolt o aplicație de tip Memento, cu
posibilitatea adăugării de notițe în funcție de dată și de oră. Mai mult de atât, notițele pot fi
actualizate și ștergerea acestora se va realiza automat în funcție de data curentă. Când data
respectivă este la un moment d in trecut, notița va fi ștearsă din listă.
Figura 7 – Previzualizarea aplicației Memento
De asemenea , notițele memorate sunt grupate pe trei categorii pentru gestionarea mai
ușoară a acestora: Astăzi, Mâine și În curând și se actualizează automat pentru aceste categorii
odată cu trecerea timpul.
2.1.2 Baza de date
O componentă importantă a aplicației dezvoltate în cadrul acestei lucrări este baza de
date. Baza de date reprezintă un instrument pentru organizarea și stocarea datelor. Cel mai des
întâlnit și des folosit model de bază de date este cel relațional, în care datele sunt organizate sub
forma unor înregistrări în tabele. Însă, în această lucrare am utilizat SQLiteOpenHelper pentru a
crea baza de date dacă nu există, pentru a deschide baza de date dacă există și pentru actual izarea
bazei de date dacă apar modificări.
32
Figura 8 – Metoda prin care se creează un tabel în baza de date
Baza de date care va fi folosită în dezvoltarea aplicației este SQLiteDatabase. Folosită ca
și clasă din pachetul androi d.database.sqlite, aceasta are metode pentru a crea, șterge, rula
comenzi SQL și pentru folosirea altor comenzi tipice de baze de date. În proiectarea bazei de
date, am identificat tabelele necesare și am stabilit câmpurile și tipul datelor stocate în baza de
date. Tabelul se numește entitate, iar câmpurile sunt atribute ale entității. În aplicație, baza de
date se numește MementoDBHelper.db, iar tabelul creat este Activities. Acestea sunt definite în
program în clasa MementoDBHelper.
Figura 9 – Metodele de inserare și actualizare a bazei de date
Metodele insertContact și updateContact au ca scop inserarea și actualizarea bazei de date
după id -ul ce identifică linia din tabelul de activități pe care am selectat -o. Aceste metode s unt
folosite în clasa AddActivity pentru gestionarea creării și actualizării notițelor din aplicația
Memento.
33
2.1.3 Clasele de activități
Clasele de activități sunt o componentă crucială pentru crearea aplicațiilor Android și felul
în care activitățile sunt lan sate și funcționează împreună sunt o parte fundamentală a platformei
modelului aplicației. Sistemul de operare Android își inițiază codul într -o instanță de activitate
apelând metode specifice ce corespund diferitelor stagii ale ciclului său de viață [20].
Activitățile furnizează fereastra în care aplicațiile își descriu interfața de utilizator.
Această fereastră cuprinde de obicei tot ecranul dispozitivului folosit, dar pot fi și situații în care
aceasta poate fi mai mică și să existe pe suprafața altei f erestre.
În aplicația Memento sunt folosite două clase de activități, MainActivity și AddActivity.
MainActivity este activitatea de bază ce reprezintă nucleul aplicației noastre; aici avem definite
variabilele și obiectele necesare funcționării aplicației , metode pentru popularea listelor de
activități și încărcarea acestora din baza de date precum ș i metode bazate pe A dapters ce ajută la
legarea și afișarea datelor pe ecranul dispozitivului. De asemenea , avem metode specifice pentru
a face saltul și a int eracționa cu cealaltă activitate a aplicației, AddActivity.
Figura 10 – Metode pentru încărcarea și afișarea datelor
34
Metoda loadDataList este folosită pentru importarea informațiilor din baza noastră de
date. Pentru aceasta vom folosi un C ursor reprezentând obiectul ce mediază accesul la elementele
bazei de date. Se apelează cursor .moveToFirst() pentru accesul la primul element și apoi salvăm
valorile din tabel urmărind tiparul atributelor până când am parcurs tot tabelul de act ivități.
Metoda loadListView setează un Adapter pentru lista primită ca parametru, obiect ce
reprezintă legătura dintre datele listei de activități și operația de afișare a acestora. De asemenea ,
am implementat și operația de salt către AddActivity print -un Intent care are loc atunci când dăm
click pe un element din listă cu scopul de a actualiza informațiile din acesta.
AddActivity este o clasă de activități ce are definite metode pentru inserarea și
actualizarea datelor și formatarea datei și orei pentr u eficientizarea procesului de stocare. De
asemenea , avem metode ce salvează și verifică datele introduse astfel încât să nu generăm erori la
stocarea în baza de date precum și două ferestre de dialog pentru setarea datei și orei, oferind
astfel o interfaț ă prietenoasă pentru utilizator.
Figura 11 – Metodă pentru inițializare / actualizare date
35
Figura 12 – Metodă de salvare și verificare a datelor introduse
Metoda doneAddTask se va apela în momentul în care utilizatorul va dori salvarea unei
notițe noi create în aplicația Memento. Această metodă va valida datele introduse de către
utilizator în câmpurile de nume , dată și oră. În cazul în care utilizatorul omite numele notiței,
câmpul task_name va conțin e un șir de caractere de lungime 0. Atunci se va seta o eroare pe
EditText care va fi afișată utilizatorului pentru a adăuga un titlu valid pentru notiță.
36
Figura 13 – Mesajul de eroare pentru câmpul de EditText
În mod similar se va proceda și pentru dată și oră, însă în cazul acestora , validarea se va
face pentru un număr de caractere mai mic decât 4 în cazul datei, respectiv 2 caractere p entru oră.
De asemenea, folosind variabila errorStep, s -a ținut cont dacă am ajuns în cadrul acestor validări.
Figura 14 – Mesajul de notificare „Încearcă din nou ” afișat prin Toast
37
În caz afirmativ, se va afișa un Toast13 pentru contextul aplicației care conține mesajul
“Incearca din nou”. Acest Toast va folosi parame trul Toast.LENGTH_SHORT care conform
metodei scheduleTimeoutLocked din clasa NotificationManagerService va avea un timp de
afișare de 2 secunde pe dispozit ivul mobil al utilizatorului.
În caz contrar, se va verifica dacă este vorba despre operația de ac tualizare prin
verificarea variabilei boolean isUpdate. Atunci se va face un update în baza de date pe câmpurile
de nume, dată și oră pentru un anumit id specificat. După actualizarea datelor, se va afișa un
Toast cu un mesaj specific de update și anume “A ctivitate actualizată”. Dacă nu exista notița
respectivă creată, se va insera o nouă înregistrare în baza de date pentru o notiță nouă. La fel ca
după actualizare și la inserare va fi afișat un Toast cu mesajul “Activitate adăugată”.
Figura 15 – Mesajele de notificare a activității actualizate / adăugate prin Toast
13 Un Toast este mesaj de feedback generat de utilizator prin interacțiunea cu aplicația ce expiră d upă un moment
de timp
38
Figura 16 – Metode de formatare a datei și a orei
Metodele de formatare a datei și a orei vor întoarce șirurile de caractere pentru variabilele
de tip SimpleDa teFormat care au un pattern specific de dată dd/MM/yyyy și de oră HH:mm.
Aceste metode sunt folosite pentru determinarea variabilelor dateFinal și timeFinal,
variabile ce sunt folosite in metoda doneAddTask explicată mai sus (ve zi Fig. 12).
Figura 17 – Metoda prin care se setează data î n EditText
Metoda onDateSet va fi apelată în view -ul de DatePickerDialog. Prin intermediul acestei
metode se setează data în câmpul task_date care este de tip EditText. Înainte de a fi setată, data
aceasta este formatată. În cazul în care ziua sau luna este între 1 și 9 atunci se va adăuga 0 înainte
de zi sau lună. Data va conține ziua și luna formatate da că este cazul și anul alese de utilizator
prin intermediul DatePick erDialog.
39
Figura 18 – Metoda prin care se afișează DatePickerDialog
Această metodă creează o nouă instanță de DatePickerDialog , setează un listener14
necesar pentru afișarea view -ului de DatePicker. După aceea, îl va afișa pr in apelarea metodei
dpd.show ().
Figura 19 – Interfața DatePicker -ului pe ecranul telefonului
14 Listener -ul este o interfață a clasei View ce conține o singură metodă de callback. Callback -urile furnizează
mijloacele pentru acceptarea cererilor între aplicații.
40
Figura 20 – Metoda prin care se setează ora în EditText
Asemănătoare cu onDateSet, onTimeSet este ap elată în view -ul de TimePickerDialog.
Prin intermediul acestei metode se setează ora în câmpul task_time de tip EditText. Înainte de
setarea orei, aceasta este formatată după cum urmează : dacă ora sau minutul au valori între 0 și 9
se va adăuga un 0 înaint e de acestea. Timpul înregistrat va conține ora și minutul formatate daca
este cazul ce au fost alese de utilizator prin TimePickerDialog.
Figura 21 – Metoda prin care se afișează TimePickerDialog
Această metodă creează o insta nță nouă de TimePickerDialog și setează un listener folosit
în afișarea view -ului de TimePicker. Afișarea se realizează print apelarea metodei tpd.show().
41
Figura 22 – Interfața TimePicker -ului pe ecranul telefonului
42
2.1.4 Alte cla se utilizate în realizarea aplicației
O clasă importantă folosită în realizarea aplicației este MementoDBHelper ce moștenește
clasa SQLiteOpenHelper. Prin moștenire , clasa noastră va cunoaște toate metodele și atributele
clasei SQLiteOpenHelper , devenind o subclasă a acesteia , lucru care ne va ajuta la crearea bazei
de date. În cadrul clasei noastre am dat Override15 la metodele de creare, actualizare și ștergere a
bazei de date din clasa părinte pentru a realiza ceea ce ne dorim în contextul aplicației noas tre.
De asemenea , am creat metode de tip Cursor pentru a facilita ordonarea și selecția
informațiilor din tabel și gestionarea lor după cele trei cazuri prezentate în descrierea aplicației în
ceea ce privește data evenimentelor : Astăzi, Mâine și În curând.
Figura 23 – Metode de creare a Cursorilor pentru cele trei categorii de liste
De asemenea , în cadrul aplicației noastre am dezvoltat o clasă numită
ConversionFunction cu scopul de a face conversia datelor primite de la TimePic ker și
DatePicker. Metodele definite Epoch2DateString și Epoch2Calender au rolul de a converti datele
15 Override este o funcționalitate a limbajelor de programare orien tate pe obiect ce permite unei subclase să
schimbe implementarea unei metode ce are același nume, parametri sau semnatură și același tip de rezultat
returnat ca și clasa părinte
43
din șiruri de caractere în formatul specific datei calendaristice și a orei precum și în variabile de
tip Calendar.
Figura 24 – Clasa ConversionFunction și metodele sale
Figura 25 – Metoda de preluare a datelor din clasa ListAdapter
44
O altă clasă implementată în aplicație este ListAdapter. În cadrul acestei clase ne folosim
de Holders pentru implementa rea unui Adapter cu scopul afișării listelor noastre pe ecranul
telefonului. Holder -ul este un șablon de design ce ne ajută la accesarea fiecărui element din listă
fără nevoia de a -l căuta, salvând astfel cicluri ale procesorului. Adapter -ul are rolul de a lega
componentele interfeței de utilizator și datele ce trebuiesc afișate în acele componente de
interfață.
În cazul nostru instanțiem șablonul de design al listelor pentru care avem un fișier xml
separat în cadrul activității noastre și setăm holders pe fiecare atribut al elementelor listelor
pentru identificare. În continuare populăm câmpurile listelor cu informațiile din baza noastră de
date și folosim sintaxa de try and catch pentru a verifica eventuale erori.
În cadrul aplicației am definit , de asemen ea și o clasă NoScrollListView pentru stabilirea
unui comportament pentru listele noastre de activități. Astfel am dat Override la metoda
onMeasure ce oferă posibilitatea de personalizare a șabloanelor de View -uri în ceea ce privește
dependența lor față de constrângerile de interfață ale aplicației.
Figura 26 – Clasa NoScrollListView și metodele sale
În cazul nostru, onMeasure va seta parametrii ce țin de lățimea și înălțimea listei ținând
cont de schema interfeței părinte iar apelul metodei MeasureSpec.AT_MOST prin parametrul
MeasureSpec definește ca specificațiile listei să ia dimensiunea maximă admisibilă a părintelui.
45
2.1.5 Fișierele XML și Manifestul
Extensible Markup Language (XML) reprezintă un meta -limbaj extensibil de marca re ce
definește o serie de reguli pentru codarea documentelor astfel încât acestea să fie înțelese atât de
om cât și de mașină. Acesta se bazează pe etichete ce pot fi personalizate după nevoie [21].
În cazul aplicației Memento, XML este integrat în mediul de dezvoltare Android Studio și
are ca scop realizarea interfeței grafice a aplicației și legarea acesteia de clasele și metodele
specifice. Astfel, în apli cația noastră avem create două fișiere XML ce definesc interfețele
claselor MainActivity și AddActi vity, un fișier XML special pentru șablonul de design al listelor
și un fișier XML pentru Manifestul aplicație.
Manifestul reprezintă rădăcina proiectului, el este locul unde sunt descrise informațiile
importante ale aplicației și ierarhia activităților îm preună cu capacitățile și proprietățile lor de
interacționa una cu cealaltă.
Figura 27 – Fișierul AndroidManifest.xml
Celelalte fișiere XML din aplicație le găsim în directorul res , sub layout și acestea s unt:
add_activity_layo ut.xml, main_activity_layout.xml, list_view_layout .xml.
În fișierul main_activity_layout .xml avem structura XML pentru meniul principal, în care
găsim notițele grupate pe categoriile: Astăzi, Mâine și În curând.
Structura Linear Layout o sa conțină secțiu nea de titlu din meniul principal al aplicației
Memento. În general, rolul acestei structuri este de a alinia toate celelalte șabloane de design
orizontal, proprietate dată de android:orientation=”horizontal”. Prin Linear Layout se setează și
gravitatea cu valoarea center_vertical care specifică modul în care un obiect își poziționează
conținutul pe axele X și Y.
46
Figura 28 – Structura Linear Layout din MainActivity
Această structură conține un element de tip TextView în care se se tează efectiv numele
aplicației folosind atribute de stilizare a textului. Elementul de tip ImageView conține o imagine
pe care o găsim în folderul drawable și anume ic_action_add care are un eveniment de onClick ce
declanșează apelarea funcției openAddTas k.
Figura 29 – Elementul de tip ProgressBar
47
ProgressBar este un element folosit în interfața grafică pentru a indica progresul operației,
care în cazul aplicației noastre este adăugarea unei notițe noi. Se folosește Progress Ba r în mod
default, folosind o animație ciclică fără a indica o cantitate de progres anume.
În continuare, în funcție de categoriile de dată menționate mai sus avem o structură cu
următoarele elemente :
– NestedScrollView;
– LinearLayout ;
– TextView;
– CardView;
– NoScrollListView;
TextView, CardView și NoScrollListView apar de trei ori, câte o dată pentru fiecare din
cele trei categorii : Astăzi, Mâine și În curând. Acestea fac parte din LinearLayout care este inclus
în NestedScrollView.
Figura 30 – Structura elementului de tip TextView pentru categoria “Astăzi”
TextView reprezin tă titlu de categorie ce se cree ază pe măsură ce utilizatorul adaugă
notițe. Acesta are definite proprietăți ce țin de înălțime, lățime, culoare, dimens iune.
CardView a fost introdus odată cu versiunea 5.0 de Android și poate fi văzut ca un
element FrameLayout cu umbră și colțuri rotunjite. CardView este folosit în aplicația Memento,
dar și în general ca un container care există într -un layout pentru fie care element de tip ListView
sau RecyclerView. În cazul aplicației noastre, CardView înglobează element de tip
NoScrollListView.
48
Figura 31 – Structura Elementului CardView în care este inclus NoScrollListView
În continuare, add_activity_layout .xml reprezintă fișierul XML corespunzător pentru
ecranul în care are loc adăugarea de noi notițe în aplicație. Aici este creat un RelativeLayout care
se ocupă de afișarea copiilor16 în poziții relative față de părinte.
Figura 32 – Structura elementului Toolbar
Toolbar reprezintă o generalizare a unei bare de acțiune în layout -ul unei aplicații. Acesta
poate fi plasat la orice nivel arbitrar dintr -o ierarhie.
16 În acest context copiii sunt elemente de design subordonate ierarhic altor e lemente de acest tip ;
49
Figura 33 – Structura e lementului ImageView folosit ca „ înapoi ” din meniul de adăugare
Acest element de tip ImageView are un eveniment onClick care atunci când se apelează
metoda closeAddTask va închide meniul de adăugare și va reveni în meniul principal. Imaginea
folosită pentr u aceste element se află în directorul drawable și se numește ic_action_close.
Figura 34 – Structura elementului ImageView folosit ca „salvare” din meniul de adăugare
Elementul de tip ImageView conține o imagine pe care o găsim în folderul drawable și
anume ic_action_done care are un eveniment de onClick ce declanșează apelarea funcției
done AddTask.
Figura 35 – Structura elementelor EditText pentru metodele de TimePicker și DatePicker
50
Aceste elemen te de tip EditText au scopul de a facilita alegerea datei și orei prin
intermediul TimePicker -ului și DatePicker -ului ce sunt apelate prin evenimentele de onClick
atașate acestora.
Figura 36 – Structura elementului EditText pent ru scrierea titlului notiței
Asemănător elementelor EditText pentru DatePicker și TimePicker, a fost creat un
EditText pentru alegerea numelui activităților.
De asemenea am creat un fișier list_view_layout .xml pentru a furniza un design pentru
elementele din ListView.
Figura 37 – Structura elementelor TextView din listă
51
Concluzii și propuneri pentru dezvoltarea aplicației
În acest capitol, conturez concluzia întregii lucrări de licență și ofer o serie de propuneri
pentru p osibile îmbunătățiri ale aplicației pe viitor.
În cadrul lucrării de licență am definit și descris cele mai importante puncte în dezvoltarea
aplicației. Am început prin a prezenta scopul aplicației create, prin enumerarea avantajelor aduse
de astfel de aplicații mobile pentru utilizatori. De asemenea, am prezentat cadrul teoretic în care
se înscrie tema proiectului și am descris soluția software implementată.
Principalul scop al temei lucrării este crearea unui produs simplu de utilizat pentru toți
utilizatorii săi. Un fapt important este posibilitatea de adăugarea de notițe sub formă de memento
de către toți utilizatorii aplicației. De asemenea, aplicația oferă posibilitatea adăugării unei date și
a unei ore prin intermediul unor interfețe intuitive p entru utilizatori. Mai departe, aceste notițe
sunt grupate în funcție de dată pentru o vizualizare mai rapidă și mai simplă a acestora.
În timp, aplicația ar putea fi îmbunătățită prin adăugarea unor notificări pe dispozitivele
mobile ale utilizatorilor pentru notițele create. Această sugestie are rolul de a ajuta utilizatorii
aplicației să fie informați din timp de notițele create și în modul acesta și -ar putea facilita
desfășurarea activității zilnice.
O altă posibilă dezvoltare viitoare ar putea const a în adăugarea unei opțiune de distribuire
a notițelor cu alte persoane prin medii sociale. Acest lucru ar putea ajuta persoanele care au
nevoie de aceleasi notițe în dispozitivele mobile.
52
53
Bibliografie
[1] https://ro.wikipedia.org/wiki/Telefon_mobil
[2] https://ro.wikipedia.org/wiki/Smartphone
[3] https://images.techhive.com/images/article/2017/03/dsc04773 -100715673 -large.jpg
[4] https://ro.wikipedia.org/wiki/Android_(sistem_de_operare)
[5] https://ro.wikipedia.org/wiki/Software
[6] https://www.businesswire.com/news/home/20170403005635/en/Android -Overtakes –
Windows -Time -%E2%80%93 -StatCounter
[7] https://ro.wikipedia.org/wiki/Program_(informatic%C4%83)
[8] Hoog, A., 2011, Android Forensics Investigation, Analysis and Mobile Se curity for Google
Android, Elsevier, Inc. , Chapter 2 & 3
[9] https://developer.android.com/guide/practices/compatibility
[10] https://developer.android.com/guide/components/fundamentals
[11] Saltzer, Jerome H. (1974). "Protection and the control of information sharing in multics".
Communications of the ACM. 17 (7): 388 –402.
[12] https://elinux.org/images/c/c2/Android -system -architecture.jpg
[13] https://developer.android.com/reference/android/content /Intent.html
[14] https://viralpatel.net/blogs/java -virtual -machine -an-inside -story/
[15] Java: A Beginner's Guide, Sixth Edition, 2014, Herbert Schildt
[16] Java Fundamen tals for AndroidTM Development, Course -Code: AND -404, version 7, 2017,
Android ATC , Chapter Why did Google choose Java over other programming languages?
[17] https://java.fandom.com/wiki/Class
[18] https://java.fandom.com/wiki/Object
54
[19] https://docs.oracle.com/javase/tutorial/figures/java/concepts -object.gif
[20] https://developer.android.com/guide/components/activities/intro -activities
[21] https://en.wikipedia.org/wiki/XML
[22] https://simple.wikipedia.org/wiki/Java_(programming_language)
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: București, 2019 Universitatea POLITEHNICA din București [613321] (ID: 613321)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
