Managementul Activitatii Unui Depozit
LUCRARE DE LICENȚA
Managementul activitatii unui depozit
CUPRINS
Introducere
În sistemul logistic al firmelor, evoluția depozitelor în ultimele decenii a fost influențată de dezvoltarea economică, creșterea cererii și satisfacerea clientului într-un timp cât mai scurt, în locul și momentul potrivit, toate acestea determinându-i pe specialiștii în domeniu să găsească și să implementeze cele mai bune soluții pentru simplificarea gestiunii unui depozit.
Această licență are că aplicabilitate practică o aplicație pentru dispozitivele mobile, folosind limbajul Java. Aplicația se numește WMS App, Aplicație pentru Sistemul de Managament al unui Depozit. Rolul acesteia este de a obține rezultate cât mai bune din punct de vedere al eficienței orelor de muncă și de a scădea numărul erorilor umane care se pot produce. De exemplu, se va automatiză procesul de depozitare și se optimizează activitățile de recepție, colectare și expediere a mărfurilor.
Prezența lucrare este structurată pe trei capitole de sine stătătoare, care ilustrează modalitatea de organizare din cadrul unui depozit și implementarea unei tehnologii pentru a ușura muncă angajaților unui depozit, cu ajutorul dispozitivelor.
Astfel, primul capitol tratează noțiuni teoretice ale managementului unui depozit, precum aprovizionarea, stocurile, mărfurile și desfacerea lor. De asemenea, cea mai mare parte a acestui capitol este dedicată depozitului, mai exact rolul acestuia, utilitatea, funcțiile, clasificarea, etapele activității de depozitare, amplasarea depozitelor și aranjarea produselor în depozit și cerințele în ceea ce privește proiectarea.
Cel de al doilea capitol tratează componentele Android API, dezvoltate cu ajutorul limbajului de programare Java, utilizate în aplicație. Acestea corespund nivelului 17 al Interfeței pentru Programarea de Aplicații, deoarece se dorește că aplicația să poată rula pe sisteme de operare ce au minim Android 4.2.2.
Ultimul capitol conține descrirea propriu-zisă a aplicației. Mai exact, acesta extinde capitolul anterior, deoarece sunt utilizate bazele construite Android API, creând propriile clase și metode. De asemenea, sunt surprinse elemente de Design Patterns. Cele prezente în aplicație sunt Singleton, Decorator și Chain of Responsability.
Capitolul 1 Activitatea unui depozit
1.1. Depozitul – definitie
În cadrul unei firme, depozitele au un rol esențial în continuitatea activității de producție, contribuind la depozitarea materiilor prime necesare în activitatea zilnică dar și de stocare a produselor finite rezultate.
Putem consideră depozitul că fiind o clădire, un fel de construcție sau un spațiu special amenajat cu tot echipamentul specific derulării operațiilor legate de manipulare, dar și de păstrare a materialelor sau a produselor finalizate. Datorită existenței depozitelor, procesul de producție poate fi continuat fără întrerupere în secțiile de baza, totodată cererea fiind satisfăcută. Magazia reprezintă un spațiu pentru depozitarea materiilor prime, a stocurilor și a bunurilor în curs de prelucrare. (Janeta Sârbu)
Depozitarea este totalitatea unor activități ce constau în crearea, utilizarea și gestionarea unor locuri de păstrare a stocurilor de produse. Cu ajutorul depozitării, profitul firmei va începe să crească. Firma stabilește numărul depozitelor, dar și aranjamentul sau interior, potrivit logisticii. ( Logistică și distribuția mărfurilor; Alexandru Burda)
1.1.2. Rolul depozitelor
Depozitele au un rol esențial în activitatea unei firme, contribuind la obținerea profitului prin îndeplinirea misiunii logistice, de asigurare a produsului, materiei prime, materialelor, în cantitatea necesară, la momentul potrivit și în locul potrivit.
Rolul depozitelor este multiplu, nu se limitează doar la păstrarea unor mărfuri, acesta constând în:
a) coordonarea ofertei cu cererea
-incertitudinii referitoare la cerere. Stocul oferind posibilitatea de a satisface cererea în perioadele de vârf.
-incertitudini privind ciclul de performanță. Onorarea comenzilor clienților că urmare a primirii mărfurilor de la furnizori, la momentul potrivit.
-cererea sezonieră, impune crearea de stocuri
-producția sezonieră. Rolul depozitelor fiind acela de păstrare și distribuire a mărfurilor pe tot parcursul anului.
b) obținerea de economii de costuri.
-achiziționare. Obținerea de discounturi cantitative oferite de furnizori și valorificarea acestora
-producție. Diminuarea costurilor că urmare a producției în loturi mari, mai bună utilizare a capacității de producție, reducerea costurillor pe unitatea de produs.
-transport. Creșterea cantităților de produse comandate furnizorilor, duc la scăderea numărului operațiunilor de transport .
c) continuarea sau amânarea producției/prelucrării. Procesul de producție/prelucrare poate continuă în spațiile de depozitare (vinuri, brânzeturi și fructe), prin învechirea sau coacerea produselor.
d) îndeplinirea unor obiective de marketing. Spațiile de depozitare având rolul de satisfacere a cerințelor clienților, astfel:
-reducerea timpului de livrare, prin amplasarea depozitelor în apropierea clienților
-adăugarea de valoare, oferind servicii speciale în conformitate cu cerințele clienților.
-creșterea prezenței pe piață. O treaptă mai înalta a funcției logistice oferită clienților afectează direct nivelul vânzărilor și implicit asupra creșterii cotei de piață. (Carmen Bălan, 2006, pp. 214-216)
1.1.3. Utilitatea depozitarii
Pentru firmele din domeniul producției și distribuției, rolul depozitelor în sistemul logistic au un rol esențial. Acestea dispun de spații de depozitare proprii, închiriate sau special dedicate în baza unui contract în funcție de necesitățile lor. (Carmen Bălan, 2006, p. 214)
1.1.4. Functiile depozitelor
Depozitele pot îndeplini mai multe funcții potrivit specificului și a rolului pe care îl au. Aceste funcții pot fi influențate și modul cum sunt gândite și exploatate de proprietar sau utilizator dar și de specificul furnizorilor sau al clienților.
Astfel, putem distinge câteva funcții distinct ale depozitelor, cum sunt:
a) păstrarea mărfurilor ;
Mărfurile pot fi stocate și păstrate, o perioada mai mare de timp , un anumit sezon sau pe o peroada limitată.
b) consolidarea livrărilor;
Mărfurile provenite de la mai mulți furnizori se reunesc pentru a fi distribuite unui client. Astfel se obțin avantaje la transport și la distribuție prețul reducându-se considerabil.
c) divizarea lotului;
Mărfurile primite de la un singur producător sunt fragmentate și grupate pe comenzi individuale ale clienților, depozitul păstrând produsele o perioada scurtă de timp.
d) realizarea de structuri sortimentale.
– depozitul livrează o combinație de produse de la mai multe fabrici ale aceluiași producător unui singur client;
– mai multe sortimente de produse de la firme diferite sunt livrate unui singur client;
e) adăugarea de valoare serviciilor.
Produsele sunt reambalate ,etichetate, în funcție de preferințele clienților purtând marca privată (de distribuitor) a clientului. (Carmen Bălan, 2006, pp. 216-219)
1.1.5. Clasificarea depozitelor
"Datorită dezvoltării economice, este necesară o clasificare a acestora în funcție de mai mult criterii:
-după construcția tehnică, pot fi:
-depozite deschise(descoperite);
-depozite semideschise;
-depozite închise(acoperite);
-în funcție de specializarea lor, sunt:
-depozite universale(în care se păstrează o gama variată de resurse materiale sau produse finite);
-depozite specializate(în care se păstrează doar anumite resurse materiale sau produse finite);
-în funcție de tipul materialelor depozitate, sunt:
-depozite pentru materii prime;
-depozite pentru produse finite;
-depozite pentru combustibili;
-depozite pentru semifabricate;
-depozite pentru mijloace tehnice;
-depozite pentru ambalaje;
-depozite pentru deșeuri, etc.;
-în funcție de volumul activatii, pot fi:
-depozite centrale(care deservesc toată întreprinderea);
-depozite de secție(care deservesc o singură secție);
-depozite de ateliere(care deservesc un atelier);
-din punct de vedere al destinației, sunt:
-depozite care deservesc procesele de producție și procesele de circulație(exemplu: depozitele de produse finite);
-depozite care deservesc doar procesele de producție(exemplu: depozitele de materii prime, semifabricate, combustibil, ambalaje, etc.)." (Janeta Sârbu)
O altă clasificare o reprezintă formă de proprietate:
"1. Depozitele private
Sunt depozite aflate în proprietatea și managementul firmei care deține bucurile păstrate și manipulate în interirul sau. Reprezintă o investiție de capital din partea proprietarului în sptatiul de păstrare a produselor și în echipamentele de manipulare necesare. Utilizarea lor este justitficata în condițiile în care firma satisface o cerere substanțial și contanța.
2. Depozitele publice
Sunt depozite care aparțin firmelor specalizate în operațiuni de depozitare și/sau logistice, care oferă contra cost servicii specififice clienților interesați, cel mai adesea producătorii sau distribuitorii cu ridicată. Ele satisfac necesitățile de depozitare temporare, din perioadele de vârf a cererii și sunt amplasate între producători și piețele pe care își comercializează bunurile. Prin natură lor, depozitele publice deserves simultan mai mulți client care au nevoie de spații de păstrare a produselor și de servicii conexe și oferă o serie de avantaje de baza și specific.
3. Depozitele contractuale
Sunt o varianta de pozitare publice, diferite de acestea prin faptul că între terțul specializat în depozitare și utilizator se încheie un contract de prestare servicii pe termen lung și în exclusivtate. Mai exact, depozitul contractual este utilizat de un singur beneficiar în loc de mai mulți (Lambert, Stock și Ellram, Fundamentals of Logistics Management 1998, 273). Funcționarea unui depozit contractual are la baza un aranjament pe termen lung reciproc avantajos de furnizare a unor servicii dedicate și adaptate necesităților specific ale unui singur utilizator, în care riscurile operațiunilor sunt împărțite între furnizorul de servicii și beneficiar (Ackerman, Contract Warehousing – Better Moustrap, or Smoke and Mirrors? 1993). Serviciile specific oferite de această categorie de depozite sunt de natură logistică și de transport, de control al stocurilor, de prelucrare a comenzilor și de vânzare.” ( Logistică și distribuția mărfurilor; Alexandru Burda )
1.1.7. Etapele necesare activitatii de depozitare
"Activitatea oricărui depozit constă în parcurgerea unor etape, cu ajutorul cărora se urmărește întreg procesul de recepție, păstrare și eliberare resurselor materiale și produse finite:
1) Primirea spre depozitare a mărfurilor, materialelor, produselor finite
– se pregătesc rampele de primire;
– se amenajează locurile sau suprafețele de recepție;
– se pregătesc mijloacele și mecanismele de ridicat și transport;
– se efectuează recepția mărfurilor, materialelor, produselor finite;
– se efectuează controlul calității produselor;
– se întocmește documentația de recepție-primire, etc.;
2) depozitarea propriu-zisă
– amplasarea resurselor materiale sau produselor finite în funcție de mai multe sisteme de așezare: în partizi, pe complete, conform nomenclaturii(pe șorțuri);
– păstrarea în condiții optime a mărfurilor, materialelor, produselor finite(temeratura, umiditate etc.) conform proprietăților fizico-chimice, în scopul asigurării integratatii lor cantitate și calitative;
3) pregaturea mărfurilor, materialelor, produselor finite pentru expediere
-verificarea mărfurilor, materialelor, produselor finite din punct de vedere calitate;
-verificarea cantității cerute;
-verificarea numărului de loturi și a tipurilor de produse;
-verificarea ambalajului etc.;” (Janeta Sârbu)
“4) expedierea mărfurilor
– acoperirea și descoperirea cu prelate a vehiculului sunt în sarcina transportatorului;
– încărcarea vehiculului este în sarcina expeditorului pentru încărcături mai mari de 3 tone
– călărea și amărârea sunt în sarcina expeditorului;
– atenționarea transportarului în legătură cu orice particularități ale mărfurilor (periculoase, perisabile etc.);
– trebuie o etichetare clară pe fiecare colet sau obiect;
– când natură mărfurilor o necesită, această trebuie ambalată pentru a suportă transportul și diversele manipulări;
– expeditorul furnizează transportatorului, odată cu marfă, documentele de însoțire și informațiile necesare în caz de reglementări particulare, cum ar fi vama, mărfurile periculoase etc.” ( Logistică și distribuția mărfurilor; Cristinel Vasiliu, Mihai Felea, Irina Mărunțelu, Gheorghe Caraiani)
1.1.8. Amplasarea depozitelor si aranjarea produselor in depozit
„Amplasarea depozitelor respectiv aranjarea mărfurilor în interiorul acestora influențează în mod direct felul în care este satisfăcută cererea, în condițiile îndeplinirii în mod direct felul în care este satisfăcută cererea, în condițiile îndeplinirii misiunii logisticii mărfurilor la nivelul firmelor care le utilizează și a posibilității de reducere a costurilor logistice totale.” ( Logistică și distribuția mărfurilor; Alexandru Burda )
Amplasarea depozitelor
„Numărul și amplasarea depozitelor sunt determinate de poziția unităților de producție față de piață clienților și respectiv de caracteristicile bunurilor. În activitatea comercială se utilizează că variamte de amplasare a depozitelor.
1. Amplasarea depozitului în apropierea pieței clientului. În acest caz, acesta va deservi în primul rând clienții cheie, iar aria geografică deservită va depinde de vitează livrărilor, de mărimea medie a comenzii și de costul unitar al livrării locale.
Avantaje:
-Costurile de transport relativ mci, datorate aprovizionării în cantități și la intervale de timp mari;
-Sortimentul de produse păstrate relativ variat;
-Posibilitatea aprovizionării fiecărui client cu cantități de bunuri mai mici decât dacă sunt preluae direct de la furnizor;
-Posibilitatea completării mai rapidă a stocurilor clienților.
2. Amplasarea depozitului în apropierea unității de producție a fabricantului sau procesatorului, funcțiile principale pe care le îndeplinește depozitul sunt combinarea produselor și respectiv consolidarea livrărilor.
Avantaje:
-Facilitatea obținerii de către client a unui sortiment constituit din produse fabricate de diferite unități;
-Reducerea costurilor de transport prin consolidarea livrărilor către clienți;
-Posibilitatea clienților de a comandă o cantitate mică din fiecare produs;
-Simplificarea, pentru client, a operațiunilor de urmărirea livrărilor efectuate de furnizor, datorită primirii mai multor produse, cu o singură factură.
3. Amplasarea intermediară a depozitului. În acest caz, acesta este poziționat între clienți și furnizori, iar proximitatea față de clienți sau de unitățile de fabricație nu prezintă o importantă semnificativă. Funcțiile principale ale acesotr depozite sunt consolidarea și crearea sortimentului. Cu ajutorul acestor depozite la un cost logistic total scăzut, se livrează fiecărui client structura sortimentală dorită.” ( Logistică și distribuția mărfurilor; Alexandru Burda )
Aranjarea produselor în depozite
„Urmărește o serie de obiective cum ar fi reducerea construilor de manipulare, utilizarea maximă a spațiului de depozitare, îndeplinirea unor cerințe privind compatibilitatea produselor, preluarea produselor pentru alcătuirea comenzilor sau securitatea și evitarea incendiilor.
Importantă preluării produselor din spațiile de depozitare este determinată de costurile de manioulare pe care le presupune. Modalitățile de preluare a produselor pentru constituirea comenzilor sunt:
1. Selecția individuală – produsele sunt preluate pe rând, unul câte unul;
2. Ruta de prealuare – personalul responsabil de manipularea produselor parcurge în depozit o anumită rupă pe parcurul căreia preia produsele;
3. Aria repartizată pe lucrător – fiecare lucrător din depozit este responsabil de o anumită zona din care preia produsele care trebuie livrate.
Criteriile de aranjare a produselor în depozit sunt:
1. Complementaritatea produselor – acestea vor fi amplasate în apropiere, ținându-se cont de rutele de preluare;
2. Compatibilitatea produselor – acestea vor fi amplasate în funcție de caracteristicile de calitate, după principiul merceologic;
3. Frecvența solicitării produselor – cu circulație rapidă, preluate din stoc în cântați mai mici decât cele în care este furnizat, vor fi amplasate mai aproape de punctele de expediere spre clienți;
4. Mărimea produselor – cele de dimensiune mici se amplasează mai aproape de zonele de expediere.
Poziționarea stocurilor de produse reprezintă modul în care sunt amplasate paletele față de culoarele de acces. Cele mai utilizate variante sunt cea perpendiculară și respectiv cea într-un unghi de până la 60 de grade.” ( Logistică și distribuția mărfurilor; Alexandru Burda )
1.1.9. Cerinte impuse la proiectarea depozitelor
"Construcția pardoselilor depozitelor acoperite, a celor semideschise și a platformelor descoperite trebuie să rezite la sarcinile statice constituite din unitățile de încărcătură așezare pe mobilier sau stive. Din punctual de vedere al uzării, tebuie să facă față sarcinilor dinamice concentrate pe roțile utilajelor de manipulare ce apar datorită oprililor bruștelor, frânelor, întoarcerilor etc. sis a prezinte duritatea și rezistență necesară la uzură corespunzător solicitărilor mecanice la care este supusă prin presiunea roților . Solicitarea stratului de uzare determina în funcție de diametrul și materialul roților , precum și de sarcina pe roată. Suprafață stratului de uzare se determina în funcție de diametrul și materialul roților, precum și de sarcina pe roată. Suprafață stratului de uzare trebuie să fie plata, iar pentru depoztate specific uleiurilor, sucurilor etc. trebuie să reziste la agenții chimici. Pantele pardoselilor pentru scurgerea apei să nu depășească 1,5%, iar în zonele de stivuire, 1%. Pantele vor fi astfel soluționate încât să nu creeze praguri laterale, racordarea lateral la pardoseală făcându-se , de asemenea, cu pante a căror înclinare să nu depășească 1,5%.
Pantele de acces la rampă, în depozitele situate la nivelul rampei sau în cazul accesului la depozite subterane ori pe niveluri supraetajate se stabilesc de la caz la caz, în funcție de caracteristicile constructive ale utilajelor de manipulare, dar fără să depășească 10%.
Deschiderile și traveele se aleg în funcție de tehnologia de depozitare, dimensiunile și așezarea stivelor, necesitatea asigurării circulației mijloacelor de maniplare-transport intern, cu respectarea prevederilor STAS, avându-se în vedere că un număr mare de stâlpi împiedică folosirea eficientă a spațiului de depozitare și stânjenește circulația în depozit.
Ușile de acces în depozite se proiectează având în vedere gabaritul utilajelor de manipulare și al mijloacelor de transport, astfel încât deschiderea și închiderea lor să nu afecteze în niciun fel spațiile de depozitare și curculatie în interiorul construcției și de pe rampe( ușile glisante fără praguri sunt cele mai indicate în acest scop); pentru depozitele la sol sau pe platformele descoperite trebuie create posibilități de acces al autovehiculelor și transcontainerelor în zonele afectate primirii sau expedierii mărfurilor.
Rampele depozitelor se proiectează și se dimensionează pentru a permite circulația utilajelor de manipulare și, eventual, de transport intern cu mărfuri, fiind foarte eficientă realizarea unei lățimi care să asigure întoarcerea utilajelor de manipulare. Astfel, dimensiunile minime recomandate pentru rampe înalte de încărcare-descărcare a paletelor de tip EURO, în mijloace auto sau feroviare, aferente depozitelor închise sunt de 2,25 m pentru cazul circulației într-un singur sens și de 3.5 m pentru circulația în două sensuri. Înălțimea palierului de primire-expediere a rampei trebuie să asigure încărcarea la același nivel cu vagoanele sau mijloacele auto, fiind 1,1 m deasupra ciupercii șinei de C.F., respective de 1.2 m deasupra cotei platformei de acces pentru mijloacele auto.
Copertinele și depozitele semideschise, în general, se proiectează în funcție de caracteristicile produselor și ambalajelor și de posibilitățile de manipulare a utilajelor alese prin studiul de cercetare, Lungimea copertinei se stabilese în funcție de numărul locurilor de încărcare-descărcare și, eventual, de necesitățile de depozitare temporare. Lățimea depozitelor semideschise se recomandă a depăși cu cel puțin 0.5 m lățimea locurilor prevăzute pentru operațiilor e încărcare-descărcare sau a palierului depozitului. Înălțimea trebuie să permită trecerea și manipularea utilajelor, accesul și încărcarea în/din mijloacele de transport sau transcontainere după caz.
Instalațiile de iluminat, încălzire, apă și canal, ventilație și cele împotriva incendiilor se amplasează în depozite astfel încât să nu împiedice sau să blocheze activitatea de manipulare-depozitare-transport intern. Iluminarea trebuie astfel asigurată încât să fie vizibile corespunzător toate nivelurile și pozițiile unităților de încărcătură, atât în procesul de depozitare, cât și în cel de mișcare interioară.
Un principiu de baza la proiectarea depozitelor îl reprezintă modul de circulație a mărfurilor în incinta acestora. În funcție de acest criteriu în figura 6.1 se prezintă câteva scheme de organizare a spațiilor, valabile tat pentru depoziele acoperite, cât și pentru cele descoperite, în care notațiile au următoarele semnificiatii: P – zona de primire; E – zona de expediție; L – zona de depozitare cu frecvența lentă; M – zona de depozitare cu frecvența medie; I – zona de depozitare cu frecvența intensă.
În figura 6.1, a este prezentat un depozit cu circulație liniară și marufirle amplasate longitudinal, în care intrarea se face pe la un capăt și ieșirea pe la celălalt, cu trecere prin zone diferite de lucru. Sistemul este eficient pentru stocuri cu rulaje medii. Avantajul principal constă în posibilitatea efectuării operațiilor multiple și a introducerii și scoaterii mărfurilor din depozit cu aceeași viteză, deci, cu ritmuri de intrare și de ieșire(expediere) apropiate.
Depozitul cu circulație liniară și mărfuri amplasate transversal din figura 6.1, b permite intrarea mărfurilor pe la un capăt și ieșirea pe la celălalt, cu trecere orin toate zonele de lucru, Sistemul este eficient pentru mărfuri cu frecvența marila ieșire.
Depozitul cu circulație în formă de L din figura 6.1, c permite depozitării cu durate mari pentru unele mărfuri și mici pentru altele. Depozitul este foarte eficient pentru mărfuri cu frecvente mari la ieșire.
În figura 6.1, d este prezentat un depozit cu circulație în formă de U, eficicent pentru mărfuri cu durate mari sau medii de depozitare. Amplasarea zonei I între primire și expediere permite o frecvența bună de intrare și ieșire pentru produse cu circulație rapidă. Deși prezintă dezavantajul unor drumuri lungi de circulație, sistemul permite utilizarea extrem de eficientă a rampelor de încărcare-descărcare.
În figura 6.1, e este prezentat un depozit cu itnrare și ieșire pe o singură parte. Acesta este eficient pentru șorțuri de mărfuri puține la număr, dintre care unele cu frecvența foarte mari la ieșire.
Depozitul din figura 6.1, f, c intrări – ieșiri pe ambele părți, permite o mare mobilitate și depozitarea unui șorț ridicat de mărfuri. Sistemul este dintre cele mai noi și eficiente, dar necesită o serie de reconsiderări asupra gestiunilor clasice." (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
1.2. Aprozionarea, parte integranta a procesului de depozitare
"Aprovizionarea, indiferent de mărimea agentului economic, (din punct de vedere a valorii și structurii capacităților de producție, capitalului social, cifrei de afaceri sau profitului) rămâne un proces complicat și permanent, deschis oricăror posibilități concrete de reconsiderare în sensul îmbunătățirii conținutului și funcționalității, astfel încât rolul și scopul acestuia, să fie dirijat cu efort minim spre randamentul maxim.
Pentru că schimbarea a devenit de-acum o necesitate obiectivă, și în domeniul aprovizionării, un interes deosebit prezintă organizarea în sistem Centru de gestiune – Profit. O asemenea varianta prezintă o serie de avantaje față de alte sisteme:
-posibilitatea de a dispune în limita unor răspunderi precise de un buget de cheltuieli alocat scopului de a achizitioona, numai de la furnizori agreați, auditati, resursele pentru producție: materii, materiale, echipamente tehnice, repere, piese, subansamble, bunuri, servicii și altele, în condițiile precizate, în exclusivitate de caietul de sarcini și alte documente ajutătoare convenite de parteneri(grafice de livrări, programare de producție, stocări, transporturi, etc);
-specializarea, la nivel de înalta competență pe întreg traiectul răspunderilor – gestiune, cercetare piață, cumpărări – aprovizionare, studii de produs etc. – prin "împingerea spre nou a fiecărui angrenaj, a fiecărei piese"(Grupul American de Consulting Francisc Victor Bodo – Manualul patronului de firma, Adaptarea Științifică pentru "Business Practice", Universitatea Politehnică București, 1993, pag 113 – 199);
-asigurarea unei anatomii (chiar și în lipsa personalității juridice) și corespunzător acesteia, dreptul și calitatea de a contacta direct partenerii, în numele și pentru interesele agentului economic, nefiindu-i indiferent propriile interese;
-calitatea de a negocia direct cu furnizorii, în baza mandatului acordat de agentul economic în numele căruia lucrează, având libertatea de a acționa de așa manieră încât obținerea de prețuri la produsele pe care le cumpără sub limita mandatului acordat, poate aduce acestuia profituri substanțiale;
-dreptul de a fundamenta strategia de lucru pentru perioade de gestiune sau perioade mai mari de timp, de a acționa în întregul sistem, prin pârghiile de care dispune pentru înfăptuirea în cele mai bune condiții a prevederilor programelor de derulare a obiectivelor de aprovizionare." (Mihai Pricop și Constantin Drăghici, 1999, pp. 11-12)
1.2.1. Managementul aprovizionarii – definitie
Activitatea prin care elementele materiale sunt asigurate împreună cu cele tehnice se numește managementul aprovizionării. Acestea trebuie să se încadreze într-un volum și într-o structura care să permită realizarea obiectivelor generale ale întreprinderii, realizate cu costuri cât mai mici, iar profitul să fie cât mai mare. (Gheorghe Basanu și Mihai Pricop, 2004, p. 15)
1.2.2. Managementul aprovizionarii tehnico-materiale
Observam faptul ca, managementul aprovizionarii are anumite activitati specifice, cum ar fi:
1) Identificarea si stabilirea volumului structurii materialelor necesare desfasurarii, la parametrii proiectati, a activitatii de ansamblu a unitatii economice, dar si elaborearea planului strategic, a programelor de ATM.
2) Sedimentarea planului strategic si a programelor de aprovizionare materiala si energetica a unitatii.
3)Calcularea consumurilor specific de materiale si resurselor obligatorii, ce ajuta la fundamentarea necesarului de aprovizionat.
4Crearea unor documente din care sa reiasa costurile utilizate.
5)Clasificarea pe criterii economice a stocurilor si a loturilor de resurse materiale.
6) Analiza pietei externe si interne pentru depistarea unor furnizori posibili si reali.
7) Selectarea unor furnizori a caror oferta prezinta incredere, dar sustin si cele mai avantajoase conditii economice si asigura totodata, garantie-certitudine in livrarile viitoare pe orice fel de termen.
8)Stabilirea unor conditii cu noii furnizori sau parteneri.
9)Urmarirea activitatilor ce au loc in conformitate cu noul contract.
10) Asigurarea conditiilor normale de primire-receptie a partizilor(loturilor) de materiale sosite de la furnizori.
11) Stabilirea tuturor detaliilor cu privire la primirea materialelor: spatiile de depozitare, dotarea lor cu mobilier adecvat, organizarea interna a fluxurilor de circulatie, alegerea sistemelor eficiente de depozitare.
12)Efectuarea tuturor operatiilor necesare de dezambalare si depozitare pe rafturi a materilelor.
13) Organizarea rationala a sistemului de servire ritmica cu resurse materiale a compartimentelor firmei. Acestea trebuie sa fie in concordanta cu specializarea departamentului firmei.
14)Supravegherea atenta si drastica a stocurlior, pentru a genera neplaceri.
15) Urmarirea sistematica a materialelor pe tot parcursul consumului lor , pentru anu se incalca procedurile.
Ca un rezumat, sistemele de organizare a activitatilor de aprovizioanre se clasica in:
I. Sistemul pe grupe de activitati diferite:
a) Grupa de plan, contractare, evidenta;
b) Grupele operative de aprovizonare;
c) Grupa depozitelor.
II. Sistemul impartit pe grupe de aprovizionare – depozitare – control – utilizare(ADCU):
a) Organizarea pe grupe de ADCU – omogene;
b) Organizarea pe grupe de ADCU dupa destinatia de consum;
c) Organizarea pe grupe de ADCU in sistem mixt.
Sunt necesare 3-4 nivele pentru a determina o structura organizatorica a unui departament de ATM. Fiecare forma de organizare (departament, serviciu, birou) este subordonat prin seful sau (Director comercial/economic) fata de Directorul general al firmei. (Leonica Popescu, 1998, pp. 32-33 si p. 39)
1.2.3. Activitati specifice managementului aprovizionarii
Observăm faptul că, managementul aprovizionării are anumite activități specifice, cum ar fi:
1) Identificarea și stabilirea volumului structurii materialelor necesare desfășurării, la parametrii proiectați, a activității de ansamblu a unității economice, dar și elaborearea planului strategic, a programelor de ATM.
2) Sedimentarea planului strategic și a programelor de aprovizionare materială și energetică a unității.
3)Calcularea consumurilor specific de materiale și resurselor obligatorii, ce ajută la fundamentarea necesarului de aprovizionat.
4Crearea unor documente din care să reiasă costurile utilizate.
5)Clasificarea pe criterii economice a stocurilor și a loturilor de resurse materiale.
6) Analiză pieței externe și interne pentru depistarea unor furnizori posibili și reali.
7) Selectarea unor furnizori a căror oferta prezintă încredere, dar susțin și cele mai avantajoase condiții economice și asigura totodată, garanție-certitudine în livrările viitoare pe orice fel de termen.
8)Stabilirea unor condiții cu noii furnizori sau parteneri.
9)Urmărirea activităților ce au loc în conformitate cu noul contract.
10) Asigurarea condițiilor normale de primire-recepție a partizilor(loturilor) de materiale sosite de la furnizori.
11) Stabilirea tuturor detaliilor cu privire la primirea materialelor: spațiile de depozitare, dotarea lor cu mobilier adecvat, organizarea internă a fluxurilor de circulație, alegerea sistemelor eficiente de depozitare.
12)Efectuarea tuturor operațiilor necesare de dezambalare și depozitare pe rafturi a materilelor.
13) Organizarea rațională a sistemului de servire ritmică cu resurse materiale a compartimentelor firmei. Acestea trebuie să fie în concordanță cu specializarea departamentului firmei.
14)Supravegherea atentă și drastică a stocurlior, pentru a genera neplăceri.
15) Urmărirea sistematică a materialelor pe tot parcursul consumului lor , pentru anu se încalcă procedurile.
Că un rezumat, sistemele de organizare a activităților de aprovizioanre se clasică în:
I. Sistemul pe grupe de activități diferite:
a) Grupa de plan, contractare, evidență;
b) Grupele operative de aprovizonare;
c) Grupa depozitelor.
ÎI. Sistemul împărțit pe grupe de aprovizionare – depozitare – control – utilizare(ADCU):
a) Organizarea pe grupe de ADCU – omogene;
b) Organizarea pe grupe de ADCU după destinația de consum;
c) Organizarea pe grupe de ADCU în sistem mixt.
Sunt necesare 3-4 nivele pentru a determina o structura organizatorică a unui departament de ATM. Fiecare formă de organizare (departament, serviciu, birou) este subordonat prin șeful sau (Director comercial/economic) față de Directorul general al firmei. (Leonică Popescu, 1998, pp. 32-33 și p. 39)
1.3. Stocurile, parte integranta a procesului de depozitare
Simbolistica cuvântului stoc este de a evidenția într-un mod cantitativ sau valoric subansamblele, componentele, materiile prime, produsele care sunt în fabricație sau produsele finite, pentru a fi utillizate când este nevoie de acestea. Existența stocurilor apare în multiple zone ale sistemului logistic al firmei, precum depozite ce se găsesc în cadrul unităților de producție, mijloace de transport, în magazine etc.
O problema o reprezintă menținerea sau nu a stocurilor. Unii specialiști pretind că stocurile satisfac cererea, în timp ce alții consideră că acestea ar trebui reduse sau înlăturate, deoarece acest lucru poate duce la imobilizarea parțială a capitalului întreprinderii. Această problema poate fi înlăturată făcându-se o analiză a rolului stocurilor, de aceea rolul stocurilor este de a realiza:
1. O îmbunătățire pentru clienți a funcțiilor logistice. Se dorește o satisfacere a cererii clienților interni sau externi, când această se creează, de aceea ar trebui să se mențină stocurile.
2. O stare de echilibru între cerere și oferta. Acest lucru se întâmplă atunci când apare un decalaj temporal dintre oferta și cerere.
3. Un cost mai mic. Dacă acele bunuri se află în stoc se pot diminua costurile anuale cu 20% – 40%.
4. O creștere a siguranței. Existența stocurilor ajută firma la variațiile neașteptate, pe termen scurt, care pot apărea din cauza cererii sau neprocurarii stocurilor de la furnizori. (Carmen Bălan, 2006, pp. 169-171)
Tipurile de stocuri
"a) Stocul ciclic sau de baza este stocul necesar pentru a satisface cererea medie, în perioada dintre două completări succesive ale stocului.
b) Stocul de siguranță constituție o modalitate de protecție contra incertitudinii datorate cererii și respectiv duratei ciclului de performanță al furnizorului.
c) Stocul în tranzit este alcătuit din produsele aflate în mișcare sau în așteptare, în mijloacele de tansport, de exemplu materii prime de la furnizori, produse finite care circulă între depozite/magazinele aceleiași firme sau spre clienți.
d) Stocul mediu este constituit din materiile prime, componentele, produsele în curs de prelucrare și produsele finite păstrate, de regulă, într-un sistem logistic." (Carmen Bălan, 2006, p. 173)
1.4. Marfurile, parte integranta a procesului de depozitare
1.4.1. Clasificarea proprietatilor marfurilor
"Gruparea proprietăților după principalele criterii se prezintă astfel:
A. după relația cu marfă, se grupează:
a) proprietăți intrinseci, proprii mărfii, care țin de natură materiei constitutive, cum sunt: structura, masă specifică, compoziția chimică.
b) proprietăți extrinseci. atribuite mărfii, respectiv considerații(imboluri), categorii economice(preț) etc.
B. după natură lor, respectiv domeniul de cercetare căruia i se asociază, proprietățile sunt:
a) fizice generale(structura, masă specifică, dimensiunile);
b) fizice speciale(mecanice, electrice, optice);
c) chimice(compoziția chimică, potențial activ);
d) biologice(potențialul vital, toleranță biologică – microbiană/bacteriană/fungica);
e) ergonomice(confortabilitate, silențiozitate, manevrabilitate);
f) ecologice(potențial poluant, caracterul autodegradabil);
g) economice(caracterul prețului).
C. după nivelul de relevanță pentru calitatea mărfii, se deosebesc:
a) proprietăți majore;
b) proprietăți importante;
c) proprietăți minore.
D. după modalitatea de apreciere și măsurare, se remarcă:
a) proprietăți apreciabile prin simțuri(organoleptice sau senzoriale);
b) proprietăți măsurabile direct sau indirect cu ajutorul unor mijloace adecvate(instrumente, aparate, etc.).
E. după modul de expriomare a nivelului proprietății, există:
a) proprietăți exprimabile noțional;
b) proprietăți exprimabile cifric." (Fundamentele științei mărfurilor, Marieta Olaru, Ion Schileru, Rodica Pamfilie, Anca Purcărea, Mihai Negrea, Anca Atanase, Costel Stanciu)
1.4.2. Procedee moderne de depozitare a marfurilor
Depozitarea în stive
"Depozitarea în stive impune luarea tutror măsurilor pentru că unitățile de incrcatura ce folosesc acest să poată fi suprapuse una peste altă, astfel încât să se utilizeze cât mai bine volmul de depozitare. Procedeul se utilizează pentru mărfuri aflate în palete lăzi, palete recipient, palete cu montanți, palete plane și ambalaje, respective mărfuri neambalate, în bucăți, care sunt rezistent la suprapunere în numărul de coloane cerut.
Procedeul spre care se tinde a se trece în mod masiv în viitor, în depozite închise cu înălțimi până la 6 m este cel de depozitare a paletelor în stive (fig 6.2). Pe acest principiu se bazează orice depozitare ale diverselor unități de încărcătură în stive." (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
Depozitarea unităților de încărcătură în stive-bloc
"Este un gen de depozitare care, pentru mărfuri ambulate, pachetizate sau palatizate și containerizate conduce la cea mai eficientă utilizare a suprafețelor și volumelor de depozitare întâlnită până în prezența(fig 6.2, a). Ea constă în așezarea alăturată a mai multor rânduri de unități de încărcătură, fără interval de circulație între ele, pe un număr de niveluri stabilit. Deoarece trebuie asigurată selectivitatea, adică orice produs să poate fi introdus și scos printr-o singură manipulare, numai a lui nu și a altora, indifferent unde s-ar află un depozit, este necesară o organizare prealabilă în funcție de frecvența ieșirilor și respectarea principiului primul venit – primul servit. Lățimea pe care se dispune un șorț de marfă într-o stivă bloc trebuie să permită intrarea și ieșirea utilajului de manipulare. Mărfurile în vrac se pot depozita efficient în acest system, dar numai pe platform descoperite, atunci când nu sunt influențate de agenții atmosferici." (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
Depozitarea în stive în șiruri
"Acest mod de depozitare constă în amplasarea mărfurilor pe șiruri, unitățile de icnarcatura fiind suprapuse într-un număr de niveluri afferent rezintentei lor, înălțimii depozitului și înălțimii de ridicare de către echipamentele tehnice specifice.
Șirurile unităților de icnarcatura (fig. 6.2, b) sunt delimitate de culoare (drumuri de acces) pentru utilaje de manipulare cu furci sau dispositive de apucat sau pentru prinderea și ridicarea sarcinilor de macarale și produși rulante. În cazul unităților de încărcătură cu formă paralelipipedică, suprafețele laterale ale acestora pot fi așezate parallel sau făcând un unghi oarecare cu axa drumului de circulație." (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
Depozitarea în mobilier de depozitare
"Depozitarea ambalajelor, pachetelor, paletelor, containerelor și mărfurilor infividuale neambalate în mobilier de depozitare se face atunci când, fie că unitățile de încărcătură formate nu permit depozitarea în stive, fie când nivelul sortimental este foarte numeros, astfel încât și într-un caz și în altul prin depozitarea în stive nu ar fi suficient de bine utilizat volumul depozitului respective. Depozitarea în mobilier este larg utilizată pentru produsele agro-alimentare, deși acest sistem este specific depozitării unor produse industrial de largă utilizare, domeniu în care acest sistem s-a perfecționat și de unde a influențat și depozitările altor categorii de mărfuri." (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
Depozitarea mărfurilor în stelaje
"Stelajele constituie în prezența mobilierul cel mai răspândit și variat de depozitare, efficient pentru depozitarea unor mari varietăți de mărfuri. La rândul lor stelajele pot fi de tip classic pentru depozitele închise paletizate, stelaje cu acces manual, stelaje tip raft, stelaje mobile, stelaje pentru depozitare dinamică, stelaje pentru produse lungi etc. fig 6.3" (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
Depozitare in rastele, practicabile si logii
"Depozitarea în rastele este foate eficientă pentru cantități de mărfuri bine stabilite, așezate într-o anumită poziție. Rastelele pot avea forme și dimensiuni diverse, în funcție de cerințele depozitării. Ele pot fi execuate în sistem fix sau mobile.
Dintre tipurile cele mai eficiente de rastele se desprind, în primul rând cele prezentate în figura 6.10 pentru depozitarea tablei pe vertical și în figura 6.11 pentru depozitarea confecțiilor, produselor în colaci etc.
În figura 6.11, a este prezentat un rastel mobil cu elemente fixe, iar în figura 6.11, b un rastel fix cu elemente mobile.
În scopul manipulării rapide și a depozitării plăcilor se poat utilize și rastele din figura 6.12, care pot avea înălțimi mici, medii și mari, în funcție de volumul de mărfuri și înălțime maximă de depozitare." (Transportul intern, manipularea și depozitarea produselor agroalimentare; Gheorghe Brătucu, C.M. Bica, A.L. Marin, C.G. Păunescu.)
1.5. Managementul desfacerii – definitie si activitati specifice managementului desfacerii
"Desfacerea reprezintă activitatea prin care se asigura livrarea și vânzarea rezultatelor firmei concretizate în produse, lucrări, servicii, deci trecerea lor din sfera producției în sfera circulației. Totodată se stabilesc modalitățile, mijloacele, canalele de distribuție și piețele de desfacere. Prin activtatile de marketing se încheie, practic, circuitul economic.
Managementul desfacerii reprezintă o componentă a sistemului general de management al firmei care, împreună cu managementul aprovizonarii și managementul marketingului se realizează la nivelul funcțiunii comerciale." (Leonică Popescu, 1998, p. 41)
Activitățile specifice managementului desfacerii sunt următoarele:
"1) Colectarea și centralizarea cererilor de oferta și a comenzilor primite de la beneficiarii din țară și din străinătate, constituirea unui portofoliu cu toate solicitările;
2) Analizarea portofoliului de solicitări și elaborarea unor studii de marketing privind cererea și oferta la nivelul piețelor de desfacere din țară și din străinătate, a prețurilor care se practică, situația concurenților și posbilitățile de noi solicitați și beneficieri în condiții de eficientă;
3) Acțiuni de promovare pe piață și reclamă prin elaborarea și prezentare de oferte, pliante, cataloage comerciale, prospecte, mostre etc., și prin participări la expoziții și târguri în țară și în străinătate, publicitate prin mijloace mass-media, clipuri publicitare la TV etc.;
4) Identificarea produselor ce pot fi asimilate, solicitările de produse noi și studiul posibilităților de obținere prin activități de cercetare-proiectare sau modernizare a celor existente, în scopul satisfacerii cerințelor beneficiarilor;
5) Stabilirea cailor de distribuiție în țară și în străinătate și a formelor cât mai eficiente pentru prezentarea și vânzarea sau valorificarea produselor, stabilirea condițiilor de service sau asistență tehnică în perioadele de garanție și post garanție;
6) Acoperirea cu comenzi și contracte a întregii producții planificate și în condiții cât mai avantajoase;" (Leonică Popescu, p. 42)
Capitolul 2 Componente Android API si Java
Android ofera o arhitectura foarte puternica, cu ajutorul careia se pot dezvolta aplicatii pentru dispozitivele mobile cu ajutorul limbajului Java. In continuare vor fi prezentate detalii ale componentelor Android API si a interfetei Serializable, ce apartine pachetului de intrari iesiri Java, care sunt utilizate in aplicatie.
2.1. Clase Android API
2.1.1. Clasa Activity
O activitate este o componenta a aplicatiei care ofera un ecran cu ajutorul caruia utilizatorii pot interactiona in scopul de a face ceva, cum ar fi: apelerea unei persoane, a face o poza, trimiterea unui e-mail sau vizualizarea unei harti. Fiecare activitate are o fereastra unde este desenata interfata cu utilizatorul. Fereastra se intinde pe tot ecranul, dar poate fi mai mica decat acesta sau poate aparea deasupra celei initiale.
O aplicatie poate contine mai multe activitati care sunt slab legate intre ele. De obicei, o activitate este o aplicatie numita si activitate "principala", ce ii este prezentata utilizatorului atunci cand aplicatia porneste pentru prima data. Fiecare activitate poate porni o alta pentru a exacuta diferite operatiuni. De fiecare data cand o noua activitate porneste, cea veche este oprita, dar sistemul pastreaza activitatea intr-o stiva, numita "back stack". Cand o noua activitate porneste, aceasta este impinsa in "back stack" si utilizatorul primeste focusul. "Back stack" lucreaza pe sistemul "ultimul intrat, primul iesit", asadar, atunci cand utilizatorul termina treaba cu activitatea curenta, aceasta este scoasa din stiva si distrusa si vechea activitate revine.
Atunci cand o activitate este oprita pentru a incepe o noua activitate, este notificata de schimbarea starii cu ajutorul ciclului de viata ale activitatii prin metode de apel invers. Exista cateva metode de apel invers pe care o activitate le poate primi, pentru a-si schimba starea – fie sistemul o creeaza, o opreste, o reia ori o distruge – si fiecare apel invers ofera programatorul oportunitatea de a face diferite operatiuni. De exemplu, cand este oprita, activitatea ar trebui sa elibereze obiectele mari, precum conexiuni de retea sau baze de date. Atunci cand activitatea se reia, puteti redobandi resursele necesare si relua actiunile ce fusesera intrerupte. Aceste schimbari de stare fac parte din ciclul de viata al unei activitati.
2.1.1.1. Crearea unei activitati
Pentru a crea o activitate, trebuie realizata o subclasa (sau o subclasa existenta). In subclasa trebuie implementate metode de apel invers, ca sistemul sa faca tranzitia intre statusurile ciclului de viata, cum ar fi crearea unei activitati, oprirea, reluarea sau distrugerea sa. Doua dintre cele mai importante metode de apel invers sunt:
onCreate() – Sistemul apeleaza aceasta metoda atunci cand este creata o activitate. In corpul metodei trebuie initializate componentele esetiale unei activitati. Foarte importanta este apelarea metodei setContentView() care defineste layout-ul(aspectul) activitatii pentru interfata cu utilizatorul.
onPause() – Sistemul apeleaza aceasta metoda atunci cand utilizatorul paraseste activitatea curenta ( nu inseamna neaparat ca activitatea se va distruge). Totusi, este indicat sa se salveze toate schimbarile deoarece utilizatorul este posibil sa nu se mai intoarca la acea activitate.
Exista mai multe metode de apel invers ale ciclului de viata care ar trebui utilizate pentru a fluidiza experienta utilizatorului intre activitati si tratarea anumitor erori ce ar putea duce la oprirea activitatii sau distrugerea sa.
2.1.1.2. Ciclul de viata al unei activitati
Activitatile in sistem sunt gestionate precum o stiva de activitati. Atunci cand o noua activitate urmeaza sa porneasca, aceasta este pozitionata in fruntea stivei si devine activitatea ce ruleaza in acel moment – vechea activitate va ramane sub cea curenta in stiva si nu va urca in prim-plan decat atunci cand noua activitate va exista.
O activitate are patru stati esentiale:
– Daca activitatea este in prim-plan pe ecran(adica in fruntea stivei), aceasta este activa ori ruleaza.
– Daca o activitate a pierdut focusul, dar este in continuare vizibila ( se intampla atunci cand apare o noua activitate care nu este pe toata suprafata ecranului sau transparenta), va fi pusa pe pauza. O activitate in pauza este complet viee ( isi pastreaza starea si informatia membrilor ramanand atasata managerului de fereastra), dar poate fi omorata de sistem in conditii de memorie scazuta.
– Daca o activitate este complet obstructionata de o alta, aceasta este oprita. Insa, isi pastreaza starea si informatia membrilor, totusi, nu este vizibila utilizatorului, asadar fereastra este ascunsa si este deseori omorata de sistem cand este nevoie de memorie in alta parte.
-Daca o activitate este pusa pe pauza sau oprita, sistemul poate elibera activitatea din memorie cerandu-i acesteia sa se opreasca sau omorand-o chiar el. Atunci cand este afisata din nou utilizatorului, trebuie complet restartata si restaurata la vechea stare.
Urmatoarea diagrama arata cat de importante sunt starile prin care poate trece o activitate. Dreptunghirile reprezinta metode de apel invers care pot fi implementate de programator pentru a efectua diferite operatii atunci cand activitatea isi schimba starile. Ovalele sunt starile importante ale activitatii prin care poate trece.
Exista trei bucle principale pe care un programator ar trebui sa le monitorizeze:
Intreaga viata a unei activitati se afla intre primul apel onCreate(Bundle) pana la apelul metodei onDestroy(). O activitate va face toate setarile legate de statea "generala" in metoda onCreate() si va elibera toate resursele pe care le mai utilizeaza pe apelul metodei onDestroy(). De exemplu, daca are un fir de executie ce ruleaza in spate in care descarca date utilizand reteaua, poate creea acel fir de executie pe onCreate() si opri firul pe onDestroy().
Durata de viata vizibila a unei activitati se afla intre apelurile onStart() si onStop(). In acest timp, utilizatorul poate observa activitatea pe ecran, totusi, aceasta nu este in prim-plan si nu interactioneaza cu utilizatorul. Intre aceste doua metoda, programatorul poate pastra resursele care sunt necesare afisarii activitatii. De exemplu, programatorul poate inregistra un BroadcastReceiver in onStart() pentru a monitoriza schimbarile ce au impact asupra UI-ului si dezabona in onStop() atunci cand utilizatorul nu mai vede ce se afiseaza. Metodele onStart() si onStop() pot fi apelate de mai multe ori, in timp ce activitatea devine vizibila si ascunsa utilizatorului.
Durata de viata in prim-plan a activitatii are loc intre apelurile onResume() pana la onPause(). In acest timp, activitatea este in fruntea celorlalte activitati si interactioneaza cu utilizatorul. O activitate poate fi frecvent intre starile de revenire si pauza. De exemplu, atunci cand dispozitivul intra in modul adormit si un rezultat de la o activitate este livrat, asadar codul din aceste metode ar trebui sa fie destul de usor.
Intregul ciclul de viata al activitatii este definit cu ajutorul metodelor Activity. Programatorul are posibilitatea sa suprascrie aceste metode atunci cand activitatea isi schimba starea. Toate activitatile vor implementa onCreate(Bundle) pentru a face setarile initiale. Multi programatori vor implementa onPause() pentru a salva schimbarile.
Acestea sunt metodele ce pot fi implementate de programator:
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
2.1.2. Clasa Fragment
Un fragment reprezinta un comportament sau o portiune a interfetei utilizator intr-o activitate. Pot fi combinate diferite fragmente intr-o singura activitate pentru a realiza o interfata utilizator multi-panou si reutiliza un frament in multiple activitati. Fragmentul poate fi privit ca modulul unei activitati, care are propriul sau ciclu de viata, primeste propriile inputuri si pe care se poate sa o adaugi sau sa o elimini in mod dinamic, in timp ce ruleaza activitatea.
Un fragment trebuie intotdeauna sa fie inglobat in interiorul unei activitati, iar ciclul de viata al acestuia este influentat de cel al activitatii. De exemplu, atunci cand o activitate este in pauza si fragmentele vor fi, iar cand o activitate este distrusa si fragmentele vor fi. Cu toate acestea, in timp ce activitatea ruleaza, se afla in in ciclul de viata reluat(resumed). Programatorul poate manipula in mod independent fiecare fragment. Atunci cand se recurge la modificarea fragmentelor, adaugare/stergere, acestea se pot adauga in stiva care este manipulata de activitate. Fiecare stiva inregistreaza toate tranzactiile de fragmente ce au avut loc. Stiva acorda utilizatorul posibilitatea de a navinga inapoi, cu ajutorul butonului Back.
Cand se adauga un fragment ca parte a layout-ului activitatii, apartine de asemenea unui ViewGroup si contine propriul layout. Se poate insera un fragment intr-o activitate layout declarandu-l intr-un fisier layout ca element <fragment> sau scriind cod adaugandu-l intr-un ViewGroup. Cu toatea acestea, un fragment nu este nevoie sa faca parte unui activity layout. Programatorul poate utiliza un fragment ca fiind un muncitor invizibil pentru activitate.
2.1.2.1. Clasa DialogFragment
Un fragment ce afiseaza o fereastra de dialog. Aceasta se afla deasupra ferestrei de activitate. Acest fragment contine un obiect de tip Dialog si care imprumuta din atributele pe care il are un fragment. Controlul dialogului decide cand trebuie sa il afiseze, ascunda sau inchida. Ar trebui sa fie rezolvat cu ajutorul API-ului, nu prin apelari directe.
Implementarea ar trebui sa extinda clasa DialogFragment si sa suprascrie metodele onCreateView(LayoutInflater, ViewGroup, Bundle) pentru a furniza continutul si onCreateDialog(Bundle) pentru a crea propriul dialog.
Ciclul de viata al unui DialogFragment
DialogFragment face diferite lucruri pentru a indruma ciclul de viata al fragmentului, in locul dialogului. In general, dialogurile sunt entitati autonome, acestea avand propria fereastra, primind propriile evenimente si adesea decid cand trebuie sa se inchida.
DialogFragment trebuie sa se asigure de o buna functionare a fragmentului si dialogului. Pentru a realiza acest lucru, el urmareste evenimentele dialogului si are grija sa ii elimine statutul cand este nevoie. In acest caz, ar trebui utilizata metoda show(FragmentManager, String) sau show(FragmentTransaction, String) pentru a adauga o instanta a DialogFrament la propria interfata cu utilizatorul.
2.1.2.2. Clasa ListFragment
ListFragment este un fragment care afiseaza o lista de elemente legate la o sursa de date , precum o multime sau cursor si detine eventuri atunci cand un utilizator selecteaza un element.
ListFragment contine un obiect ListView care poate fi legat la o sursa de date, de obicei de o multime sau un cursor ce contine rezultatul unei interogari.
2.1.3. Clasa SQLiteOpenHelper
SQLiteOpenHelper este o clasa care ajuta la crearea unei baze de date si controlul versiunii.
Se poate crea o clasa ce mosteneste SQLiteOpenHelper si implementeaza metodele onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) si optional onOpen(SQLiteDatabase). Aceasta clasa are grija sa deschida baza de date daca exista, iar daca nu exista sa o creeze si o actualizeze atunci cand este necesar.
Aceasta clasa usureaza implementararile ContentProvider-ului pentru a intarzia deschiderea si actualizarea bazei de date pana are loc prima utilizare pentru a evita blocarea aplicatiei la lansare din cauza actualizarilor care pot fi foarte lungi.
2.1.4. Clasa Authenticator
"Clasa Authenticator este un obiect ce cunoaste cum sa obtina autentificarea pentru o conexiune in retea.
Aplicatiile utilizeaza aceasta clasa creand o subclasa si inregistrand o instanta a acelei sublace cu sesiunea atunci cand este creata. Cand este necesara autentificarea, sistemul va apela o metoda din subclasa precum getPasswordAuthentication. Metoda subclasei poate intreba despre autentificare, deoarece este solicitata cu un numar de metode metode mostenite ( getRequestingXXX() ) si sa formuleze un mesaj afecvat utilizatorului.
Toate metodele care cer autentificare au o implementare implicita ce esueaza."
(http://docs.oracle.com/javaee/6/api/javax/mail/Authenticator.html; Bill Foote, Bill Shannon)
2.1.5. Clasa Exception
"Exception este o superclasa pentru toate tipurile de erori existente. Cu ajutorul acesteia se poate arunca o exceptie, iar programatorii o pot prinde."
(Android Developer)
De asemenea, se pot crea propriile exceptii:
public class Exemplu extends Exception{
public Exemplu (String message)
{
super(message);
}
}
Cand se doreste aruncarea unei exceptii: throw new Exemplu("test");
2.1.6. Clasa AsyncTask
Clasa AsyncTask permite intr-un mod adecvat si simplu utilizarea unui fir de executie al interfatei utilizator(UI). Aceasta clasa permite executarea a unor operatii in background si publicarea rezultatelor pe firul interfetei utilizator fara a fi nevoie sa se manipuleze firele de executie sau/si handlerele.
AsyncTask este proiectat ca o clasa ajutatoare pentru firele de executie si handlere si nu constituie o arhitectura generica pentru firele de executie. AsyncTask ar trebui utilizata pentru operatii scurte. Daca este nevoie sa se pastreze un fir de executie pentru o lunga perioada de timp este recomandat sa fie utilizate diferitele variante posibile ale API-ului precum Executor, ThreadPoolExecutor si FutureTask.
Un sarcina asincrona este definita de un calcul care ruleaza in firele de executie din background si ale caror rezultate sunt publicate pe firul de executie al interfetei utilizator. O sarcina asincrona este rezultatul a trei tipuri generice numite Progress, Result si Params si patru etape numite doInBackground, onPreExecute, onPostExecute si onProgressUpdate.
Tipurile generice ale AsyncTask:
1. Params, sunt parametrii trimisi inainte sa aiba loc executia.
2. Progress, reprezinta progresul sarcinii pe care o are de executat in background.
3. Result, reprezinta tipul rezultatului ce se executa in background.
Cele patru etape:
1. onProExecute() este apelata inainte de a se executa sarcina. Aceasta etapa este folosita pentru a configura ceea ce urmeaza sa se execute, de exemplu afisand o bara de progres.
2. doInBackground(Params…) este apelata in firul de executie din background imediat ce se termina de executat onPreExecute(). Aceasta etapa este utilizata pentru a realiza calcule in background care au o durata mai lunga. Parametrii sarcinii asincrone sunt pasati acestei etape. Rezultatul calculelor este returnat si este pasat inapoi ultimei etape. Aceasta etapa poate de asemenea utiliza publishProgress(Progress…) pentru a publica progresul. Aceste valori sunt publicate pe firul de executie al interfetei utilizator si mai departe catre etapa onProgressUpdate(Progress…).
3. onProgressUpdate(Progress…) este invocata dupa apelul catre publishProgress(Progress…). Timingurile executiei sunt nedefinite. Aceasta metoda este utilizata pentru a afisa orice forma de progress in interfata utilizator in timp ce in background inca au loc calcule. De exemplu, poate fi utilizata pentru a anima bara de progres sau a afisa logurile intr-un camp de text.
4. onPostExecute(Result) este chemata dupa ce se termina calculele din background. Rezultatele calculelor din background sunt pasate acestei etape ca parametru.
Intreruperea unei sarcini
O sarcina poate fi anulata la orice moment de timp invocand cancel(boolean). Invocarea acestei metode va cauza ulterior la apeluri la isCancelled pentru a returna adevarat. Dupa chemarea acetei metode, va fi invocata onCancelled(Object), in loc de onPostExecute(Object) dupa doInBackground(Object[]). Pentru a garanta ca sarcina este anulata cat de repede se poate, este recomandat sa se verifice periodic valoarea returnata de isCancelled() din doInBackground(Object[]) daca este posibil.
2.1.7. Clasa View
Aceasta clasa reprezinta un contructor de baza pentru componentele interfetei utilizator. Un View ocupa o zona dreptunghiulara pe suprafata ecranului si este responsabila pentru desenarea si manipularea evenimentelor. View este clasa de baza pentru widget-uri si este utilizata sa creeze o interfata cu utilizatorul interactiva avand componente precum butoane, campuri de text etc. Subclasa ViewGroup este clasa de baza pentru lauyout. Acesta este un container invizibil care detine ale obiecte de tip View sau alte ViewGroup-uri si se pot defini propriile proprietati de layout.
Toate view-urile dintr-o fereastra sunt aranjate sub forma de arbore. Se pot adauga view-uri fie prin cod fie specificandu-le intr-un fisier XML de tip layout. Exista multe subclase specializate in view-uri care actioneaza ca si controale sau sunt capabile sa afiseze text, imagini sau alt continut.
Odata ce s-a creat un tree de view-uri, exista cateva tipuri de operatii ce se pot efectua:
1. Set properties(setarea proprietatilor) : De exemplu setarea unui text intr-un TextView. Proprietatile disponibile si metodele cu ajutorul carora view-urile sunt setate vor varia in functie de subclasa.
2. Set focus(setarea focusului) : Arhitectura se va ocupa cu schimbarea focusului intre view-uri in functie de deciziile utilizatorului. Pentru a se forta focus pentru un anumit view, se apeleaza metoda requestFocus().
3. Set up listeners : View-urile permit setarea de listeners care sa notifice cand ceva important are loc in view. De exemplu, toate view-urile permit sa se seteze un listener pentru a sti cand se primeste si se pierde focusul. Pentru inregistrarea unui listener se utilizeaza metoda setOnFocusChangeListener(android.view.View.OnFocusChangeListener). Alte view-uri ale subclaselor ofera listener mai specializati. De exemplu, un buton expune un listener pentru a notifica atunci cand acesta a fost apasat.
4. Set visibility(setarea vizibilitatii) : Se pot afisa sau ascunde view-uri folosind metoda setVisibility(int).
Implementarea interfetei utilizator
Interfata utilizator a activitatii este asigurata de o ierarhie de view-uri – obiect derivat din clasa View. Fiecare view controleaza un spatiu dreptunghiular din fereastra unei activitati si poate raspunde la interactiunii cu utilizatorului. De exemplu, un view poate fi un buton ce initializeaza o actiune atunci cand utilizatorul il atinge.
Android ofera un numar de view-uri gata-facute pe care programatorul le poate utiliza pentru aspectul si organizarea unui layout. "Widgets" sunt view-uri care asigura elemente vizuale si interactive pentru ecran, precum butoane, camp de text, caseta de incercuit sau imagini. "Layout" sunt view-uri derivate din ViewGroup, care asigura unicitate modelului de layout pentru copiii sai, precum linear layout, grid layout, relative layout. De asemenea, se pot implementa subclase din View si ViewGroup pentru a-ti crea propriile widget-uri si layout-uri si ale aplica layout-ului activitatii.
Cel mai utilizat mod de a defini un layout utilizand view-uri este cu un fisier XML layout salvat in resursele aplicatiei. In acest mod, se poate mentine un design al interfetei cu utilizatorul separat de codul sursa care defineste comportamentul activitatii. Se poate seta un layout ca fiind un UI pentru activitate cu ajutorul metodei setContentView(), pasand ID-ul resursei. Totusi se poate crea un noi View-uri scriind cod si construi o ierarhie de noi View-uri in interiorul unui ViewGroup, atunci utilizeaza acel layout passand radacina ViewGroup metodei setContentView().
2.1.8 Clasa Intent
Un intent este o categorie abstracta a unei operatii care trebuie efectuata. Se poate utiliza cu startActivity pentru a porni o Activity, broadcastIntent, pentru a trimite oricarei componente BroadcastReceiver interesata si startService(Intent) sau bindService(Intent, ServiceConnection, int) pentru a comunica cu un serviciu din background.
Un Intent asigura o facilitate pentru efectuarea de legaturi la executie a mai multor aplicatii. Este foarte bine sa fie utilizat in lansarea activitatilor, unde este greu de legat diferite activitati. In principiu, este o structura de date pasiva care tine o categorie abstracta a unei actiuni ce trebuie executata.
Structura unui Intent
Informatiile principale ale unui intent sunt:
1. action – Actiunea generala ce trebuie efectuata ca ACTION_MAIN, ACTION_VIEW, ACTION_EDIT, etc.
2. data – Informatia asupra careia se actioneaza, precum inregistrarea unei persoane in baza de date a contactelor, exprimate ca Uri.
Cateva exemple de perechi action/data:
1. ACTION_VIEW content://contacts/people/1 – Afiseaza informatii despre persoana care se identifica cu "1".
2. ACTION_DIAL content://contacts/people/1 – Afiseaza tastatura de apelare, iar campul de text contine numarul persoane ce se identifica cu "1".
3. ACTION_VIEW tel:123 – Afiseaza fereastra de apelare continand acel numar.
4. ACTION_DIAL tel:123 – Afiseaza fereastra de apelare continand acel numar.
5. ACTION_EDIT content://contacts/people/1 – Editeaza informatiile despre persoana care se identifica cu "1".
6. ACTION_VIEW content://contacts/people/ – Afiseaza o lista cu persoanele.
Ca o completare a acestor atribute elementare, mai exista cateva atribute secundare, care de asemenea se pot include cu un intent:
1. category – Ofera informatii suplimentare despre actiunea care se va executa. De exemplu, CATEGORY_LAUNCHER semnifica faptul ca trebuie sa apara in Launcher ca o aplicatie de nivel superior, in timp ce CATEGORY_ALTERNATIVE semnfica faptul ca ar trebui inclusa intr-o lista de actiuni alternative pe care utilizatorul le poate efectua pe o bucata din date.
2. type – Specifica un tip de data, Intent, explicit. In mod normal tipul este dedus. Setand acest atribut, programatorul dezactiveaza evaluarea si forteaza un tip explicit.
3. component – Specifica un nume explicit componentei clasei pentru a utiliza cu un intent. Normal acest lucru este determinat uitandu-se la celelalte informatii din intent (action, data/type, categories) si comparand aceasta cu o componenta pe care stie sa o foloseasca. Daca acest atribut este setat, atunci evaluarea nu este efectuata si aceasta componenta este utilizata exact cum este. Specificand acest atribut, celelalte atribute ale intent-ului devin optionale.
4. extras – Acesta un obiect Bundle. Acesta poate furniza informatii suplimentare componentei. De exemplu, daca avem o actiune de a trimite un e-mail, am putea include parti suplimentare de date pentru subiect, corp etc.
2.2. Android API – App Manifest si permisiunile
Fiecare aplicatie trebuie sa aiba un fisier numit "AndroidManifest.xml", avand exact aceasta denumire si se afla in directorul parinte. Fisierul manifest prezinta informatii esentiale despre aplicatie sistemului de operare Android. Informatia este necesara sistemului inainte sa ruleze codul aplicatiei. Impreuna cu alte lucruri, fisierul manifest face urmatoarele:
1. Numeste pachetul Java pentru aplicatie. Numele pachetului serveste ca identificator unic pentru aplicatie.
2. Descrie componentele aplicatiei, activitati, servicii, receptoare de radiodifuzare (broadcast receivers) si furnizori de continut din care aplicatia este formata. Numeste clasele care implementeaza fiecare componenta si publica propriile capacitati (de exemplu, de care mesaje ale Intent-ului se poate ocupa). Aceste declaratii permit sistemului Android sa stie ce reprezinta fiecare componenta si in ce conditii vor fi lansate.
3. Determina care procese vor gazdui componentele aplicatiei.
4. Sunt declarate ce permisiuni aplicatia trebuie sa aiba pentru a accesa componente protejate ale API-ului si interactioneaza cu alte aplicatii.
5. De asemenea, sunt declarate permisiuni pe care altele le necesita pentru a putea interactiona cu componentele aplicatiei.
6. Este listata instrumentatia claselor care asigura profilarea si alte informatii in timp ce ruleaza aplicatia. Aceste declaratii sunt prezente in manifest numai in timp ce aplicatia este dezvoltata si testata. Acestea sunt indepartate inainte ca aplicatia sa fie publicata.
7. Se declara nivelul minim de Android API de care aplicatia are nevoie.
8. Sunt listate librariile la care are acces.
Permisiunile
Permisiunile au un rol foarte important in cadrul unei aplicatii. Acestea sunt definite intr-un fisier manifest de tip XML. Abilitatea de a incepe o anumita activitate poate fi aplicata atunci cand este definit tagul <activity>. Procedand astfel, celelalte vor trebui sa declare un elementul corespondent <uses-permission> in propriul fisier manifest pentru a incepe activitatea.
Cand o activitate este pornita si se doreste de utilizarea internetului pentru diverse operatiuni se va mentiona <uses-permission android:name = "android.permission.INTERNET"/>. Astfel, il obliga pe programator sa specifice permisiunile necesare. In caz ca un utilizator va dori sa descarce aplicatia, acestuia i se vor prezenta permisiunile pe care aplicatia le va utiliza.
2.3. Java – interfata Serializable
"O clasa este serializabila daca implementeaza interfata Serializable. Clasele care nu implementeaza aceasta interfata nu pot fi serializate si nici deserializate. Toate subtipurile de clase serializabile sunt si ele serializabile. Interfata de serializare nu are metode sau campuri si servesc numai pentru identificarea semanticii in a fi serializabila.
Pentru a lasa toate subtipurile neserilizabile sa fie serializabile, acestea trebuie sa isi asume responsabilitatea pentru a salva si restaura statutul supertipului. Subtipurile isi asuma aceasta responsabilitate numai daca acea clasa pe care o extinde are acces la contructorul fara parametrii pentru a initializa statutul clasei. Este o eroare sa se declare o clasa serializabila daca nu este clasa. Eroarea va fi detectata la executie.
In timpul deserializarii, campurile claselor neserializabile vor fi initializate utilizand contructorul public sau protejat fara argumente. Un constructor fara argumente trebuie sa fie accesibil subclaselor serializabile. Campurile subclaselor serializabile se vor restaura din datele ce urmeaza sa fie deserializate. Cand se traverseaza un grafic, se poate intalni un obiect care nu suporta interfata Serializable. In acest caz, se va arunca exceptia NotSerializableException si se va identifica clasa al carui obiect nu este serializabil.
Clasele ce necesita tratament special in timpul procesului de serializare si deserializare trebuie sa implementeze metode cu urmatoarea signatura:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
Metoda writeObject este responsabila pentru scrierea obiectului in asa fel incat metoda readObject o poate restabili. Mecanismul standard pentru salvarea campurilor obiectului poate fi invocat prin apelarea out.defaultWriteObject. Metoda nu este nevoie sa se ingrijoreze cu statutul ce apartine superclasei sau subclasei. Starea este salvata scriind campurile individual cu ajutorul clasei ObjectOutputStream utilizand metoda writeObject sau folosind metode pentru tipurile de date primitive suportate de DataOutput.
Metoda readObject este responsabila pentru citirea datelor si restaurarea lor. Se poate chema in.defaultReadObject pentru a invoca mecanismul standard de restaurare a obiectelor non-statice si campurile non-transient. Metoda defaultReadObject utilizeaza informatia venita pentru a atribui campurilor obiectelor salvate in concordanta cu numele campurilor in obiectul curent. Acesta se ocupa de cazul in care clasa a evoluat la adaugarea de noi campuri. Metoda nu are nevoie sa isi faca griji in legatura cu cui ii apartine, superclasei sau subclasei. Starea este salvata scriind campurile individuale cu ajutorul ObjectOutputStream utilizand metoda writeObject sau metode pentru date primitive suportate de DataOutput.
Metoda readObjectNoData este responsabila pentru initializarea obiectului in cazul in care serializarea datelor nu contine clasa data ca superclasa al obiectului caruia i se realizeaza deserializarea. Acest lucru se poate intampla in cazurile in care partea destinatara foloseste o versiune diferita de deserializare a clasei instantiate, atunci partea care trimite si versiunea celui care primeste extinde clasele care nu sunt extinse de versiunea celui care trimite. Cele mentionate anterior pot avea loc daca serializarea fluxului de date au fost falsificate. Prin urmate readObjectNoData este util pentru initializarea obiectelor deserializate cum trebuie in ciuda unei "ostile" sau surse incomplete de flux de date.
Clasele serializabile care au nevoie sa desemneze un obiect alternativ pe care sa il utilizeze cand scrie un obiect ca flux de date, ar trebui sa implementeze aceasta metoda speciala, avand exact aceasta signatura:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
Metoda writeReplace este apelata de serializare daca metoda exista si ar trebui sa fie accesibila dintr-o metoda deja definita din interiorul clasei. Asadar, metoda poate fi privata, protejata sau pachet-privat accesibil. Accesul subclaselor la aceasta metoda urmeste regulile java accesibilitate.
Clasele care au nevoie sa desemneze o inlocuire atunci cand o instanta a sa este citita din fluxul de date, ar trebui implementata aceasta metoda speciala, cu exact aceeasi signatura.
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
Metoda readResolve urmareste aceleasi reguli de apelare si accesibilitate precum writeReplace.
Executia serializarii asociaza cu fiecare clasa serializabila un numar de versiune, numit serialVersionUID, care este utilizat in timpul deserializarii pentru a verifica ca cel care trimite si primeste obiectul serializat a incarcat clasele pentru obiectul compatibil, conform numarul de versiune. Daca destinatarul a incarcat o clasa pentru un obiect care are un serialVersionUID diferit fata de cel al cerui care a trimis, atunci deserializarea nu va putea avea loc si se va arunca o exceptie InvalidClassException. O clasa serializabila poate declara propriul ei serialVersionUID in mod explicit, declarand un camp numit "serialVersionUID", care trebuie sa fie static, final si de tip long:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
Daca o clasa serializabila nu declara explicit un serialVersionUID, atunci serializarea la executie va calcula un numar de versiune pentru acea clasa, tinand cont de diferite aspecte ale clasei. Totusi, este recomandat ca toate clasele serializabile sa declare in mod explicit un serialVersionUID, deoarece cel implicit este foarte sensibil la detaliile clasei si poate fi diferit in functie de compilator si se poate ajunge la o exceptie InvalidClassException in timpul deserializarii. Prin urmare, pentru a garanta un serialVersionUID consistent indiferent de compilatorul java, o clasa serializabila trebuie sa declare in mod explicit un numar de versiune. Este de preferat ca acel serialVersionUID explicit sa fie privat, deoarece aceasta declaratie se foloseste numai in interiorul clasei. Campul serialVersionUID nu este utilizat de catre mostenitorii sai." (http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html)
Capitolul 3 – Descrierea aplicatiei
Aplicatia pe care am dezvoltat-o a plecat de la denumirea temei de licenta "Managamentul activitatii unui depozit". Aceasta este proiectata pentru a ii ajuta pe angajatii unui depozit sa tina evidenta marfurilor ce se afla in grija lor. Iti permite adaugarea, modificarea, stergerea produselor din baza de date, precum si importarea din diverse surse a altor baze de date. De asemenea, acestia au la dispozitie vizualizarea de diverse rapoarte, scanarea produselor cu ajutorul codului QR si imprimarea acestuia in urma exportarii.
Din punct de vedere al interfetei utilizator, activitatea este de tip Master/Detail Flow
, iar in action bar se regaseste meniul principal care contine mai multe optiuni, carora le corespunde un fragment cu o lista de elemente.
3.1 Descrierea interfetei utilizator
Prima optiune din meniul principal este File sub egida caruia se regasesc mai multe elemente:
1. View products – afiseaza baza de date cu produsele existente si contine campurile ID, Name, Price, U. M. si Quantity. Utilizatorul i se pune la dispozitie un motor de cautare dupa campurile ID si Name.
2. Increase quantity – se reduce cantiatea unui anumit produs dat dupa ID.
3. Decrease quantity – se poate mari cantitatea dintr-un anumit produs pe baza ID-ului.
4. Add product – este realizabila adaugarea de noi produse in baza de date.
5. Delete product – se pot sterge produse pe baza ID-ului lor.
Cea de a doua optiune din meniul principal este Tools care permite urmatoarele operatiuni:
1. Find by QR – se pot cauta in baza de date produse ce corespund codului QR scanat, pe baza ID-ului si numelui.
2. Export DB – este posibila exportarea bazei de date in format sqlite si numirea acesteia. Exportarea se va face in root/WMS/db.
3. Import DB – se poate importa o baza de date existenta, iar utilizatorul are la dispozitie doua variante in ceea ce priveste utilizarea acesteia. Se poate inlocui vechea baza de date sau se poate adauga la cea existenta.
Cea de a treia optiune din meniul principal este Report careia ii corespunde urmatoarea lista de elemente:
1. Products report – se pot vizualiza produsele existente in mai multe moduri, precum, cele mai vandute produse, cele mai noi produse, cele mai scumpe produse si cele mai ieftine produse.
Cea de a patra optiune din meniul principal este Help si contine urmatoarele optiuni:
1. Developer – de aici clientul poate trimite developer-ului un feedback cu eventuale erori sau noi caracteristici pe care le doresti ca aplicatia sa le aiba.
2. Settings – utilizatorul are la dispozitie diverse setari pe care acesta le doreste, precum schimbarea temei, stergerea tuturor inregistrarilor, setarea unei parole atunci cand aplicatia este accesata.
Cea de a cincea optiune din meniul principal este Exit, iar la apasarea acestuia aplicatia se va inchide.
3.2 Descrirea claselor aplicatiei
Clasa MainActivity
MainActivity extinde clasa Activity. Este cea mai importanta, deoarece este prima clasa apelata atunci cand porneste aplicatia. In cadrul metodei suprascrise onCreate(Bundle) este instantiata clasa ApplicationSettings care contine setarile aplicatiei. De asemenea, sunt setate tema, view-ul, bara de actiune si elementele sale.
Clasa MainPanelFragment
Urmatorul pas dupa MainActivity este acesta. Aici se verifica daca dispozitivul este in modul vertical sau orizontal. Pentru a face diferenta dintre cele doua moduri se contruiesc doua layout-uri cu acelasi nume, dar cu continut diferit. Pentru modul vertical se va adauga un fragment care va tine lista de optiuni, iar pentru modul orizontal se va adauga un fragment si un FrameLayout, iar in el se va adauga view-ul cu detaliile optiunii selectate din fragment. Daca dispozitivul este orientat vertical va porni o noua activitatea de tip DetailsActivity. Daca dispozitivul este orientat orizontal se va contrui obiectul de tip DetailsFragment care va fi adaugat in activitatea curenta.
Clasa DetailsActivity
DetailsActivity extinde clasa Activity. Aceasta este apelata atunci cand dispozitivul este orientat vertical si se adauga view-ul creat in DetailsFragment.
Clasa DetailsFragment
DetailsFragment extinde clasa Fragment. Aceasta este folosita la contruirea elementelor ferestrei de detalii, pe baza pozitiei elementului selectat din lista de optiuni si a meniului din bara de actiune. Metoda initializeProductsGridView(LayoutInflater) construieste view-ul cu un GridView in care sunt trecute produsele din baza de date si un AutoCompleteTextView cu ajutorul caruia se pot face cautari in tabel. Metoda initializeIncreaseQuantity(LayoutInflater) creeaza un view cu ajutorul caruia se poate mari cantitatea unui anumit bun. Metoda initializeDecreaseQuantity(LayoutInflater) contruieste un view pentru a scadea cantitatea unui produs. Metoda initializeAddProduct(LayoutInflater) creeaza un view pentru a putea adauga un nou produs in baza de date. Metoda initializeDeleteProduct(LayoutInflater) initializeaza un view pentru a putea un anumit produs. Metoda initializeSearchView(LayoutInflater) contruieste un view pentru a putea scana coduri QR si a afisa produsele in tabel. Metoda initializeExportDbView(LayoutInflater) creeaza o interfata pentru a pune la dispozitia utilizatorului o modalitate de a exporta baza de date interna a aplicatiei. Exportarea propriu-zisa are loc in metoda onDialogMessageExport dupa ce utilizatorul seteaza numele fisierului. Metoda initializeImportDbView(LayoutInflater) creeaza un view pentru ca utilizatorul sa importe o baza de date. Dupa selectarea bazei de date utilizatorul are la dispozitie doua posibilitati. Prima este sa inlocuieasca baza de date curenta si a doua este de a o inlocui. Metoda initializeProductsReportView(LayoutInflater) construieste un view cu un GridView, iar produsele pot fi ordonate in mai multe moduri, precum dupa cel mai ieftin produs, cel mai scump, cel mai nou si cel mai vandut. Metoda initializeEmailView(LayoutInflater) initializeaza un view care contine un TextView si un buton pentru a trimite e-mail dezvoltatorului. Mesajul scris se salveaza si se sterge in momentul cand este trimis sau este sters. Metoda initializeSettingsView(LayoutInflater) ofera posibilitatea utilizatorului sa modifice tema, sa stearga baza de date, sa seteze o parola aplicatiei.
Clasa ApplicationSettings
Clasa ApplicationSettings contine atribute cu privire la setarile aplicatiei. Aceasta implementeaza interfata Serializable, deoarece campurile sunt exportate/importante in si din fisier. De asemenea, este utilizat design pattern-ul Singleton.
Clasa CustomDialogExport
Clasa CustomDialogExport extinde DialogFragment. Atunci cand se doreste exportarea bazei de date, se deschide acest dialog care ofera posibilitatea utilizatorului de a o denumi. Cea mai importanta metoda utilizata este onCreateView in care s-a implementat modalitatea de afisare a dialogului. De asemenea, clasa include interfata ExportDbCommunicator cu metoda onDialogMessageExport(String). Interfata este implementata de clasa DetailsFragment care este notificata si primeste ca parametru numele fisierului pentru a finaliza salvarea fisierului.
Clasa CustomDialogImport
Clasa CustomDialogImport extinde DialogFragment. Cand se doreste importarea unei bazei de date, se deschide acest dialog care ofera posibilitatea utilizatorului de a alege pe care doreste sa o importe. Lista cu fisierele disponibile este stabilita in urma scanarii mediului de stocare. Cea mai importanta metoda utilizata este onCreateView care se ocupa de afisarea dalogului. De asemenea, clasa include interfata ImportDbCommunicator cu metoda onDialogMessageImport(String). Interfata este implementata de clasa DetailsFragment pentru a fi notificata si primeste ca parametru numele fisierului pentru a finaliza importarea fisierului.
Clasa CustomGridViewAdapter
CustomGridViewAdapter extinde clasa abstracta BaseAdapter. Aceasta are grija ca fiecare produs sa fie afisat in tabel. Una dintre metodele importante este getCount care returneaza numarul de obiecte din lista. Metoda getView returneaza un view cu obiectul de pe pozitia, ceruta ca paremetru de intrare.
Clasa DbHandler
DbHandler extinde clasa abstracta SQLiteOpenHelper pentru a putea crea, modifica si sterge tabele dintr-o baza de date. Atunci cand se doreste de exemplu adaugarea de date, modificarea sau stergerea acestora, se creeaza un obiect de tip DbHandler, iar pe contructor se trimite ca parametru contextul aplicatiei pentru a se verifica existenta bazei de date. In cazul in care aceasta nu exista se apeleaza metoda onCreate care va creea tabelele. In cadrul acestei clase am implementat metoda addProducts(List<Object>), pentru a adauga o lista de produse. Aceasta va parcurge toate elementele si va apela metoda addProduct(Product) pentru a adauga fiecare produs in tabel. De asemenea, am supraincarcat metodele getProducts() si getProducts(SQLiteDatabase). Am creat cea de a doua metoda pentru a putea citi date dintr-o alta baza de date, decat cea a aplicatiei.
Clasa DefaultSettings
Rolul acestei clase este de a prelua setarile implicite ale aplicatiei dintr-un fisier numit DefaultProperties.properties, atunci cand nu se gaseste cel exportat din clasa ApplicationSettings. Acest lucru se intampla la prima rulare a aplicatiei.
Clasa EmailSender
EmailSender extinde clasa abstracta Authenticator, fiind specializata in trimiterea unui e-mail. Cea mai simpla metoda de a trimite un e-mail este de a crea un Intent, pe baza caruia trimiteai toti parametrii necesari unui astfel de serviciu, dar era necesara utilizarea unei alte aplicatii, precum Gmail. Avantajul si obiectivul urmarit de mine a fost expedierea unui e-mail, din interiorul propriei aplicatii. Expedierea se face pe propriul e-mail. Pentru a se utiliza un astfel de serviciu este necesara conexiunea la internet. Pentru a avea loc expedierea propriu zisa am fost nevoit sa implementez o alta clasa care extinde AsyncTask, pentru a nu bloca firul principal de executie.
Clasa JSSEProvider
JSSEProvider este necesara clasei EmailSender, deoarece extinde Provider si contine protocoale necesare trimiterii unui e-mail.
Clasa InitializationException
InitializationException extinde clasa Exception si am utilizat-o pentru a arunca o exceptie cu un anumit mesaj, in cazul unei erori la initializare.
Clasa Miscellaneous
Aceasta clasa contine numai metode statice necesare diferitelor operatiuni. Metoda removeExtensionsFiles(List<String> filesWithExtension) intoarce o lista cu numele fisierelor, dar fara extensia acestora. Metoda getFileExtension(String filename) intoarce extensia fisierului trimis ca parametru. Metoda findFile(String filename) va cauta in toata memoria dizpozitivului fisierul dorit si va intoarce calea acestuia catre el. Metoda removeExtensionFile(String filename) va intoarce extensia fisierului introdus ca parametru de intrare. Metoda findFilesWithExtension(String extension) va cauta in memoria dizpozitivului toate fisierele cu extensia solicitata si va intoarce o lista cu acestea, inclusiv calea catre acesta. Metoda hideKeyboard(Activity, View) va ascunde tastatura. Metoda formatDate(Date) intoarce data in format String. Metoda isNumber(String) va verifica daca textul trimis ca parametru este sau nu un numar si va intoarce true daca este si false daca nu este. Metoda setButtonAnimation(Button, Activity) are grija sa deseneze animatia atunci cand un buton este apasat.
Clasa Product
Este o clasa foarte importanta deoarece contine toate atributele unui produs: id – int, name – String, price – double, mu – String, qauntity – float, sold – int, date – Date.
Clasa ReadFromFile
Aceasta clasa contine o metoda implementata numita readObjects(Context, String filename), care citeste dintr-un fisier toate obiectele pe care le intoarce sub forma de lista.
Clasa WriteToFile
Aceasta clasa contine doua metode statice. Prima metoda deleteFile(Context, String filename) sterge fisierul dat ca parametru de intrare. Cea de a doua metoda writeObjects(Context, String filename, List<Object>, WriteMode) se ocupa cu scrierea obiectelor in fisier. WriteMode este o enumerare ce contine doua valori, APPEND sau DELETE. APPEND este utilizat atunci cand vrem sa adaugam obiecte la sfarsitul ultimului scris in fisier si DELETE este utilizat pentru a sterge fisierul, iar apoi se scriu obiectele in el.
Clasa OptionsOfMenuItemsStrings
Contine toate numele optiunilor ale fiecarui buton din bara de actiune.
Clasa SpinnerStrings
Contine optiunile spinner-elor din toate aplicatia.
3.3 Design Patterns
In cadrul aplicatiei mele am utilizat trei design patterns : Singleton, Decorator si Chain of Responsability.
1. Singleton pattern
Acest pattern este utilizat pentru a se restrictiona numarul de instantieri ale unei clase, astfel, aceasta se poate instantia o singura data prin restrictionarea accesului la constructorul clasei si crearea unei metode statice ce intoarce obiectul, de asemenea si el static. Pentru acest pattern am construit clasa ApplicationSetting, care stocheaza setarile aplicatiei. Codul utilizat este urmatorul:
//mApplicationSettings este obiectul static intors de metoda getInstance
public static ApplicationSettings mApplicationSettings = null;
//constructorul nu mai poate fi utilizat deoarece a fost restrictionat
//accesul la acesta
private ApplicationSettings(){}
public static ApplicationSettings getInstance()
{
//trebuie verificat daca obiectul este null
if (mApplicationSettings == null)
{ //cand este null se va utiliza un contructor fara parametrii pentru
// a fi instantiat
return new ApplicationSettings();
}
else
{ //daca nu este null inseamna ca obiectul a fost creat anterior
//si este returnat
return mApplicationSettings;
}
}
ApplicationSettings app = ApplicationSettings.getInstance(); //astfel se instantiaza un //obiect de tip ApplicationSettings
2. Decorator pattern
Acest pattern este utilizat pentru a "decora" un obiect, adica unui obiect sa ii fie atasate cateva componente noi. Pentru a exemplifica acest pattern in cadrul aplicatiei mele, am contruit pe clasa Product, mai exact atributul pret, doua modalitati de a il "decora", valoarea acestui element se schimba in functie de comisionul si/sau TVA-ul stabilit de utilizator.
Mai intai a fost construita construita interfata ProductPrice, avand o metoda cu tip, care intoarce double. Dupa accea a fost contruita clasa abstracta ProductPriceTaxes, ce implementeaza interfata mentionata anterior. Clasa Product implementeaza interfata ProductPrice. Apoi au fost contruite cele 2 clase care au rolul de a modifica pretul PriceVAT si PriceCommission, ambele extind clasa abstracta ProductPriceTaxes.
public interface ProductPrice {
double priceWithTaxes();
}
public abstract class ProductPriceTaxes implements ProductPrice{
ProductPrice productPrice;
}
public class Product implements ProductPrice{
@Override
public double priceWithTaxes() {return getPret();} //returneaza pretul pentru a fi modificat
}
Clasa PriceVat aplica TVA-ul unui produs.
public class PriceVAT extends ProductPriceTaxes{
private double mVat;
public PriceVAT(ProductPrice productPrice, double vat){
this.productPrice = productPrice;
mVat = vat;
}
@Override
public double priceWithTaxes() {
return this.productPrice.priceWithTaxes() + this.productPrice.priceWithTaxes() * (mVat/100);
}
}
Clasa Commission aplica un anumit comision pretului unui produs.
public class PriceCommission extends ProductPriceTaxes {
private double mCommission;
public PriceCommission(ProductPrice productPrice, double commission){
this.productPrice = productPrice;
mCommission = commission;
}
@Override
public double priceWithTaxes() {
return this.productPrice.priceWithTaxes() + this.productPrice.priceWithTaxes() * mCommission;
}
}
3. Chain of Responsibility pattern
Acest pattern este utilizat, la fel cum spune numele, "lantul de responsabilitati", adica utilizatorul solicita indeplinirea unui anumit obiectiv. Inputul generat de utilizator este preluat de lant, mai exact de un obiect, care trimite acel input prin lantul de clase, pana in momentul cand este gasita metoda care poate prelucra.
Prima data a fost creata interfata ChangeQuantityChain cu doua metode, setNextChain fara tip care primeste un obiect ce implementeaza aceasta interfata si calculateQuantity ce intoarce un float si primeste ca parametru un obiect de tip Quantity. Clasa Quantity tine 3 atribute, cantitatea ce urmeaza sa fie schimbata, cantitatea cu care se modifica si tipul de operatie. Acest tip de operatie va stabili de catre ce metoda din cadrul lantului va fi preluata sarcina.
public interface ChangeQuantityChain {
void setNextChain(ChangeQuantityChain chain);
float calculateQuantity(Quantity quantity);
}
public class Quantity {
private float mOldQuantity;
private float mValue;
public enum TYPE {INCREASE, DECREASE}
private TYPE mType;
public Quantity(final float oldQuantity, final float value, TYPE type){
mOldQuantity = oldQuantity;
mValue = value;
mType = type;
}
public float getOldQuantity() {return mOldQuantity;}
public TYPE getType() {return mType;}
public float getValue() {return mValue; }
}
In continuarea este prezentata clasa IncreaseQuantity care implementeaza interfata ChangeQuantityChain.
public class IncreaseQuantity implements ChangeQuantityChain{
private ChangeQuantityChain mChain;
@Override
public void setNextChain(ChangeQuantityChain chain) {
mChain = chain;
}
@Override
public float calculateQuantity(Quantity quantity) {
float result = 0;
if (quantity.getType().equals(Quantity.TYPE.INCREASE)){ //se verifica daca aceasta clasa //este cea care indeplineste cerintele utilizatorului
result = quantity.getOldQuantity() + quantity.getValue();
}
else {
result = mChain.calculateQuantity(quantity); //se trimite obiectul mai departe catre //urmatoarea clasa din lant
}
return result;
}
}
Clasa DecreaseQuantity este ultima din lantul de operatiuni.
public class DecreaseQuantity implements ChangeQuantityChain{
private ChangeQuantityChain mChain;
@Override
public void setNextChain(ChangeQuantityChain chain) {mChain = chain;}
@Override
public float calculateQuantity(Quantity quantity) {
float result = 0;
if (quantity.getType().equals(Quantity.TYPE.DECREASE)){
if (quantity.getOldQuantity() – quantity.getValue() < 0){ // se verifica cantitatea disponibila
try {
throw new Exception("Not enough quantity"); // se arunca o exceptie daca //aceasta e prea mica
} catch (Exception e) {
e.printStackTrace();
}
}else {
result = quantity.getOldQuantity() – quantity.getValue();
}
}
else{
try {
throw new Exception("No operation!"); // daca se intra pe aceasta ramura inseamna ca //nu s-a gasit nici o operatiune compatibila cu cea ceruta
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
}
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: Managementul Activitatii Unui Depozit (ID: 142003)
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.
