Dacă ne gândim la toate lucrurile pe care noi oamenii le facem într -o zi obișnuită, ne dăm seama că smartphone -urile fac parte din viața noastră de… [619569]
1
1. Introducere
1.1. Contextul proiectului
Dacă ne gândim la toate lucrurile pe care noi oamenii le facem într -o zi obișnuită, ne
dăm seama că smartphone -urile fac parte din viața noastră de zi cu zi, iar Android este de
departe cel mai popular sistem de operare smartphone . După raportul făcut de NetM arket
share [15] privind cota de piață a sistemelor de operare mobile, în mai 2018 statistica arată că
versiunile sistemul ui de operare Android ajung la 69.87% .
Progresul dezvoltării în domeniul dispozitivelor mobile a crescut foarte rapid.
Aplicațiile de pe telefoanele mobile au devenit o parte a vieții noastre, ră spândindu -se peste
tot pentru a acoperi activitățile noastre zilnice. În acest scop mi -am propus prin intermediul
acestei lucrări să realizez o aplicați e pentru platforma mobilă Android.
Aplicați a pe care am dezvoltat -o este destinată utilizatorilor Android care doresc să
folosească cât mai eficient timpul pentru a -și gestiona cumpărăturile, oferind posibilitatea să
țină cont și de bugetul alocat acestora. Am dorit să fac acest lucru posibil prin intermediul
unei aplicații ușor de folosit oferind informațiile potrivite la momentul potrivit.
1.2. Ideea și scopul alegerii temei
Aplicația MetaList, așa cum am decis să o numesc , este o aplicație intuitivă și de
actualitate, fiind de o importantă util itate în via ța de zi cu zi. Mai exact, aplicația dezvoltată
de mine permite utilizatorului să își creeze listele de cumpărături dorite și în același timp să și
le gestioneze. Acestea se vor salva local într -o bază de date stocată în memoria sistemului,
astfel utilizatorul poate accesa în orice moment datele fără a fi necesară o conexiune la
internet. Pe lângă gestionarea listei de produse, aplicația oferă posibilitatea de a încărca rețete
salvate local și de a genera lista de cumpărături necesară rețetei al ese. Lista de cumpărături va
fi creată după lista de ingrediente necesare în prepararea unei rețete. Utilizator ul care
utilizează aplicația va economisi timp în căutarea rețetelor și a ingredi entelor acestora atunci
cand nu are acces la internet .
Am ales a ceastă temă de licență din curiozitatea și dorința de a dezvolta o aplicație
interactivă și eficientă pentru dispozitivele mobile și în același timp pentru a ajuta utilizatorul
să își țină o evidență a bugetului alocat cump ărăturilor prin păstrarea unui is toric a listelor
create.
1.3. Structura aplicației
2
Aplicația MetaList pe care am realizat -o poate fi rulată pe dispozitivele pe care
rulează sistemul de operare Android cu versiunea minimă 6.0 (Android API 23), iar versiunea
maximă fiind cea mai nouă, de oarece odată cu apariția acestora se va putea face o actualizare
a versiunii maxime pe care va putea rula aplicația.
Grafic, interfața aplicației este simplă și intuitivă, având cât mai multe pictograme
sugestive și gesturile utilizatorului sunt cât mai na turale pentru a face navigarea cât mai
simplă și cursivă. Astfel, aplicația dispune de următoarele funcționalit ăți:
Crearea unei liste de cumpărături, urmând introducerea produselor în
listă prin selectarea produselor sugerate din baza de date și în acelaș i timp alegerea
cantităților acestora;
Salvarea/ștergerea produselor din lista de cumpărături;
Vizualizarea listei de cumpărături în funcție de categoriile produselor ;
Editarea listei de cumpărături, precum și a produselor cumpărate prin
selectarea opțiuni i Cumpărat ;
Trimiterea pe mail a listelor de cumpărături;
Pagina cu rețete permite vizualizarea ingredientelor rețetei, precum și a
modului de preparare și pune la dispoziție opțiunea de generare a listei de cumpărături
specifice rețetei ;
Vizualizarea unui istoric cu toate listele de cumpărături .
1.4. Structura lucr ării
Lucrarea de față este alcătuită din cinci capitole . În prima parte a lucrării se găsește
introducere a. Al doilea capitol prezintă considerații teoretice asupra tehnologiil or utilizate
pentru realizarea aplicați ei dezvoltate. Tot în acest capitol se prezintă succint platforma
Android . În al treilea capitol se prezintă o analiz ă și o comparare a modului de funcționare a
unor aplicații asemănătoare . În capitolul patru se găsește proiectarea propriei aplicații
împreună cu detaliile de implementare a celor mai importante funcționalități evidențiate
printr -un scenariu de utilizare. În final, sunt prezentate concluziile acestei lucrări și modul în
care această aplicație poate fi extinsă în viitor .
3
2. Tehnologii și tehnici de programare utilizat e
Potrivit președintelui Google Eric Schmidt, din aprilie 2013, există mai mult de 1,5
milioane de utilizatori noi de Android în fiecare zi. [1]
Începând cu al doilea trimestru din 2017, Android condu ce piața mondială cu o cotă
de piață de 87,9%, în timp ce iOS -ul Apple este al doilea . [2]
Android a avut un început lent cu HTC Dream (cunoscut și ca T -Mobile G1). De
atunci, Android a câștigat popularitate cu lansarea fiecărei versiuni noi. Este import ant să ne
documentăm despre versiuni le noi atunci când începem să dezvo ltăm aplicații Android,
deoarece versiunile mai noi conțin mai multe caracteristici decât cele anterioare.
Figura 2.1. Iconiță Android
2.1 Android API
Aplicațiile destinate platforme i Android sunt create cu ajutorul API -ului Android,
acestea rulând pe mașina virtuală Dalvik. API -ul Android este scris în limbajul de programare
Java de către dezvoltatorii platformei Android, acesta fiind public. Există mai multe versiuni
de Android API întrucât acestea se actualizează la fiecare versiune nouă de Android.
4
Figura 2.2. Diagrama popularității versiunilor de Android [2]
2.2 Android Studio
Mediul de dezvoltare recomandat de Google pentru platforma Android este Android
Studio.
Android Studi o este un mediu de dezvoltare integrat (IDE) oficial pentru sistemul de
operare Google Android, construit pe software -ul IntelliJ IDEA al lui JetBrains și proiectat
special pentru dezvoltarea Android -ului. Este disponibil pentru descărcare pe sistemele de
operare Windows, MacOS și Linux. Este un înlocuitor pentru Eclipse Android Development
Tools (ADT) ca IDE primar pentru dezvoltarea aplicațiilor Android native. Android Studio a
fost anunțat la 16 mai 2013 la conferința Google I / O. Acesta a fost în etapa de
previzualizare a accesului timpuriu pornind de la versiunea 0.1 în mai 2013, apoi a intrat în
etapa beta pornind de la versiunea 0.8, care a fost lansată în iunie 2014. Prima construcție
stabilă a fost lansată în decembrie 2014, începând cu versiunea 1 .0. Versiunea actuală stabilă
este 3.1.3 lansată în iunie 2018. [3]
Dezvoltarea software -ului Android este procesul prin care se creează noi aplicații
pentru dispozitive le care rulează sistemul de operare Android. Oficial, aplicațiile pot fi scrise
utilizâ nd Java, C ++ sau Kotlin utilizând kitul de dezvoltare software (SDK) Android . [4]
Arhitectura sistemului de operare Android cuprinde cinci secțiuni, având patru nivele:
Kernelul Linux, biblioteci, motorul Android și cadrul pentru aplicații, după cum se poa te
observ a și în figura următoare:
5
Figura 2.3. Arhitectura sistemului de operare Android [16]
Principalele funcționalități pe care sistemul de operare Android le oferă sunt:
Stocare, care folosește SQLite, bază de date relațională ce permite
utilizarea eficientă a resurselor;
Conectivitatea prin diverse modalități, precum: 3G, WiFi, Bluetooth,
WiMAX, GPRS, EDGE;
Apel video și suport media pentru formate video, captur ă de ecran;
Android Beam, prin care utilizatorii partajează conținut instant prin
apropierea dispozitivelor respective;
Navigarea pe Internet bazată pe motorul open source pentru navigare
WebKit împreună cu motorul JavaScript de la Chrome V8 suportând HTML5 și
CSS3.
Conectivitate: GSM / EDGE, IDEN, CDMA, Bluetooth, EDGE, 3G,
NFC, LTE, GPS, WiFi direct (care permite interconectarea între diverse dispozitive
având o lățime de bandă mare);
Multimedia admite mai multe formate precum: H.263, M -peg-4,
AMR -WEB, AAC, JPEG;
Suport multilanguage
Multi -touch, care suportă posibilitatea de contact în mai multe puncte
concomitent;
Grafic ă optimizată
Multi -tasking; GCM (Google Cloud Messaging) permițând
dezvoltatorilor expedierea de date de dimensiuni reduse, SMS, MMS, C2DM (pentru
mesaje la dispozitive).
6
Browser integrat bazat pe motorul WebKit Open Source
2.3 Componentele unei aplicații Android
Aplicațiile Android sunt alcătuite din componete cuplate în mod liber care sunt legate
prin intermediul fișierului manifest al programului din care fac parte.
În continuare vor fi descri se component ele și mod ul în care acestea interacționează pe
platforma Android .
2.3.1 Clasele de bază
Scheletul pe baza căruia este construită o aplicație este dat de următoarele șase
elemente prezentate pe scurt mai jos.
1) Activities (Activități)
Fiecare ecran din program este o extensie a clasei Activity. Activitatea reprezintă o
componentă a aplicației Android ce oferă o interfață grafică, utilizând elemente de vizualizare
(Views), afișează informații și răspunde la acțiunile utilizatorului. O aplicație Android este
formată din una sau mai multe activități (slab cuplate între ele), una fiind tot timpul
principala, iar o activitate poate invocă o altă activitate pentru a realiza diferite sarcini, prin
intermediul unei intenți.
O activitate poate fi utilizată numai dacă este defin ită în fișierul
AndroidManifest.xml, în cadrul elementului de tip <application>. Componentele definitorii
ale unei activități sunt: clasa în care este implementat comportamentul în urma interacțiunii
cu utilizatorul și fișierul .xml care descrie modelul st atic al interfeței grafice.
Din momentul în care activitatea este creată și până la momentul în care este distrusă,
ea trece printr -o serie de etape, cunoscute sub denumirea de ciclul de viață al activității [5]
ilustrate în urmă toarea figur ă:
7
Figura 2. 4. Ciclul de viață al unei activit ăți [6]
2) Services (Servicii)
Un serviciu este o componentă de aplicație care poate efectua operații de lungă durată
în fundal și nu oferă o interfață pentru utilizator. O altă componentă a aplicației poate să
pornească un serviciu și continuă să ruleze în fundal chiar dacă utilizatorul comută la o altă
aplicație. În plus, o componentă se poate lega de un serviciu pentru a interacționa cu acesta și
chiar poate realiza o comunicare inter -proces (IPC).
Cele trei tipuri diferi te de servicii sunt:
prim plan , care realizează o operație care este vizibilă
utilizatorului;
de fundal , care efectuează o operație care nu este observată
direct de către utilizator;
legat , care o feră o interfață client -server ș i permite
componentelor s ă interacționeze cu serviciul, să trimită cereri, să primească
rezultate și chiar să facă acest lucru între procesele cu comunicare inter -proces
(IPC). [5]
8
3) Content Providers (Furnizori de conținut)
Furnizorii de conținut pot ajuta o aplicație să gestionez e accesul la datele stocate de la
sine, stocate de alte aplicații și ofer ă o modalitate de a partaja date cu alte aplicații. Ele
încapsulează datele și oferă mecanisme pentru definirea securității datelor. Furnizorii de
conținut sunt interf ețe standard car e conectează datele într -un singur proces cu codul care
rulează într -un alt proces. Un furnizor de conținut poate fi utilizat pentru a gestiona accesul la
o varietate de surse de stocare a datelor, inclusiv date structurate, cum ar fi o bază de date
relați onală SQLite sau date nestructurate, cum ar fi fișiere imagine. [5]
Figura 2.5. Mecanismul furnizorilor de conținut [5]
4) Intents ( Inten ții)
Cu ajutorul acestor resurse este posibilă difuzarea de mesaje la nivel de sistem, către o
activitate sau un servi ciu țintă, manifestându -se astfel intenția de a avea o acțiune efectuată.
Sistemul va determina apoi ținta (obiectivele) care vor efectua orice acțiune corespunzătoare.
Există două tipuri de intenții: implicite și explicite. Cele explicite specifică
compon enta care începe prin nume (numele de clasă complet) și se utilizează de obicei când
se începe o nouă activitate ca răspuns la o acțiune a utilizatorului sau se pornește un serviciu
pentru a descărca un fișier în fundal. Cele implicite nu denumesc o compon entă specifică, ci
declară o acțiune generală de efectuat, ceea ce permite unei componente din altă aplicație să o
gestioneze.
9
Figura 2.6. Cele două tipuri de intentii
5) Broadcast Receivers (Consumatori de intenții difuzate)
Dacă se crează sau se înregis trează un Broadcast Receiver, aplicația va începe să
aștepte intențiile difuzate ce prezintă criteriul specificat și va răspunde la acțiunile acestora.
Acestea provin atât din sistem, cât și din aplicații.
Figura 2.7. Mecanismul Broadcast Receivers [7]
Broadcast Receivers poate fi utilizat ca obiectiv pentru notificările push. Prin setarea
unui atribut diferit (atribut de acțiune) pe obiectul de date JSON trimis prin mesajul push, se
poate efectua Parse pentru a invoca un receptor difuzat în loc să dec lanșeze o notificare care
apare în bara de notificare. Când se utilizează această abordare, Parse nu trimite o notificare
administratorului de notificări. În schimb, Parse invocă un receptor difuzat indicat de
atributul de acțiune. Pentru a solicita Parse să facă acest lucru, se construiește un obiect de
date JSON cu o cheie numită acțiune care indică o intenție Android a cărei acțiune invocă un
receptor difuzat . [8]
10
6) Notifications (Notificări)
O notificare este un mesaj pe care Android îl afișează în af ara interfeței UI a aplicației
pentru a le oferi utilizatorilor comunicări de la alte persoane sau alte informații în timp util
din aplicație. Utilizatorii pot atinge notificarea pentru a deschide aplicația sau pentru a lua o
acțiune direct din notificare.
2.3.2 Fișierul Manifest
Fiecare proiect Android trebuie să dețină un fișier manifest, reprezentând un fișier
de configurare indispensabil aplicațiilor dezvoltate pe platforma Android și anume
AndroidManifest.xml. Acesta conține informații esențiale de spre aplicație, informații pe care
sistemul Android trebuie să le cunoască pentru a putea rula codul sursă.
Printre informațiile importante pe care acest fișier le are se află:
numele pachetului aplicației ce conține codul sursă;
componentele aplicației , care includ toate activitățile, serviciile,
receptoarele de difuzare și furnizorii de conținut și descrierea acestora;
permisiunile aplicației de care are nevoie această pentru a
accesa părți protejate ale sistemului sau ale altor aplicații, scopul unei
permisiuni fiind aacela de a proteja confidențialitatea unui utilizator;
versiunea minimă de Android API pe care aplicația rulează.
2.3.3 Resursele aplica ției
Resursele sunt fișierele suplimentare și conținutul static pe care le utilizează codul,
cum ar fi fișierele bitmap, definițiile layout -urilor, șirurile interfeței utilizator, instrucțiunile
de animație și mult e altele. Acestea sunt stocate în directorul res/ din ierarhia proiectului.
Ar trebui ca resursele de aplicație să fie î ntotdeauna externaliza te, cum ar fi imaginile
și șirurile din cod, astfel încât să se mențin ă independent. De asemenea, trebuie să fie
furnizate resurse alternative pentru configurații specifice ale dispozitivelor, grupându -se în
directoare de resurse special numite. În timpul rulării, Android utilizează resursa
corespunzătoare pe baza configurației curente. [5]
Odată externalizate resursele aplicației, pot fi accesate utilizând ID -urile resurselor
generate în clasa R a proiectului. Acest document arată cum se grupeaz ă resursel e în proiectul
Android și cum se furnizeaz ă resurse alternative pentru anumite configurații de dispozitive și
apoi cum să fie accesate din codul aplicației sau din alte fișiere XML. [5]
Plasând fiecare tip de surs ă într-un anumit subdirector res/ al direc torului proiectului,
ierarhia fi șierelor pentru un proiect, în general, arată ca în figura următoare:
11
Figura 2.8. Ierarhia fi șierelor din directorul res/ în Android Studio
Resursele din directorul /res au următoarele semnificații:
Drawable Resources
O resursă drawable este un concept general care definește diferitele fișiere bitmap
(.png, .jpg sau .gif) sau XML. Acestea sunt accesate din clasa R.drawable .
Layout Resource
O resursă layout definește aspectul pentru interfața aplicației. Cel mai des utiliz ate
sunt în definirea interfeței grafice unei activități sau o componentă a unei interfețe. Accesarea
se face prin clasa R.layout .
Menu Resource
O resursă menu definește un meniu de aplicații (meniu de opțiuni, meniu contextual
sau submeniuri). Acestea sun t accesate din clasa R.menu .
Values Resources
Aceste resurse sunt fișiere XML care conțin valori simple, cum ar fi șiruri de
caractere, numere întregi și culori. Câteva dintre aceste resurse care pot fi create în acest
director sunt:
arrays.xml pentru arra ys de resurse și accesate din clasa R.array.
integers.xml pentru numerele de resurse și accesate din clasa R.integer.
bools.xml pentru resursă booleană și accesat din clasa R.bool.
colors.xml pentru valorile culorilor și accesate din clasa R.color.
dimens. xml pentru valorile de dimensiuni și accesate din clasa R.dimen.
strings.xml pentru valorile șirului și accesate din clasa R.string.
styles.xml pentru stiluri și accesate din clasa R.style.
Mipmap Resources
Resursele mipmap conțin pictogramele aplicației, deoarece acestea sunt utilizate
pentru a oferi o imagine de calitate și diferite scale de imagine, care pot fi deosebit de utile
dacă se asteaptă ca imaginea să fie redimensionată în timpul unei animații.
12
2.4 Android SDK (Software Development Kit)
Android SDK (kitul de dezvoltare software) este un set de instrumente de dezvoltare
folosite pentru a dezvolta aplicații pentru platforma Android prin intermediul limbajului de
programare Java, limbaj ce are acces la API -urile puse la dispoziție de Android.
Kitul Android SDK conține: bibliotecile necesare, debugger, emulatorul,
documentația relevantă pentru interfețele programelor de aplicații Android (API), exemple de
cod sursă, tutoriale pentru sistemul de operare Android . [4]
2.5 Emulatorul Android
Emulatorul A ndroid simulează pe computer diverse dispozitive Android, tablet, Wear
OS și Android TV. Dispune de configurații predefinite pentru tipuri de dispozitive populare și
poate transfera date mai rapid decât un dispozitiv conectat prin USB. Acesta oferă aproape
toate capabilitățile unui dispozitiv Android real . [5] De exemplu se pot simula apelurile
telefonice și mesajele text primite, se poate specifica locația dispozitivului, pot fi simulate
serviciile de telefonie și de localizare, accesul la Magazinul Google Play și multe altele.
Fiecare instanță a emulatorului Android utilizează un dispozitiv virtual Android
(AVD) pentru a configura dimensiunea, factorul de formă, versiunea Android și diferite
caracteristici hardware. Pentru a testa în mod eficient aplicați a, trebuie creat un AVD care să
modeleze fiecare tip de dispozitiv pe care aplicația este proiectată să o suporte . [5]
2.6 Android și Java
În Java, se scrie fișierul sursă Java, se compilează într -un cod byte Java folosind
compilatorul Java și apoi se exe cută acest cod byte pe Java VM. În Android, lucrurile sunt
diferite deoarece este scris fișierul sursă Java și compilat în Java byte folosind același
compilator Java, dar la acel moment, este recompil at din nou folosind compilatorul Dalvik
pentru codul byt e Dalvik. Acest cod octet Dalvik este apoi executat pe Dalvik VM. [9] Acest
lucru este evidențiat în figura următoare .
13
Figura 2.9. Java versus Dalvik [9]
Deci, echipa Android a ales să -și bazeze Dalvik pe codul byte Java în loc de codul
sursă Java. Pri n acest lucru se pot scrie aplicații Android în alte limbaje de programare care
compilează codul octet Java.
2.7 Procesele în Android
În momentul în care se pornește o aplicație sau o co mponentă a aplicației Android, în
mod automat pornește un nou proces Linux cu un singur fir de execuție pentru acea
component ă. Acesta se mai numește și procesul principal al aplicației (procesul main). Dacă a
pornit un proces pentru o componentă aparținând unei aplicații anume, atunci cererile
ulterioare de a rula alte com ponente în cadrul aceleași aplicații vor fi executate în același
proces nefiind creat unul nou.
Aplicațiile sunt găzduite pe Android în cadrul proceselor (în esență, instanțe ale
mașinii virtuale Dalvik). Fiecare aplicație, la rândul său, este alcătuită di n compone nte sub
formă de activități și s ervicii. Sistemul run -time pentru Android are puterea de a termina atât
procesele cât și activitățile individuale pentru a elibera memoria. Starea procesului este luată
în considerare de sistemul de rulare atunci câ nd se decide dacă un proces este un candidat
potrivit pentru terminare. Starea unui proces depinde, în mare măsură, de starea activităților
găzduite de acest proces . [10]
Android menține procesele în stare de funcționare pe cât de mult posibil, iar în caz ul
în care sistemul are nevoie să recupereze resurse acestea vor fi oprite în funcție de importanța
acestora.
14
În funcție de importața proceselor există cinci tipuri de procese:
Procese de tip foreground . Acest nivel de importață corespunde
proceselor în ca re rulează componentele aflate în prim plan și cu care utilizatorul
interacționează direct. Este un num ăr mic de astfel de procese și sunt oprite doar
ca o ultimă soluție în cazul în care memoria este atât de scăzută încât ele nu pot
continua să ruleze, de oarece este necesară menținerea interfeței cu utilizatorul.
Procese vizibile . Acestea găzduiesc componente care nu sunt în prim
plan dar sunt vizibile pentru utilizator. Un proces vizibil este considerat extrem de
important și nu va fi terminat , dacă nu e ste necesar ca acesta să mențină toate
procesele din prim plan.
Procese service . Aceste procese ruleaz ă în fundal și execută diferite
opera ții, cum ar fi de exemplu desc ărcarea de date sau redarea muzicii în fundal,
fiind oprite dacă nu este suficientă mem orie pentru a le păstra împreună cu toate
procesele primare și vizibile.
Procese background . Aceste procese de fundal nu sunt vizibile
utilizatorului și rulează în num ăr foarte mare. Pentru a se asigura că procesul cu
activitatea pe care a văzut -o ultima d ată utilizatorul este ultima care urmează să fie
oprit ă, aceste procese sunt păstrate într -o listă LRU (cea mai recentă utilizare).
Procese goale . Aceste tipuri de procese nu conțin componente active
ale aplicației . Singurul motiv pentru a menține acest ti p de proces în ,,viață ” este
pentru scopuri de cache, pentru a îmbunătăți timpul de pornire la următoarea
lansare atunci când o componentă trebuie să ruleze.
Figura 2.10. Ierarhia proceselor în funcție de importanță [17]
15
2.8 SQLite
SQLite este un sistem de gestionare a bazelor de date relaționale, ușor de încorporat,
care este inclus în cadrul Android și oferă un mecanism pentru implementarea spațiului de
stocare organizat persistent pentru aplicațiile Android. În plus față de baza de date SQLite,
cadrul Android include, de asemenea, o serie de clase Java care pot fi folosite pentru a crea și
gestiona baze de date și tabele bazate pe SQLite . [11]
SQLite este o alegere populară ca software de bază de date încorporat pentru stocarea
locală / client în apli cații software cum ar fi browserele web. Acesta este, probabil, cel mai
răspândit motor de baze de date, folosit astăzi de mai multe browsere, sisteme de operare și
sisteme încorporate (cum ar fi telefoanele mobile), printre altele. SQLite are legături cu multe
limbi de programare . [12]
SQLite este scris în limbajul de programare C, în timp ce aplicațiile Android sunt
dezvoltate în principal folosind Java. Pentru a depăși acest "decalaj lingvistic", SDK -ul
Android include un set de clase care oferă un stra t Java pe partea superioară a sistemului de
management al bazei de date SQLite.
Câteva dintre aceste clase sunt :
Cursor – o clasă furnizată special pentru a oferi acces la rezultatele interogării
unei baze de date. De exemplu, o operație SQL SELECT efectua tă pe o bază de date, poate
returna mai multe rânduri din baza de date. O instanță Cursor poate fi utilizată pentru a trece
prin aceste rezultate, care apoi pot fi accesate din cadrul codului aplicației folosind o varietate
de metode.
SQLiteDatabase – clasă care oferă interfața primară între codul aplicației și
bazele de date SQLite care stau la baza acesteia, inclusiv capacitatea de a crea, șterge și
efectua operații SQL bazate pe baze de date.
SQLiteOpenHelper – o clasă de ajutor pentru a facilita crearea și actualizarea
bazelor de date. Această clasă trebuie să fie subclasată în cadrul codului aplicației care caută
acces la baza de date și în următoarele metode de apel invers implementate în acea subclasă:
onCreate(), onUpgrade() .
ContentValues – o cla să care permite identificarea perechilor de chei / valori,
care constau din identificatori de coloane de tabelă și din valorile care trebuie să fie stocate în
fiecare coloană. Această clasă este folosită în mod special la introducerea sau actualizarea
intrărilor într -o tabelă de baze de date. [11]
16
Figura 2.11 . Principalele c lase din Android pentru SQLite împreun ă cu metodele
acestora [18]
Atunci când se imlementeaza o bază de date pe Android, o practică comună este de a
crea o clasă care interacționează cu baza de date SQLite și, de asemenea, cu activitățile
aplicației. Această clasă se numește DBAdapter și conține tot codul necesar pentru crearea
tabelelor și câmpurilor atribuite. Toate operațiunile referitoare la inserarea, actualizarea și
ștergerea în registrărilor se află în DBAdapter . [13]
Figura 2.12 . Utilizare adaptor pentru a încapsula operațiile bazei de date [19]
17
În comparație cu alte baze de date SQL, SQLite nu dispune de un server separat
pentru procesare, acesta citind și scri ind direct în memoria sistemului. Oferă o bază de date
complexă având tranzacțiile ACID (Consistency, Isolation, Durability) chiar dacă sunt
întrerupte de erori. Formatul fișierelor scrise de aceasta bibliotecă este cross -platform fiind
utilizat atât pe sisteme de 3 2 de biți cât și pe cele de 64 sau pe arhitecturi de tip big -endian
sau little -endian. Din acest motiv , SQLite este opțiunea perfectă în implementarea unei
aplicații performante.
2.9 Avantaje Android
Există o mulțime de avantaje prin dezvoltarea aplicațil or [20], dintre acestea amintim
cele pe care le considerăm relevante :
Platforma Android este open source, ceea ce înseamnă că Software Development Kit
(SDK) poate fi utilizat fără vreo grijă cu privire la costurile de licențiere.
Suportă toate serviciile G oogle
Suportă Multitasking
Poate instala un ROM modificat
Suport ă grafic ă 2D și 3D
Se pot construi simultan aplicații pentru Mobile, Wear, TV, etc.
Linie de comandă dedicată
Conectare ușoară și integrare cu asistenți dedicați cu Firebase, Kotlin și Google Cloud
Prezentare clară bazată pe IntelliJ IDEA
Actualizare periodică
Suport pentru gradle
Emulator dedicat
Este personalizabil și se pot schimba aproape orice
Acces ușor la magazinul de aplicații Android (Magazin play)
18
Figura 2.13 . Beneficiile Android [14]
19
3. Analiza și compararea modului de func ționare a unor
aplica ții asem ănătoare
3.1 Grocery Shopping List – Listonic
Aplicația Listonic , distribuită gratuit, este una dintre cele mai folosite aplicații de
cumpărături.
Figura 3.1. Capturi al e aplicatiei Listonic [21]
Listonic sugerează mai întâi produsele preferate. Se pot adăuga cantități cu o singură
atingere în același timp.
Aplicația permite navigarea în propriul catalog unde se vor găși numeroase inspirații
pentru produse. Această permi te și partajarea listelor cu alții, astfel listele de cumpărături se
sincronizează și modificările sunt vizibile pentru ceilalți. Dacă utilizatorul adaugă prețuri
produselor Listonic calculează totalul cheltuielilor. De asemenea permite introducerea
produs elor prin comandă vocală.
Comparația dintre Listonic și aplicația originală dezvoltată este următoarea:
Atât aplicația dezvoltată de mine cât și aplicația Listonic sunt ușor de folosit.
Listonic permite introducerea produselor prin selecție și vocal lăsân d
utilizatorul să își introducă prețuri dacă dorește . Aplicația dezvoltată de mine, în prezent,
permite doar introducerea produselor prin selecție dar în același timp lăsând utilizatorul să
aibă controlul asupra magazinului, ca ntițătiilor de produse select ate și afișând prețul
produsului în funcție de cantitate. De asemenea, ambele aplicații calculează un total la lista de
cumpărături.
Aplicația dezvoltată de mine permite partajarea listei de cumpărături cu alte
persoane nefiind necesar crearea unui cont de utilizator în aplicație . Nu se întâmplă la fel și în
cazul aplicației Listonic , deoarece este necesar crearea unui cont de utilizator.
20
Aplicația dezvoltată de mine pune la dispoziție o pagină cu rețete de unde
utilizatorul poate să își genereze lista core spunzătoare rețetei selectate. Aplicația Listonic nu
dispune de această facilitate dar în schimb are mai multe setări. [21]
3.2 Out of Milk – Grocery Shopping List
Această aplicație permite crearea de liste de cumpărături multiple, accesarea listei
online de oriunde pe site -ul official http://www.outofmilk.com/, gr uparea articolelor pe
categorii, precum și partajarea listelor în timp real cu alți utilizatori.
Figura 3.2. Capturi ale aplicației Out of Milk
Out of Milk pune la dispoziție introducerea de pr oduse, introducerea prin scanarea
acestora și introducerea vocală, păstrează istoricul listelor de cumpărături, salvează totalul
listei și multe alte funcționalități.
Comparația dintre Out of Milk și aplicația mea:
Aplicația Out of Milk pare mai dificilă de folosi t la prima utilizare , la fel și
adăugarea informațiilor (cantitate, preț, categorie, etc) despre fiecare produs în parte față de
aplicația dezvoltată de mine unde anumite informații sunt generate singure. Aceste a sunt
luate din baza de date, unde în momentul de față sunt introduse manual dar pe viitor acest
lucru s -ar putea îmbunătății prin obținerea cataloagelor cu produsele magazinelor. Astfel
utilizatorul va ști în timp real totalul costului liste i de cumpărături și va putea fi la curent cu
prom oțiile.
Aplicația dezvoltată de mine permite trimiterea listelor de cumpărături altor
persoane fără crearea unui cont în cadrul aplicației spre deosebire de Out of Milk care
necesită o logare înintea partajării listei de cumpărături.
Out of Milk pune la di poziția utilizatorului mai multe personalizări în cadrul
aplica ției (cum ar fi culoarea, crearea unei categorii propri, sunet pentru notificări, etc .) pe
care aplicația dezvoltată de mine nu o are în prezent, însă pot fi luate în considerare ca și
direcții viitoare.
21
4.Prezentarea Aplica ției M etaList
Aplicația pe care am realizat -o în această lucrare ajută utilizatorul să își gestioneze
listele de cumpărături. Aplicația în forma actuală permite crearea unei liste de cumpărături
ușor, rapid și cel mai important inteligent, d eoarece pune la dispoziție controlul asupra
bugetului alocat pentru cumpărături. De asemenea, pe lângă afișarea de list e de produse,
aplicația oferă o listă de rețete având opțiunea de a genera lista de cumpărături necesară
rețetei alese .
În spatele aplicației se regăsește o bază de date în care sunt stocate toate informațiile ,
atât despre produse și rețete cât și despre listele de cumpărături create.
În această lucrare am urmărit realizarea unei aplicații interactive pentru cum părătorii
inteligenți și creativi care doresc să economisească timp și bani.
Aplicația mea, în modul de vizualizare ,,Android ” care organizează fișierele în funcție
de cele mai importante părți ale unei aplicații Android , are structura de mai jos.
Figura 4.1. Structura aplicației
22
4.1 Implementarea și interfa ța aplica ției
La deschiderea aplicației, prima interacțiune a utilizatorului cu aceasta se realizează
prin intermediul apariției, pentru câteva secunde, a ecranului cu numele aplicației, așa cum se
poate vedea în figura de mai jos.
Figura 4. 2. Deschiderea aplica ției
Pentru ca această pagină s ă fie prima activitate a aplicației care apare la lansarea
acesteia am inclus în fișierul AndroidManifest.xml următorul cod :
<activity
android :name= ".FirstP age"
android :label= "@string/app_name" >
<intent -filter>
<action android :name= "android.intent.action.MAIN" />
<category android :name= "android.intent.category.LAUNCHER" />
</intent -filter>
</activity >
După câteva secunde se afișe ază ecranul principal al aplicației în care se află o
imagine în partea de sus, după care urmează locul unde vor fi vizualizate listele create de
cumpărături și butonul de adăugare a unei liste de cumpărături noi.
23
Figu ra 4. 3. Activity -ul Listele Mele înainte și după crearea listelor de cumpărături
Afișarea listelor de cumpărături se face descrescător în funcție de data în care au fost
create. Am hotărât să le ordonez în acest mod pentru a ajuta utilizatorul să aibă în prim plan
ultima list ă creat ă, astfel accesarea acesteia făcându -se mult mai rapid.
Fiecare list ă de cumpărături are la dispoziție două opțiuni, acestea fiind vizibile prin
glisare la stânga, și anume Editează prin care se editează lista de cumpărături (ad ăugându -se
sau ștergându -se produse), iar cea de -a două opțiune este Șterge prin care se șterge lista de
cumpărături.
24
Figura 4. 4. Opțiunile de editare și ștergere al listelor de cumpărături
Pentru afișarea listelor de cumpărături am utilizat biblioteca de meniu Bayoz Swipe
care este open source. Acest lucru a fost posibil prin adăugarea în proiect a următoarei
dependențe:
dependencies {
implementation 'com.baoyz.swipemenulistview:library:1.3.0'
}
Următorul pas pe care l -am făcut a fost să adaug SwipeMenuListView în layout -ul
paginii care este linear, la crearea listei.
Acest lucru este evidențiat în codul următor:
<com.baoyz.swipemenulistview.SwipeMenuListView
android :layout_width= "match_parent"
android :layout_height= "match_parent"
android :id="@+id/liste_istoric"
android :layout_marginTop= "5dp"
android :layout_marginLeft= "5dp"
android :layout_marginRight= "5dp"
android :dividerHeight= "15dp"
android :divider= "#d7d5d5" >
</com.baoyz.swipemenulistview.SwipeMenuListView >
25
Astfel pentru a afișa cel e două opțiuni (cea de editare și cea de ștergere) în clasa care
implementează această activitate am creat un SwipeMenuCreator pentru a adăuga elementele.
Apoi pentru evenimentul de click am implemetat setOnMenuItemClickListener , iar pentru
fiecare opțiune selectată am implementat metodele specifice.
Prin apăsarea butonului de creare a unei liste noi, cel cu semnul plus pe el, apare o
nouă activitate unde se introduce numele listei de cumpărături.
Figura 4. 5. Crearea unei liste de cumpărături
La apăsar ea butonului Creează , lista de cumpărături este creată iar utilizatorul va fi
redirecționat către altă pagină a aplicației, cea de adăugare a produselor în listă. Această
pagină afișează în partea de sus totalul listei de cumpărături, care inițial este 0 l ei, iar în
partea de jos permite introducerea produselor și adăugarea acestora în list ă. De asemenea, în
partea de sus există un meniu de unde se pot salva sau șterge toate produsele adăugate în lista
creată.
26
Figura 4. 6. Pagina de introducere a produselor cu opțiunile de salvare/ștergere al
acestora
În momentul în care utilizatorul începe să scrie numele unui produs , aplicația afișează
un meniu derulant, din care utilizatorul trebuie să selecteze produsul dorit. Lista sugestiilor
este obținută de la un adaptor și apare numai dacă literele introduse se regăsesc în numele
produ selor. După cum se poate observa în figura de mai jos, în listă produsele sunt organizate
în felul următor: numele produsului, magazinul și prețul. În acest fe l utilizatorul poate să își
aleagă produsul de la magazinul cu prețul cel mai mic sau se poate orienta după un anumit
magazin de unde dorește să își facă cumpărăturile.
27
Figura 4. 7. Apariția sugestiilor de produse în momentul tastării
Pentru a afișa auto mat sugestiile de completare în timp ce utilizatorul introduce
numele unui produs în textul editabil am folosit un câmp AutocompleteTextView în xml,
sintaxa fiind următoarea:
<AutoCompleteTextView
android :id="@+id/produs"
android :layout_width= "0dp "
android :layout_height= "wrap_content"
android :layout_marginBottom= "16dp"
android :layout_marginEnd= "10dp"
android :layout_marginStart= "16dp"
android :ems= "10"
android :hint= "Inroduceti produsul"
android :inputType= "textPersonName"
app:layout_constraintBottom_toBottomOf= "parent"
app:layout_constraintEnd_toStartOf= "@+id/adaugaBtn"
app:layout_constraintStart_toStartOf= "parent" />
După aceasta am obținut o referință la acest text în codul java după cum se observă în
secvența de mai jos.
private AutoCompleteTextView autoCompleteProdus ;
autoCompleteProdus =(AutoCompleteTextView)findViewById(R.id. produs );
28
Lista produselor sugerate este salvată în variabila listProduse declarată astfel:
List<ProduseItem> listProduse= new ArrayL ist<ProduseItem>();
Aceste produse sunt încărcate din baza de date în felul următor:
for (List<String> row:result) {
int id = Integer. parseInt (row.get( 0));
String produs = row.get( 1);
double pret = Double. parseDouble (row.get( 2));
String m agazin = row.get( 3);
listProduse.add( new ProduseItem(id, produs, magazin, pret));
}
unde variabila result declarată astfel:
List<List<String>> result = new ArrayList<List<String>>();
este rezultatul apelării funcției getName ( this, item) , care are ca și parametri this, fiind
contextul și item care reprezintă valoarea returnată din AutoCompleteTextView . Acest lucru
este evidențiat în secvența ce urmează.
final String item = autoCompleteProdus .getText().toString();
result= data.getName( this, item);
Implementarea acestei metode , care returnează produsele din baza de date în funcție
de ce introduce utilizatorul este următoarea:
public List<List<String>> getName(Context context, String item){
eventoConexion =new ConectareDB(context);
List<List<String>> prod = new ArrayList<List<String>>();
try {
eventoConexion .createDataBase();
} catch (IOException e) {
}
if(eventoConexion .checkDataBase()){
eventoConexion .openDataBase();
SQLiteDatabase db = eventoConexion .getWritableDatabase();
String sql = "SELECT pm.id, p.NUME,pm.PRET,m.NUME FROM PRODUSE p " +
"INNER JOIN PRODUSE_MAGAZIN pm " +
"ON p.ID=pm.ID_PRODUS INNER JOIN MAGAZINE m " +
"ON pm.ID_MA GAZIN=m.ID WHERE p.NUME like '%" + item + "%' ;" ;
Cursor cursor = db.rawQuery(sql, null);
while (cursor.moveToNext()){
ArrayList<String> tmp = new ArrayList<>();
tmp.add(cursor.getString( 0));
29
tmp.add(curso r.getString( 1));
tmp.add(cursor.getString( 2));
tmp.add(cursor.getString( 3));
prod.add(tmp);
}
eventoConexion .close();
}
return prod;
}
Pentru vizualizarea produselor împreună cu informațiile refe ritoare la acestea
(magazinul și pre țul) ca listă în caseta de sugestii am implementat o clasă ArrayAdapter
customizată, pe care am numit -o AutoCompleteProduseAdapter . Această clasă extinde
ArrayAdapter<ProduseItem> pentru a personaliza lista de sugesti după modelul obiectului
ProduseItem care reprezintă datele pentru fiecare element din listă. Apoi am folosit această
clasă in activitate pentru a afișa elementele.
final AutoCompleteProduseAdapter myArray= new AutoCompleteProduseAdapter( this,listProduse);
autoCompleteProdus .setAdapter(myArray);
În momentul selectării produsului dorit de către utilizator, numele acestuia apare în
câmpul text, iar la apăsarea butonului Adaugă , produs ul este adăugat în list ă.
Pentru vizualizarea listei am folosit ListView care afișează o listă de elemente
scrollabile. Elementele din listă sunt inserate automat în listă folosind un adaptor care, în
cazul aplicației mele, extrage conținutul din baza de date în funcție de id -ul produsului
selectat și convertește fiec are rezultat al elementului într -o vizualizare care este plasată în
listă.
Adaptorul funcționează în felul următor: ListView cere adaptorului ceea ce ar trebui să
afișeze iar adaptorul preia elementele care trebuie afișate din baza de date, decide cum ar
trebui să fie afișate și transmite aceste informații către ListView , acest lucru fiind evidențiat în
schemă următoare:
Figura 4. 8. Modul de funcționare al adaptorului [5]
Fiecare element din listă este personalizat, punând la dispoziția uilizatorului mai
multe modificări. În funcție de necesitatea utilizatorul poate să își adauge mai multe produse
prin apăsarea butonului plus sau dacă s -a răzgândit și dorește să adauge mai puține produse
poate apasă butonul minus. Între cele două butoane se actualizează c antitatea produselor, iar
30
în dreapta prețul care este calculat în funcție de cantitate. Dacă un produs nu mai este necar
sau a fost adăugat din greșeală se poate șterge apăsând butonul x.
Figura 4. 9. Introducerea produselor în l istă și selectarea cantității dorite
De asemenea în momentul introducerii în listă a produselor, modificării cantității sau
ștergerea acestora totalul este actualizat în timp real. Pentru acest lucru au fost implementate
următoarele funcții:
public doubl e updateTotal(){
double t = upgetTotal();
setTotalView(t);
return t;
}
public double upgetTotal(){
double t = 0.0;
for(ItemLista il : itemLista ){
int iCantitate = il.getCantitate();
double dPret = il.getPret();
t+= (iCantitate * dPret);
}
totalLista = Math. round (t * 100.0 ) / 100.0 ;
return totalLista ;
}
public void setTotalView( double value){
31
tv_total .setText( "Total: " + value + "lei");
}
După ce lista de cumpărături este gata, această se salvează s electând opțiunea
Salvează din colțul dreapta sus. De asemenea tot aici există opțiunea Șterge Produsele prin
care utilizatorul poate să elimine toate produsele adăugate în listă.
Figura 4. 10. Finalizarea listei de cumpărături prin salvarea acesteia
După salvarea produselor utilizatorul va fi redirecționat la activity -ul unde se afișează
istoricul listelor de cumpărături.
Pentru vizualizarea listei de cumpărături create se atinge ecranul pe numele listei și se
deschide un activity cu produsele din lista respectiv ă. Acestea sunt grupate în funcție de
categoria din care fac parte. Am ales această grupare a produselor pentru a fi mai ușor
utilizatorului în momemtul cumpărării acestora, deoarece și în magazine acestea sunt
organizate pe raioane în acest fel.
32
Figura 4.1 1. Vizualizarea listei de cumpărături create
În momentul în care un produs este cumpărat se poate selecta opțiunea Cumpărat , iar
culoarea de background a produsului selectat se modifică. În acest fel utilizatorul își ține
evidenț a produselor c umpărate.
Figura 4.11. Schimbarea statusului unui produs după ce a fost cumpărat
33
O opțiune pusă la dispoziție de aplicația dezvoltată de mine , pe care o consider foarte
utilă, este aceea de a trimite prin e -mail lista de cumpărătur i altor persoane. Astfel se po t face
cumpărăturile și de către alte persoane .
După cumpletarea datelor, prin apăsarea butonului Trimitere apare utilizatorului să își
aleagă metod a de trimitere (Yahoo Mail, Gmail, Telegram, etc.) urmând c a lista să fie
trimisă.
Figura 4.1 3. Distribuirea listei de cumpărături
Aplicația MetaList dispune de o pagină cu rețete recomandate. Pentru vizualizarea
listelor am utili zat RecyclerView , fiind cea mai recentă versiune de suport -v7. Mai jos este
widgetul RecyclerView cu atributele necesare.
<android.support.v7.widget.RecyclerView
android :id="@+id/recycler_retete_id"
android :layout_width= "match_parent"
android :layout_height= "match_parent" >
</android.support.v7.widget.RecyclerView >
În mo mentul în care se selectează o rețet ă se deschide o pagină unde apar mai multe
informații: imaginea, ingredientele și modul de preparare a acesteia. Pentru a reprezenta
într-o manieră plăcută informațiile ce descriu rețetele am folosit CardView după um se poate
observ a în secvența ce urmează .
<android.support.v7.widget.CardView
xmlns: android ="http://schemas.android.com/apk/res/android"
34
android :id="@+id/cardview_retete_id"
android :clickable= "true"
android :foreground= "?android:attr/selectabl eItemBackground"
android :layout_width= "match_parent"
android :layout_height= "190dp"
android :layout_margin= "5dp"
xmlns: cardview ="http://schemas.android.com/apk/res -auto"
cardview :cardCornerRadius= "4dp" >
<LinearLayout … </LinearLayou t>
</android.support.v7.widget.CardView >
În build.gradle am adăugat dependențele pentru RecyclerView și CardView :
dependencies {
implementation 'com.android.support:cardview -v7:27.1.0'
implementation 'com.android.support:recyclerview -v7:27.1.0'
}
Figura 4.1 4. Pagina cu rețete recomandate
Apoi pentru afișarea infor mațiilor am implementat clasa AdapterReteteRecyclerView
care extinde RecyclerView.Adapter<AdapterReteteRecyclerView.MyViewholder>.
RecyclerView.ViewHolder reprezi ntă vizualizările din RecyclerView și
RecyclerView.Adapter reprezintă datele care vor fi afișate împreună cu ViewHoder.
35
De asemenea am suprascris cele trei metode din RecyclerView.Adapter :
onCreateViewHolder (ViewGroup parent, int viewType) pentru a retur na o
instan ță a clasei ViewHolder
onBindViewHolder (MyViewholder holder, final int position) pentru a lega
setul de date la aspectul vizualiz ării datelor .
getItemCount () pentru a returna dimensiunea listei
Figura 4.1 5. Descrierea rețetei și modalitatea de generare a listei de cumpărături
În cazul în care utilizatorul dorește s ă își pregătească una din rețetele recomandate,
acesta poate să își genereze lista de cumpărături specifică rețetei , selectând opțiunea
Generează lista. Astfel se va genera o listă de cumpărături care va avea numele rețetei și va
conține ingredientele necesare acesteia.
36
Figura 4.1 6. Lista de cumpărături generată pentru rețeta selectată
Utilizatorul are oportunitatea să recomande aplicația și altor persoane cărora consideră
că le va fi de folos. Prin selectarea opțiunii Recomanda MetaList se va deschide o pagin ă
unde se va introduce numărul de telefon al destinatarului și textul care initial este scris dar
poate fi modificat în funcție de mesajul de recomand are dorit.
37
Figura 4.1 7. Pagina de recomandare a aplicației
De asemenea, dacă utilizatorul are nev oie de ajutor sau nu reușește să acceseze unele
funcționalități ale aplicației poate accesa pagina Ajutor, iar apoi poate trimite un email cu
neclaritățile din cadrul aplicației.
Figura 4.1 8. Pagina de ajutor a aplica ției
38
4.2 Baza de date
Baza de date SQLite este una de tip SQL relational, specifică aplicațiilor și
dispozitivelor de mici dimensiuni.
Schema, structura bazei de date a fost proiectat ă și opt imizat ă utlizând metodele
tradiționale de normalizare, facilitând astfel atât scrierile cât și citirile direct din aceasta.
Astfel, dup ă a treia itera ție din acest process au rezultat urm ătoarele tabele:
Tabela Produse este o tabelă în care se stochează nu mele, marca, cantitatea
produselor și id-ul categoriei pentru fiecare produs;
Tabela Categorii este tabela în care se rețin categoriile produselor, fiind o
tabelă recursiv ă care poate memora ierarhii de produse. La crearea acestui tabel
am utilizat modelul Adjacency list model (modelul listei de adiacență) unde
fiecare nod are un indicator care indică părintele său, iar nodul superior nu are
părinte;
Tabela Magazine prezintă lanțurile de magazine;
Tabela Produse_Magazin este o tabelă intermediară care face legătura între
tabela Produse și tabela Magazine și stochează prețurile produselor;
Tabela Liste reține numele listei, totalul și data în care au fost create listele
de cumpărături;
Tabela Produse_Lista păstrează informațiile despre listele de cumpărături
create de utilizator, și anume id -ul produsului, cantitatea, prețul și id-ul list ei din
care face parte produsul;
Tabela Rețete conține numele, descrierea, imaginea rețetei și numărul de
porți i pentru care este creată rețeta ;
Tabela Ingrediente_Reteta stochează id -ul rețetei, id -ul produsului si
cantitatea necesară pentru fiecare produs in parte.
Am creat tabela Produse_Magazin pentru a face legătura dintre tabelele Produse,
Magazine și Produse_Lista pentru a evita repetarea anumitor date în mai multe tabe le și
repetarea informațiilor redundante (aceași informație să nu fie repetată pe mai multe rânduri
în cadrul aceluiași tabel). Pentru a asigura unicitate a unei inregistrari, am adăugat fiecărei
tabele o cheie primară. De exemplu, în baza de date eu pot a vea mai multe produse din
același magazin, același magazin are mai multe categorii de produse, o listă de cumpăraturi
creată de utilizator poate avea mai multe produse din același magazin și produse din
magazine diferite, ș.a. Astfel am realizat o normaliz are a bazei de date.
39
Figura 4.1 9. Schema bazei de date
Schema bazei de date am realizat -o in Dia care este un software gratuit și de tip open –
source pentru diagrame.
40
5. Concluzii
Această lucrare surprinde tendințele existente pe piața platformelor de dezvoltare
mobilă și își propune dezvoltarea unei aplicații de gestionare a listelor de cumpărături si a
bugetului alocat acestora. În același timp, acestă aplicație ajută considerabil pe utilizator să
economisească timp.
Pentru dezvoltarea aplicației MetaList, așa cum am denumit -o, am folosit platforma
Android și limbajul Java deoarece aceasta oferă elementele necesare pentru a realiza o
interfață interactivă cu utilizatorul și pune la dispoziție numeroase instrumente necesare
realizării unei aplicați i. Am încercat ca prin îmbinarea acestor elemente puse la dispoziție de
Android să creez o aplicație ce oferă o experiență plăcută și intuitivă utlizatorului prin design –
ul interfeței grafice, pentru îndeplinirea scopului propus. Totodată, am folosit SQLit e pentru
legătura cu baza de date deoarece a fost o solu ție usor de folosit, Android oferind suport
pentru SQLite. În această bază de date locală sunt salvate informațiile referitoare la produse,
listele de cumpărături create și retetele disponibile.
Aplic ația dezoltată de mine și prezentată în această lucrare este destinată tuturor
posesorilor de smartphone -uri cu sistem de operare Android care doresc să își facă
cumpărăturile intelige nt. Av ând o listă de cumpărături, creată pe categorii la îndemăn ă,
fieca re persoană va putea face alegerile potrivite, evitând pe cele inspirate de moment care de
cele mai multe ori sunt mult mai cost isitoare.
Pentru viitor, o dezvoltare suplimentară intersantă a aplicație i ar fi importul
cataloagelor automat , pentru fiecare m agazin în parte , fără a mai fi necesar să se introducă
manual datele referitoare la produse. Astfel prețul produselor ar fi actualizat și utilizatorul ar
fi la curent cu ofertele magazinelor. De asemenea, în cadrul aplicației se pot dezvolta
elemente care să permită personalizarea interfeței așa cum o dorește utilizatorul (setări despre
culoare la care să se țină cont de intensitate, despre fonturi ca mărime, aspect). În prezent
produsele selectate în aplicație au cantități fixe, reprezentând o unitate ( o pungă de zahăr , un
pachet de biscuiți, o ciocolată, etc) făcându -se abstracție de greutate. Ca o dezvoltare viitoare
aș vedea implementarea unui calculator de conversie a gramajelor.
În prezent, aplicația este disponibilă doar pe dispozitivele mobile care folosesc
Android , dar aceasta ar putea fi dezvoltată și pentru smartwatch (ceasuri ).
41
Bibliografie
[1] Roy Sandberg, Mark Rollins. The Business of Android Apps Development.
[2] Android OS platform version market share 2018. The statistics Portal. [Online]
[Cited : 04 3, 2018.] https://www.statista.com/statistics/271774/share -of-android –
platforms -on-mobile -devices -with-android -os/.
[3] Android Studio. Wikipedia. [Online] [Cited: 01 12, 2018.]
https://en.wikipedia.org/wiki/Android_Studio.
[4] Android software development. Wikipedia. [Online] [Cited: 01 15, 2018.]
https://en.wikipedia.org/wiki/Android_software_development.
[5] Documentation. Developer. [Online] [Cited: 01 25, 2018.]
https://developer.android.com/docs/.
[6] Laboratoare. Open CourseWare. [Online] [Cited: 05 10, 2018.]
https://ocw.cs.pub.ro/courses/eim/laboratoare/laborator02.
[7] Broadcast Announcements in Android. AlignMinds. [Online] [Cited: 06 02, 2018.]
http://www.alignminds.com/blog/broadcast -announcements -android/ .
[8] Satya Komatineni, Dave MacLean. Expert Android.
[9] Gargenta, Marko. Learning Android.
[10] Sharma, Saurabh. Process lifecycle and it types in Android. [Online] [Cited: 03 17,
2018.] http://saurabhsharma123k.blogspot.com/2013/08/process -lifecycle -and-it-
types -in.html.
[11] An Overview of Android SQLite Databases in And roid Studio. Techotopia. [Online]
[Cited: 05 21, 2018.]
https://www.techotopia.com/index.php/An_Overview_of_Android_SQLite_Database
s_in_Android_Studio.
[12] SQLite. Wikipedia. [Online] [Cited: 02 11, 2018.]
https://en.wikipedia.org/wiki/SQLite.
[13] Android SQLite D atabase. Roweb. [Online] [Cited: 04 8, 2018.]
http://www.roweb.ro/blog/android -sqlite -database/.
[14] Android Training. CredoSystemz. [Online] [Cited: 06 5, 2018.]
https://www.credosystemz.com/training -in-chennai/best -android -training -in-chennai/.
[15] Operating System Market Share, https://netmarketshare.com
[16] Android (sistem de operare)
,https://ro.wikipedia.org/wiki/Android_(sistem_de_operare)
[17] Android Application Life
cycle ,http://madhusudhanrc.blogspot.com/2012/10/android -application -life-cycle.html
[18] Android SQLite Database , https://magdamiu.com/2015/05/14/android -sqlite –
database/
42
[19] Android Tutorial: SQLite Database ,https://www.codevoila.com/post/47/andro id-
tutorial -sqlite -database
[20] Android Operating System and Advantages ,
http://www.edgefxkits.com/blog/android -operating -system -advantages/
[21] Listonic , http://help.listonic.com /en/About -Listonic
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: Dacă ne gândim la toate lucrurile pe care noi oamenii le facem într -o zi obișnuită, ne dăm seama că smartphone -urile fac parte din viața noastră de… [619569] (ID: 619569)
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.
