Aplicatie Android Pentru Firma
Această lucrare prezintă o aplicație de management a unei firme dezvoltată pe platforma Android și are ca scop gestionarea task-urilor pentru fiecare angajat în parte, fiind utilă atât managerului cât și angajaților.
Fiind o aplicație Android, compatibil cu foarte multe dispositive mobile oferă portabilitate, potrivit persoanelor care nu stau întotdeauna în fața calculatorului. În zilele noastre mulți preferă să folosească telefoanele deștepte în loc să pornească calculatorul.
Am realizat această aplicație deoarece am avut ocazia să mă familiarizez cu dezvoltarea aplicațiilor Android pe parcursul efectuării practicii de vară. Această aplicație ar fi utilă pentru mai multe firme.
În continuare voi prezenta aspectele teoretice ale proiectului, urmate de tehnologiile folosite la implementarea proiectului. Urmează apoi descrierea aplicației în cadrul căruia o să prezint structura bazei de date, structura generală a proiectului, structura aplicației, funcționalitatea și interfața acestuia, după care va urma secțiunea de securitate.
Sistemul de operare Android
“Trăim într-o lume în care comunicarea este foarte importantă în viețile noastre, iar nevoia de a fi în contact întotdeauna cu ceilalți se manifestă în toate activitățile curente. Tehnologia prezentă sprijină această nevoie, iar dispozitivele mobile reprezintă probabil exponentul cel mai de mare al acestei tehnologii. Telefoanele inteligente cu sisteme de operare din ce în ce mai avansate urmează să înglobeze în ele un mic univers al fiecăruia dintre noi.”[1]
Aplicațiile mobile sunt utilizate pe scară largă atât în domeniul entertainment dar și în domeniul business.
Android este în prezent cel mai popular sistem de operare dintre cele dedicate dispozitivelor portabile. A fost construit în jurul unui nucleu Linux, dezvoltat inițial de Google, apoi de Open Handset Alliance. [2]
Linux oferă abstractizare a hardware-ului pentru Android, permițând să fie portat pe o mare varietate de platforme. Pe plan intern, Android folosește Linux pentru gestionarea memoriei, managementul proceselor, servicii de rețea și alte servicii ale sistemului de operare.
Următorul nivel din arhitectura Android, conține bibliotecile native. Aceste biblioteci partajate sunt scrise în C și C++, compilate pentru arhitectura hardware folosită de telefoane și preinstalate pe telefon. Câteva dintre cele mai importante biblioteci Android sunt: Surface Manager, Grafica 2D și 3D, baza de date SQL, Browser-ul.
Avantajele sistemului de operare Android:
Multitasking – poate rula mai multe aplicații într-un moment.
App Market mare și deschis – MarketulAndroid (Google Play) este superior Marketului deținut de Apple, aplicațiile pot fi adăugate fără acordul Google.
Platforme hardware variate – Sistemul Android rulează pe foarte multe dispozitive mobile. Utilizatorul are la dispoziție o varietate de platforme hardware din care poate să aleagă în funcție de buget și performanțele dorite.
ROM-uri customizate – Există un grup de utilizatori care dezvoltă ROM-uri (imagini ale sistemului de operare Android) customizate ce pot fi instalate și rulate pe cele mai multe dispositive.
Integrarea cu Google și rețelele de socializare – Search pe Google direct de pe Home Screen, sunt integrate aplicațiile Gmail, Facebook, Twitter, etc.
Widgets – Home Screen-ul Android se poate fi customizat cu mai multe de widget-uri care ușurează accesul sau oferă diferite informații utilizatorului.
Open Source – Principalul avantaj Android este faptul că este open source. Astfel oricine poate modifica sistemul de operare după placul său.[3]
Diagrama din figura Fig.1.1 prezintă componentele majore ale arhitecturii sistemului de operare Android:
Fig. 1.1 – Arhitectura sistemului de operare Android[4]
O parte semnificativă a kernel-ului o reprezintă Android Runtime, care include mașina
virtuală Dalvik și bibliotecile de bază Java. Android Runtime trebuie să aibă următoarele facilități : viteza limitată a procesorului, memorie RAM limitată, baterie puternică, să nu aibă spațiu de swap și să dețină un set divers de dispozitive. Având în vedere toate aceste cerințe, o mașină virtuală a părut a fi o alegere potrivită.[4]
Sistemul management al unei firme
Structura sistemului de management pentru o firma este format din:
elemente de natură:
metodologică
decizională
informațională
organizatorică
psihosociologică
motivaționalăetc.
relațiilece se stabilesc între acestea pentru realizarea obiectivelor în condiții de eficiență
Organizarea este o știință care se ocupă cu studiul regulilor, metodelor și tehnicilor care asigură folosirea cât mai rationala a tuturor resurselor și capacităților de transformare, necesare realizării anumitor obiective, urmărind obținerea de rezultate finale optime. Repartizarea sarcinilor, gruparea acestora în departamente funcțional și alocarea resurselor pe departamente, stabilirea modului de colaborare dintre grupuri sau personae, sunt activități care aparțin funcției managerial de organizare.
Pentru ca o firmă sa funcționeze corect managerul trebuie să organizeze firma, angajații firmei și task-urile lor. Aplicația Scheduler ajută această organizare, fiind dezvoltată pe platform mobile, managerul poate adăuga, șterge sau actualiza task-uri chiar de acasă sau de pe drum. Pe de altă parte poate vizualiza dacă un task a fost sau nu rezolvat.
Tehnologii utilizate în realizarea aplicației
Pentru implementarea aplicației Scheduler am utilizat următoarele tehnologii:
Eclipse
Java
SQL
PHP
JSON
Eclipse
Eclipse este un mediu integrat de dezvoltare care ne ajută să implementăm aplicații alcătuite din framework-uri extensibile. Oferă suport pentru mai multe limbaje de programare (C, C++, Java), inclusiv pentru dezvoltarea aplicațiilor web.[5]
Platforma Eclipse include pe lângă altele JDT(Java Development Tools) care este o extensie și este suportată de toate versiunile Java.
Am folosit Eclipse pentru că este un mediu de dezvoltare (IDE) suportat official, este open-source, ușor de utilizat și oferă posibilitatea de a instala plugin-ul ADT (Android Development Tools).
Plugin-ul ADT este proiectat pentru a oferi dezvoltatorilor Android un mediu puternic, integrat în care să creeze aplicații mai ușor. ADT extinde capacitățile Eclipse-ului de a configure rapid proiectele noi în Android, de crea mai ușor interfața de utilizator aplicațiilor,de a edita facil fișierele XML, de a adăuga pachete bazate pe API-ul de Android Framework, de a detecta erorile într-un mediu grafic folosind instrumente Android SDK și ne ajută să distribuim aplicația prin exportarea fișierului .apk.[6]
Pe piață a apărut un nou mediu de dezvoltare pentru aplicațiile Android care este Android Studio, dar care are o versiune beta, nu este încă stabilă și necesită hardwer mai performant. Din acest motiv am ales Eclipse și deocamdată 95% din dezvoltatorii Android folosesc această tehnologie.
Java
Java este un limbaj de programare de nivel înalt, orientat pe obiecte, puternic tipizat, lansată de către James Gosling la Sun Microsystems și achiziționată ulterior de Oracle.
Este o tehnologie inovatoare și sunt construite o serie de platforme destinate implementării de aplicații de diverse feluri.[7]
Caracteristicile principale ale acestui limbaj sunt:
Simplitatea
Ușurința
Robustețea
Complet orientat pe obiecte eliminând astfel stilul de programare procedural
Neutralitatea arhitecturala, neținând cont de arhitectura fizică a mașinii pe care rulează
Portabilitatea este data de codul compilat și interpretat care este independent de platforma pe care rulează
Performanța
Limbajul de programare Java a fost folosit la dezvoltarea unor tehnologii dedicate rezolvării unor probleme din cele mai diverse domenii. Aceste tehnologii au fost grupate în platforme de lucru, ce reprezintă seturi de librării scrise în limbajul Java precum și diverse programe utilitare folosite pentru dezvoltarea de aplicații sau componente destinate unei anumite categorii de utilizatori[5].
Sistemul de operare Android utilizează limbajul Java, dar nu folosește librăriile standard a limbajului. Astfel toate aplicațiile Android utilizează limbajul Java cu librării predefinite de Google. Codul este rulat de către Dalvik VM în loc de JVM (Java Virtual Machine).
Dalvik este mașina virtuală (VM) din sistemul de operare Android. Este software-ul care
rulează aplicațiile pe dispozitive Android. Dalvik este parte integrantă a Android, care este de obicei folosit pe dispozitive mobile cum ar fi telefoanele mobile și tabletele. Programele sunt de obicei compilate într-o mașină de instrucțiuni independente numite bytecodes. Acestea sunt
apoi convertite din fișiere .class sau .jar compatibile Java Virtual Machine în fișiere .dex (Dalvik
Executable) compatibile Dalvik , înainte de a fi instalate pe dispozitive. Fișierele .class sunt citite de JVM la runtime. Fișierele .dex sunt mai compacte și mai eficiente decât fișierele .class, un aspect important pentru limitarea de memorie și baterie a dispozitivelor mobile. Un fișier .class conține o singură clasă, pe când un fișier .dex poate conține mai multe clase. Formatul Dalvik Executabil este special conceput pentru sisteme care sunt limitate în termeni de memorie și viteză a procesorului. [8]
Dalvik este un software open-source. Este în esență o mașina virtuală Java optimizată pentru consum redus de memorie. Permite rularea mai multor instanțe ale aceleiași mașini la un moment dat și are avantajul de securitate al sistemului de operare Linux. Spre deosebire de mașinile virtual Java care sunt mașini stivă, Dalvik este o arhitectură bazată pe regiștri. Pentru a converti anumite clase Java în format .dex este folosit un instrument numit DX. Java bytecode este de asemenea convertit în seturi alternative de instrucțiuni utilizate de Dalvik VM.
Fiecare aplicație Android rulează propriul proces cu propria instanța a unei mașini virtual Dalvik. Dalvik a fost scris, astfel că un dispozitiv poate rula mai multe instanțe ale unei mașini virtuale eficient. VM Dalvik se bazează pe kernel-ul Linux pentru funcționalitatea de bază, cum ar fi gestionarea memoriei la nivel scăzut.
Android permite programatorilor să dezvolte aplicații scrise în limbajul de programare Java, folosind bibliotecile puse la dispoziție de SDK (Software Development Kit). SDK-ul Android cuprinde un set de instrumente de dezvoltare printre care și un emulator de dispozitiv, biblioteci, documentație, program de depanare, etc.
SQL
Limbajul SQL (Structured Query Language) este un limbaj structurat utilizat pentru interogarea bazelor de date relaționale, ca origine se bazează pe algebra relațională.[9]
Acest limbaj are mai multe scopuri cum ar fi inserarea datelor, interogarea, actualizarea și ștergere acestora. Prin intermediul limbajului se poate crea si modifica scheme și se poate controla accesul la date.
Aceasta a devenit un standard în domeniu (standardizat ANSI-ISO), fiind cel mai putrnic limbaj utilizat în present pentru a crea, a modifica, a regăsi și a manipula datele de către SGBD-urile (Sistemele de Gestiune a Bazelor de Date) relaționale.[10]
Este un limbaj neprocedural și declarativ deoarece utilizatorul descrie ce date vrea să obțină, fără a fi nevoie să stabilească modalitățile de a ajunge la datele respective. [9]
Am utilizat limbajul SQL pentru a adăuga, a interoga, a actualiza, și a șterge date din baza de date folosită de aplicație. Comenzile SQL se află în fișiere PHP.
Pentru vizualiza toți angajații dintr-o firmă am folosit comanda următoare:
SELECT section_name
FROM section
Pentru a adăuga un task am utilizat următoarea comandă:
INSERT INTO tasks (job_name, observation, data_start, data_stop, ora_start, min_start, ora_stop, min_stop, holidays, section_name, client_id) VALUES ('".$job_name."','".$observation."' , '".$data_start."', '".$data_sop."' , '".$ora_start."' , '".$min_start."' , '".$ora_stop."' , '".$min_stop."' , '".$holidays."' , '".$section_name."' , '".$client_id."') '
Ștergerea unui taskse efectua cu ajutorul comenzii:
DELETE FROM tasks
WHERE task_id = $task_id";
Ca să actualizez un anumit task am utilizat comanda:
UPDATE tasks SET job_name= '".$job_name."', observation='".$observation."', data_start='".$data_start."', data_stop='".$data_stop."', ora_start='".$ora_start."', min_start='".$min_start."', ora_stop='".$ora_stop."', min_stop='".$min_stop."', holidays='".$holidays."', section_name='".$section_name."', client_id='".$client_id."'
WHERE task_id = $task_id";
Valorile variabilelor din fișierele PHP sunt defapt parametrii primiți de la obiectele JSON.
PHP
PHP este un limbaj de scripting de uz general, open source, server-side, utilizat pe scară largă, și poate fi utilizat pe majoritatea sistemelor de operare.
Sunt trei domenii principale, unde sunt utilizate scripturile PHP
Scripting de partea serverului. Acesta este cel mai tradițional și de bază domeniu al PHP.
Scripting în linia de comandă. Se poate crea un script PHP care să ruleze fără server și fără navigator web.
Scrierea aplicațiilor de birou.
Una dintre cele mai puternice și semnificative facilități ale PHP este susținerea unui larg domeniu de baze de date. Accesarea unei baze de date este incredibl de simplă utilizând una din extensiile de lucru cu baze de date (de ex. Pentru SQL), sau utilizând un nivel de abstractizare precum PDO, sau conectarea la orice bază de date ce susține standardul "Open Database Connection" cu ajutorul extensiei ODBC.[11]
În implementarea aplicației am folosit PHP în cadrul căruia sunt comenzile SQL. Aplicația accesează fișierele PHP pentru a primi datele, informațiile returnate cu ajutorul comenzilor SQL.
Conectarea aplicației cu baza de date se procedează cum se vede în figura Fig. 3.4.1
Fig. 3.4.1 – Comunicarea aplicației cu baza de date cu ajutorul fișierelor PHP
Pentru a comunica cu baza de date am folosit mai multe fișiere php, pentru fiecare comandă SQL este asociat un fișier PHP. După ce baza de date răspunde la aceste comenzi în cadrul fișierelor PHP acest răspuns este codat pentru obiecte JSON.
Un exemplu cum se trimit informțiile către obiectele JSON:
if (mssql_num_rows($result) > 0) {
$response["sections"] = array();
while ($row = mssql_fetch_array($result)) {
$sectii = array();
$sectii["section"] = $row["section"];
array_push($response["sections"], $sections);
}
$response["success"] = 1;
echo json_encode($response);
} else {
$response["success"] = 0;
$response["message"] = "No item found";
echo json_encode($response);
}
JSON
JSON(JavaScript Object Notation) este un format pentru reprezentarea și interschimbarea datelor. Este un format text, și este ușor de înțeles atât de către oameni cât și de către calculatoare.[12]
Acest format este complet independent de limbaj, dar folosește convenții care sunt familiare programatorilor din familia limbajului C, inclusiv C , C ++, C #, Java, JavaScript, Perl, Python, și multe altele. Din aceste proprietăți rezultă că JSON este un format ideal de interschimbarea datelor.
Fiecare obiect JSON este reprezentat ca și o listă de nume de proprietăți și valori conținute între acolade, iar tablourile sub forma unei înșiruiri de elemente între paranteze pătrate conform următorului format:
[{ propertyName1 : value11, propertyName2 : value21 },
{ propertyName1 : value12, propertyName2 : value22 }]
Valorile în JSON pot fi șiruri de caractere, numere de orice tip, alte obiecte JSON, valori booleene sau null.
Am folosit acest format de date pentru a transmite informațiile extrase din baza de date prin inetrmediul fișierelor PHP aplicației Scheduler.
Pentru a extrage informațiile trimise de către fișierele PHP am creat o nouă clasa JSONParser în cadrul căruia am creat o funcție care va returna obiectul JSON generat.
Descrierea aplicației
Acest capitol va trata modul în care a fost implementată aplicația destinată managementului unei firme și functionalițătiile pe care aceasta le oferă.
Structura bazei de date
În figura Fig. 4.1.1 este prezentată schema conceptual a bazei de date utilizată de aplicația Scheduler.
Fig. 4.1.1 – Structura conceptuală a bazei de date
Cum se vede în figură baza de date conține trei tabele:
Sections, care conține angajații firmei, fiecare angajat are un id unic, mai precis numele lui
Tasks, conține toate task-urile, fiecărui task I se atribuie un id unic
Clients, conține clienții firmei și fiecare client are un client_id care este unic
În fiugură sunt afișate relațiile dintre tabele, adică fiecare angajat poate să aibă una sau mai multe task-uri și fiecare client poate fi asociat pentru una sau mai multe task-uri.
Datele din aceste tabele vor fi manipulate cu ajutorul instrucțiunilor SQL scrise în fișierele PHP.
Structura generală a proiectului
Fiecare proiect Android are la bază un system de directoare ierarhizate, la fel ca și proiectele Java, dar particularitățile sunt unice pentru Android. Eclipse ne oferă o bună vizualizare a acestei structuri, cum se vede în figura Fig. 4.2.1.
Fig. 4.2.1 – Structura proiectului Scheduler
În cadrul directorului src avem un pachet numit com.example.scheduler în care vom găsi codul Java aferent proiectului Scheduler.
Directorul gen, conține două clase BuildConfig.java și R.java care sunt generate automat pentru rularea proiectului.
Directorul assets este folosit pentru a stoca fișierele pe care dorim să le includem în proiect.
res este un director care conține resursele proiectului precum: elemente grafice, designul aplicației sau descrierea unor elemente din aplicașie. Acesta este îpărțit în mai multe directoare:
drawables – pentru imagini
layout – pentru fișiere XML care descriu interfața utilizator
menu – conține specificațiile pentru meniurile din aplicație
values – pentru șiruri de caractere, matrici sau alte elemente asemănătoare
Directorul bin conține toate fișierele rezultate în urma compilării proiectului.
classes.dex – este un fișier executabil creat din clasele compilate
resources.ap_ – este o arhivă a resurselor aplicației
Scheduler.apk, acest fișier este insăși aplicația, care va fi instalată pe dispozitivul mobil
În directorul libs este explicit executabilul android-support-v4.jar. În acest modul se pot adăuga alte librării pe parcursul implementării proiectului.
Proiectul conține fișierul Android Manifest.xml în care sunt precizate informații esențiale despre aplicație : specifică pachetul Java al aplicației care trebuie să fie unic, descrie componentele aplicației (activitățiile, serviciile, etc.), declară permisiunile necesare aplicației (Internet, GPS, etc.), declară nivelul minim API necesar funcționării aplicației, specifică tipurile de ecrane suportate, definește care va fi activitatea care se va lansa când va rula aplicația.
Nivelul minim API pentru aplicația Scheduler este 11 care este echivalent cu versiunea Android 3.0. Aceasta înseamnă că aplicația este compatibilă cu toate dispozitivele mobile care rulează versiunea Android 3.0 sau o versiune mai nouă.
În consolă sunt afișate informții în momentul compilării cum ar fi: starea instalării aplicației pe dispozitiv sau rulării în emulator.
LogCat permite afișarea în timp real, în linia de comandă a log-ului telefonului, precum și posibilități de filtrare după etichete sau după nivele: debug, warning, error etc. Un avantaj al LogCat-ului este faptul că aici vor fi afișate toate excepțiile din sistem. Astfel dacă apare o excepție LogCat va afișa motivul.
Structura aplicației
O aplicație Android este compusă din una sau mai multe activități și procesul Linux, ciclul de viață al unei activități nu depinde de ciclul de viață al procesului, activitatea poate rula chiar și în cazul în care procesul nu mai există. O aplicație poate executa o activitate din altă aplicație (dacă este permis) , activitatea este executată de procesul de care aparține. Fiecare activitate are propria stare și datele acesteia pot fi salvate sau restaurate.
Activitatea este cea mai importantă component a unei aplicații deoarece este strâns legată de interfața cu utilizatorul.
O activitate are un ciclu de viață complex deoarece aplicațiile pot avea activități multiple și doar una este în prim-plan, utilizând managerul de activități, sistemul Android gestionează o stivă de activități care se găsesc în diferite stări.
Ciclul de viață a unei activități este prezentată în figura Fig. 4.3.1
Fig. 4.3.1 – Ciclul de viață a unei activități[13]
Ciclul de viață al unei activități descrie starea în care o activitate poate fi la un moment dat:
Running – Activitatea a fost creată, pornită și este afișată pe ecranul aparatului; în cazul în care activitatea a mai fost utilizată si aplicația a salvat starea acesteia, activitatea este reluată din acel punct, în această stare utilizatorul interacționează cu activitatea prin intermediul interfeței dispozitivului;
Paused – Activitatea pierde prim-planul, deoarece o altă activitate este executată, în acest caz activitatea este oprită temporar; activitatea îsi poate relua execuția și este plasată înapoi în prim-plan;
Stopped – Activitatea nu este mai în uz și pentru se oprește; pentru a fi reactivată, activitatea trebuie să fi repornită;
Destroyed – Activitatea este distrusă și memoria alocată pentru execuția activității s-a eliberat;[14]
Ca și orice aplicație Android și Scheduler conține mai multe activități. Între aceste activități există diferite relații care este reprezentată în figura Fig. 4.3.2
Fig. 4.3.2 – Structura generală a aplicației
Figura Fig. 4.3.2 prezintă chiar structura aplicației. Prima activitate, Splash Activity, este doar un intro, care conține doar logo-ul aplicației și după două secunde apare următoarea activitate, Login Activity, cu interfața de logare.
Înaine de logare utilizatorul poate seta limba și/sau adresa serverului la care să se conecteze aplicația. Aceste setări sun încadrate în activitatea Prefs Activit. Din această activitate utilizator se poate întoarce în activitatea precedent.
După logare se încarcă All Section Activity care este defapt un ListActivity și care conține lista angajațiilor. În această activiate avem doău posibilități, sau adaugăm un task pentru un anumit angajat, prin activitatea New Task Activity, sau vizulizăm task-urile unui angajat în intervalul setat, prin activitatea All Task for a Section. Această activitate ne oferă trei posibilități pentru fiecare task în parte.
Task-ul se poate modifica, prin activitatea Edit Task Activity, sau șterge.
Activitatea View Map Activity generează pe hartă ruta de la locația curentă utilizatorului până la adresa clientului pentru task-ul select.
Din activitatea All Task for a Section putem trece la activiatea New Task Activity pentru angajatul care a fost selectat în activitatea All Section Activity.
Din activitatea New Task Activity și Edit Task Activity se paote trece la activitatea Choose Client Activity care afișează lista clenților de unde poate alege utilizatorul clientul pentru un anumit task.
Funcționalitățile aplicației
Acest subcapitol descrie fiecare activitate a aplicației. Aplicația este compusă din următoarele activități:
Activitatea de introducere (Splash Activity)
Activitatea de autetificare (Login Activity)
Activitatea pentru setarea aplicației (Prefs Activity)
Activitatea pentru lista angajaților (All Section Activity)
Activitatea pentru adăugarea unui task (New Task Activity)
Activitatea pentru alegerea clientului pentru un anumit task (Choose Client Activity)
Activitatea pentru afișarea tuturor sarcinilor de lucru pentru un anumit angajat (All Tasks for a Section Activity)
Activitatea pentru editarea unei lucrări (Edit Task Activity)
Activitatea pentru afișarea rutei unei lucrări (View Map Activity)
Toate aceste activități sun foarte importante și necesare pentru managementul efficient al unei firme.
Platforma Android oferă o mare flexibilitate în construirea interfeței utilizator. De exemplu, se poate defini structura de bază a interfeței în fișierul XML, după care se poate adăuga cod în aplicație pentru a adăuga noi obiecte, sau pentru a le modifica pe cele deja definite în fișierul XML.
Avantajul definirii elementelor unei interfețe prin metoda XML este separarea interfeței de codul care controlează elementele definite. Asta înseamnă că implementarea aplicației este mult mai logică și mai ușor de urmat, ori de câte ori va fi nevoie de modificarea unui element din interfață nu va trebui decât să îi ajustăm proprietățile din fișierul XML.
Un lucru foarte la îndemână în platforma Android este sintaxa XML pentru a defini elementele interfeței. Acestea respectă aceleași reguli de definire ca și clasele sau metodele din cod, unde numele clasei corespunde cu numele obiectului iar numele metodei corespunde cu atributele pe care le acceptă obiectul.
Aceste fișiere XML sunt percepute ca fiind resurse ale aplicației, așadar se află în directorul res/layout în cadrul proiectului.
Pentru a atribui un layout unei activități trebuie inserat o linie specifică de cod în metoda OnCreate(). De exemplu:
setContentView(R.layout.splash_activity);
Activitatea Splash
Aceasta activitate este cel care se pornește când se lansează aplicația. Interfața acestuia este prezentată în figura Fig. 4.4.1.1
Această activitate utilizează un timer, pentru ca după două secunde să termine execuția și să lanseze activitatea următoare (Activitatea Login). Pentru a porni acest timer am folosit un thread cum se vede în următoarea secvență de cod:
Thread timer = new Thread(){
@Override
public void run(){
try{
sleep(2000);
} catch(InterruptedException e){
e.printStackTrace();
} finally{
Intent openStartingPoint = new
Intent("com.example.scheduler.LOGINACTIVITY");
startActivity(openStartingPoint);
}
}
};
timer.start();
Fig. 4.4.1.1 – Activitatea Splash
Activitatea Login
Interfața activității de logare conține patru câmpuri pe care utilizatorul trebuie să le completeze și un CheckBox care implicit este active cum se vede în figura Fig.4.4.2.1
Fig. 4.4.2.1 – Activitatea Login
La apăsarea butonului Login se verifică dacă dispozitivul are conexiune la Internet. Dacă da datele introduse sunt trimise la server și sunt verificate. Se mai verifică starea CheckBox-ului, dacă este în stare activă datele introduse sunt salvate în memoria dispozitivului și la următorea lansare a aplicației aceste date sunt încărcate în câmpurile respective. Verificarea CheckBox-ului și salvarea datelor introduce se realizează în felul următor:
public SharedPreferences sharedpreferences;
CheckBox cbRemember;
boolean isChecked = cbRemember.isChecked();
if(isChecked){
Editor editor = sharedpreferences.edit();
editor.putString(PrefHostname, hostname);
editor.putString(PrefDatabase, database);
editor.putString(PrefUsername, username);
editor.putString(PrefPassword, password);
editor.commit();
}
Dacă datele sunt incorecete se generează un mesaj de eroare. În scimb, dacă totul a fost în regulă se lansează activitatea All Section, care conține lista angajaților dintr-o firmă.
Activitatea Prefs
Înainte de logare dacă se apasă butonul pentru setări apare interfața activității Prefs,
unde se poate seta limba aplicației și adresa server-ului la care să se conecteze aplicația. Limba implicită este engleza, iar adresa implicită a server-ului este : www.classoft.ro/ANDROID_PHP.
Pentru setarea adresei serverului am utilizat un EditTextPreference iar pentru setarea limbii un ListPreference.
Dacă se schimbă una dintre setări activitatea se lansează din nou, pentru modificarea interfeței în funcție de valoarea setată. Pentru acest scop am utilizat metoda OnSharedPreferencesChanged cum se vede din codul următor:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
// TODO Auto-generated method stub
Intent intent = getIntent();
finish();
startActivity(intent);
}
Figura Fig. 4.4.3.1 prezintă intefața activității de setare.
Fig. 4.4.3.1 – Activitatea Prefs
După relizarea setărilor se revine la activitatea de logare prin apăsarea butonului Back.
Activitatea All Section Activity
Interfața acestei activității conține o listă, două DatePicker-e pentru a seta intervalul dorit și un buton de afișare cum se vede și în figura Fig. 4.4.4.1
Fig. 4.4.4.1 – Activitatea All Section
Lista este încărcată cu ajutotorul unui adaptor care interpretează un HashMap în care sunt memorate informațiile extrase din obiectul JSON.
Încărcarea HashMap-ului:
JSONObject json = jParser.makeHttpRequest(url_all_sectii, "POST", params);
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
sectii = json.getJSONArray(TAG_SECTII);
for (int i = 0; i < sectii.length(); i++) {
JSONObject c = sectii.getJSONObject(i);
String id = c.getString(TAG_SECTIE);
String acces = c.getString(TAG_ACCES);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_SECTIE, id);
listaSectii.add(map);
}
După ce informmațiile dorite au fost încărcate în HashMap se folosește SimpleAdapter pentru încărcarea listei:
protected void onPostExecute(String file_url) {
runOnUiThread(new Runnable() {
public void run() {
ListAdapter adapter = new SimpleAdapter(
AllSection.this, listaSectii,
R.layout.list_item_section, new String[] { TAG_SECTIE },
new int[] { R.id.sectii});
setListAdapter(adapter);
}
});
}
Cele două DatePicker-e sunt setate implicit să afișeze data curentă. În implementarea lor am folosit diferite verificări ca data de început să fie în totdeauna mai mică sau egală cu data de sfârșit.
La apăsarea butonului + pentru un anumit angajat se memoreazaă id-ul angajatului și se trimite ca și parametru la activitatea New Task Activity, astfel aplicația va știe cărui angajat trebuie să adauge noul task. Acest buton este restricționat pentru unii utilizatori.
Pentru a vizualiza task-urile unui anumit angajat pe un anumit interval trebuie selectat angajatul dorit și setat intervalul dorit cu ajutorul celor două DatePicker-e, după care se apasă butonul Show tasks. Ca urmare se lansează activitatea All Tasks for a Section.
Activitatea New Task
Această activiate se poate lansa din activitățile All Section și All Task for a Section. În figura Fig. 4.4.5.1 se poate observa interfața acestuia care conține mai mule câmpuri care trebuie completat de către utilizator, DatePicker-e, TimePicker-e un CheckBox și un buton de adăugare.
Pentru ca utilizator să vadă tot conținutul ecranului am utilizat un ScrollView. Pentru câmpurile etichetate ca Job și Observation am adăugat o limiatare de 100 și respective 249 de caractere. Dacă lungimea textului introdus în ambele cazuri depășește această limită se va genera un mesaj de eroare.
DatePicker-ele sunt setate implicit ca și în activitatea All Section Activity și sunt verificate la fiecare modificare.
TimePicker-ele sunt configurate ca utilizatorul să poată aleagă pentru a seta minutele între 00 sau 30. Primul TimePicker este setat implicit să afișeze ora curentă, iar al doilea să afișeze ora curentă + 1. Pentru acest scop am utilizat un CustomTimePickerDialog care este extins din clasa TimePickerDialog.
Dacă utilizatorul activează CheckBox-ul Holidays însemnă că acest task este de fapt un concediu.
Fig. 4.4.5.1 – Activitatea New Task
Pentru a alege clientul pentru un anumit task trebuie apăsat butonul Choose după care se încarcă activitatea Choose Client.
La apăsarea butonului Add Task task-ul este adăugat în lista task-urilor pentru angajatul respectiv și se revine la activitatea precedentă.
Activitatea Choose Client
Activitatea Choose Client este utilizat pentru a alege un client pentru un anumit task și se poate porni din activitățile de adăugare și de modificarea task-ului respectiv prin apăsarea butonului Choose. Are următoarea interfață (Fig.4.4.6.1):
Fig. 4.4.6.1 – Activitatea Choose Client
Pentru a căuta un client trebuie introdus cel puțin trei caractere după care se apasă butonul Search. Această tehnică îmunătățește performanța aplicației deoarece dacă o firmă are foarte mulți clienți timpul de încărcarea a clienților ar fi foarte mare.
După ce s-a încărcat lista, utilizatorul poate alege clientul dorit prin selectarea acestuia. Aplicația va cere comfirmarea utilizatorului, după cum se vede în figura Fig. 4.4.6.2
Fig. 4.4.6.2 – AlertDialog pentru comfirmarea clientului ales
Dacă se alege Yes se va transmite datele clientului activității precedente, adică activității New Task sau activității Edit Task iar câmpurile etichetate ca și Client și Client Code vor fi comletate cu aceste date. În schimb dacă se alege No utilizatorul poate să aleagă un alt client din listă sau să efectueze o nouă căutare.
Activitatea All Tasks for a Section
Această activitate se lansează din activitatea All Section și încarcă lista cu task-urile angajatului selectat. La rândul lui fiecare task se poate modifica, șterge și vizualiza ruta lui. Activitatea are următoarea interfață (Fig. 4.4.7.1):
Fig. 4.4.7.1 – Activitatea All Tasks for a Section
Apăsarea butonului Edit oferă posibiliatea de a modifica task-ul specificat și cu ajutorul unui handler de evenimente se lansează activitatea Edit Task pentru task-ul respectiv, transmițând id-ul task-ului pentru identificarea acestuia.
Pentru a șterge un anumit task trebuie apăsat butonul Delete, care este tratat tot cu un event handler, se trimite id-ul task-ului respectiv la server și printr-o comandă SQL taskul este eliminat din baza de date. Înainte de a șterge task-ul aplicația așteaptă comfirmarea utilizatorului generând un AlertDialog cum se vede în figura Fig. 4.4.7.2
Fig. 4.4.7.2 – AlertDialog pentru comfirmarea ștergerii task-ului
Dacă utilizatorul alege Yes task-ul se va șterge și aplicația va actualiza lista task-urilor, altfel nu se va întâmpla nimic.
Utilizatorul are posibilitatea de a vizualiza traseul task-ului, adică în funcție de adresa curentă a utilizatorului și adresa clientului asociat task-ului respectiv se va afișa ruta pe hartă. Pentru aceasta se va lansa activitatea View Map.
Activitatea Edit Task
Interfața acestei activități este asemanătoare cu interfața activității New Task cum se vede și în figura Fig. 4.4.8.1
Fig. 4.4.8.1 – Activitatea Edit Task
Datele task-ului sunt cerute din baza de date pe baza id-ului taskului. Prin intermediul acestei activități se poate modifica clientul, numele lucrării, observația, data și timpul task-ului. După modificările efectuate la apăsrea butonului Save Task sunt verificate corectutidinea datelor și dacă da datele sunt valide sunt trimise la server pentru a le modifica în baza de date, după care se reîncarcă actvitatea precedent,All Tasks for a Section cu lista actualizată.
Activitatea View Map
Această activitate are interfața prezentată în figura Fig. 4.4.9.1 și este lansată din activitatea All Task for a Section apăsând butonul Map pentru task-ul dorit
Fig. 4.4.11
Activitatea va primi adresa clientului de la baza de date și va cere de la sistem locația utilizatorului. După ce a aflat aceste informații se va genera ruta cu ajutorul Google Maps-ului.
Pentru a detecta locația curentă am utilizat clasa MyLocationListener.
În implementarea interfeței am folosit un WebView care încarcă adresa URL a Google Maps-ului cu parametrii date în aplicație.
Detectarea locației se realizează în felul următor:
MyLocationListener locationListener = new MyLocationListener();
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, locationListener);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Securitatea aplicației
Aplicația se poate conecta la orice bază de date în cadrul oricărui server știind informațiile necesare și baza de date să aibă aceiași structură ca baza de date demo. Pentru ca aplicația să fie securizată, am creat utilizatori care să aibă acces la baza de date utilizată de aplicație. Fiecare utilizator este asociat cu un angajat și fiecare trebuie sa aibă permisiuni bine predefinite. Aplicația implementează și această funcție.
Exista trei tipuri de utilizatori:
Administrator, adică managerul firmei care poate să vizualizeze, să modifice și să șteargă task-urile oricărui angajat
Angajatul vechi, acest tip de utilizator poate vizualiza toate task-urile angajaților dar nu poate șterge sau edita doar task-urile lui
Angajatul nou, acest tip de utilizator nu poate vizualiza numai task-urile lui
Fiecărui tip de utilizator este asociat un număr (0 – administrator,1 – angajat vechi, 2 – angajat nou) și acest număr este salvat într-o variabilă după logare, și este trimis ca și parametru de la o activitate la alta împreună cu numele de utilizator, parola, numele bazei de date, numele stației, id-ul limbii (1 – engleză, 2 – română) și adresa server-ului.
Avem nevoie de acești parametri deoarece când se face o cerere la server fișierul PHP cu ajutorul acestor parametrii se conectează la baza de date și generează comanda SQL dorită.
În cadrul activităților sunt verificate permisiunile utilizatorului, astfel angajatului nou este restricționat vizualizarea task-urilor pentru restul angajațiilor iar pentru angajatul vechi este restricționat butoanele de Edit și Delete pentru restul angajaților.
Concluzii
Bibliografie
[1] – http://aplicatii-mobile.ro/aparitie-editoriala/
[2] – Gargenta, M. (2011). Learning Android.
[3] – http://androidgeek.ro/ce-este-android/
[4] – http://www.worldit.info/wp-content/uploads/2012/09/image001.png
[5] – https://fii-liber.ro/eclipse-ide
[6] – http://developer.android.com/tools/sdk/eclipse-adt.html
[7] – Curs practic de Java – Cristian Frăsinaru
[8] – Ehringer, D. (2010). The Dalvik virtual machine architecture.
[9] – http://vega.unitbv.ro/~cataron/Courses/BD/BD_Cap_5.pdf
[10] – http://ro.wikipedia.org/wiki/SQL
[11] – http://php.net/manual/ro/intro-whatcando.php
[12] – http://json.org/
[13] – http://image.slidesharecdn.com/c02aplicatii-120318191437-phpapp02/95/curs-android-c02-aplicatii-ipw-2011-12-728.jpg?cb=1332474041
[14] – http://www.itcsolutions.eu/2011/09/08/android-tutorial-concepte-activitati-si-resurse-ale-unei-aplicatii-android/
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: Aplicatie Android Pentru Firma (ID: 149409)
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.
