În Tips & Tricks

Hello, Android! | Elementele ce dau viață unei aplicații

aplicații Android

În prima parte, am prezentat aspecte care țin mai mult de mediul de dezvoltare și de structura unui proiect. A venit momentul să aruncăm o privire asupra câtorva dintre elementele care dau viață unei aplicații.

Activity

Înainte de a începe să scriem cod, este bine să înțelegem ce reprezintă un Activity. Pe scurt, un Activity este un ecran dintr-o aplicație: lista de playlist-uri din Google Music, ecranul de procesare a unei poze din Instagram, keypad când formăm un număr de telefon și așa mai departe. Activity-ul se concentrează deci asupra unei funcționalități specifice a aplicației și doar asupra ei, având un ciclu de viață propriu și o stare ce poate fi persistentă.

În imaginea de mai sus, se poate vedea care este ciclul de viață al unui Activity. Acesta este destul de simplu, având o serie de stări care se succed și prin care trece orice Activity din sistem. Pentru articolul de față nu vom intra în detalii legate de fiecare stare, denumirile lor fiind destul de descriptive.

Comunicarea între Activity-uri

Cu toate că Activity-ul reprezintă o parte funcțională care se bucură de o anumită independență în contextul aplicației, ea trebuie să poată comunica cu alte Activity-uri și nu numai. Pentru aceasta, Android pune la dispoziția dezvoltatorilor un sistem de servicii și broadcast/receive foarte puternic. Această comunicare dintre componente se realizează prin intermediul “intențiilor”. Pe scurt și destul de ușor de reținut: utilizatorul declară intenția de a efectua o activitate.

Intent

Intent-urile sunt un mecanism universal în Android, ele fiind folosite pentru a porni Activity-uri, servicii și pentru a emite broadcast-uri. În continuare, ne vom concentra asupra Activity-urilor, urmând ca pe viitor să revenim asupra serviciilor și broadcast-urilor. Intent-ul în sine nu prezintă multă funcționalitate. Este un simplu obiect care are rolul de a stoca informația necesară pentru ca o activitate să pornească, partea de funcționalitate prezentă fiind legată exclusiv de aceasta.

Există două moduri prin care putem crea un Intent:

  • explicit– prin atribuirea unui identificator sub forma unui String unic
    • Intent intent = new Intent(“com.example.myapp.myaction”);
  • implicit– prin specificarea instanței clasei care emite intenția și specificarea clasei de tipul căreia dorim să fie instanța creată
    • Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);

După cum spuneam, Intent-ul are rolul de a stoca și transmite informație între activități. Informația se transmite sub forma de perechi cheie-valoare. Generic, ele poartă denumirea de extras. Extra-urile pot avea orice tip primitiv, dar avem la dispozitie și metode pentru a putea transmite obiecte de orice tip.

Pentru aplicația aceasta, vom transmite numele de utilizator introdus în primul ecran, activitatea de login.

Login Activity

A venit în sfârșit și momentul să vedem efectiv codul care face ca aplicația să funcționeze. Primul Activity este cel de login. Acesta va afișa un simplu ecran de login cu 3 componente (denumite și Views). Două dintre ele sunt folosite pentru introducerea numelui de utilizator și a unei parole, iar al treilea este un buton care, atunci când este atins, trimite utilizatorul la cel de-al doilea Activity.

În primul rând, vom folosi metoda onCreate, care se execută în momentul în care Activity-ul este creat, pentru a specifica care layout să fie folosit. În același timp, ne și asigurăm că avem accesibile instanțele celor două câmpuri de text pentru a putea prelua numele de utilizator și parola introduse. Acestea sunt obținute prin metoda findViewById(int), care va returna instanța view-ului specificat prin identificator.

Cea de-a două metodă a clasei este handler-ul pentru evenimentul de onClick. Vom fi nevoiți să specificăm numele acestei metode în fișierul de layout dedicat Activity-ului, aceasta trebuind să accepte neapărat ca parametru un obiect de tipul View.

În momentul în care utilizatorul apasă butonul de login, vom citi din cele două câmpuri numele de utilizator și parola. Apoi, vom crea un obiect de tipul Intent și specificăm ca sursă instanța curentă a activității, iar ca destinație o instanță nouă, de tipul UserScreenActivity.

Apoi, trebuie să introducem în acel obiect numele de utilizator pentru a-l putea trimite spre destinație. Acest lucru se face prin metoda setExtra(), folosind o cheie unică pentru identificare.

În acest moment, toate informațiile necesare pentru a porni Activity-ul sunt conținute în Intent și vom apela metoda startActivity(), care va declanșa ecranul de bun venit.

Home Screen Activity

Cel de-al doilea Activity are rolul de a prelua informația introdusă de utilizator în primul ecran și de a afișa un text de bun venit. Nu vom insista asupra aspectelor de validare a parolei și așa mai departe.

În acest caz, implementarea metodei onCreate() este un pic diferită. Prin metoda getIntent(), obținem practic obiectul Intent care conține informația dorită: numele de utilizator. Folosind cheia unică, extragem obiectul de tip String din extras și putem să-l afișăm pe ecran.

Layout-urile

Am menționat anterior fișierele de layout. După cum spuneam, ele au rolul de a descrie cum sunt așezate pe ecran componentele interfeței grafice. În cadrul acestui articol, nu vom intra în prea multe detalii legate de acestea.

În ambele activități vom folosi <LinearLayout>, care așază toate componentele din interior în ordine liniară, pe verticală sau pe orizontală. Fiecare componentă, fie că este vorba de layout-uri sau de butoane și text, poate să primească un identificator care o face accesibilă în cadrul codului Java. În plus, fiecare componentă are un set de atribute care pot modifica modul în care ele sunt afișate. Acestea sunt foarte similare celor folosite în CSS.

De remarcat aici atributul onClick al butonului, care specifică numele metodei care va fi executată atunci când utilizatorul îl atinge.

Android Manifest

Înainte de a putea rula aplicația, trebuie să completăm câteva informații în fișierul AndroidManifest.xml. Acest fișier, extrem de important, conține toate detaliile aplicației. Orice fel de Activity pe care îl folosim în aplicație trebuie declarat aici. Același lucru este valabil și pentru servicii și/sau receivere, dar în momentul de față ne vom concentra asupra Activity-urilor.

Fișierul e important și pentru că poate conține lista de permisii cerute de aplicatie, fără de care anumite feature-uri ale telefonului, cum ar fi accesul la internet, contacte sau GPS, nu ar fi posibile.

De observat este elementul de intent-filter de la Activity-ul de login, care este Activity-ul nostru principal. Prin specificarea acelui filtru, predefinit în SDK, înștiințăm sistemul că respectiva activitate este cea care trebuie pornită atunci când utilizatorul folosește iconița din meniul de aplicații și reprezintă practic punctul de intrare în aplicația noastră.

Rularea aplicației

Pentru a rula aplicația, va trebui să creăm un Run Configuration. E foarte simplu, din Toolbar, din partea de Run, alegem Edit Configurations.

În fereastra de configurații, adăugăm o configurație nouă, alegând tipul Android Application. Din panel-ul de configurare, alegem modulul curent și alegem dacă vrem să rulăm aplicația pe emulator (care va porni automat, dacă nu este deja pornit) sau pe telefon, dacă acesta e conectat la USB. Restul opțiunilor au deja valori implicite și nu vom intra în detalii asupra lor.

După ce am terminat de creat configurația, tot ce rămâne de făcut este să o alegem din meniu și să dăm click pe butonul Play. Idea va compila aplicația într-un APK (formatul de aplicații folosit de Android) și va instala aplicația pe telefon sau pe emulator și o va porni.

Concluzii

Cu toate că poate părea mult pentru o primă aplicație, aceste aspecte prezentate reprezintă baza aplicațiilor pe Android și, odată deprins modul în care funcționează acestea, învățarea altor aspecte mai complexe, cum ar fi serviciile sau mecanismul de broadcast/receiver devin simple formalități.

Pentru a putea înțelege mai ușor, puteți să descărcați de aici proiectul Idea, ce conține codul sursă complet și funcțional al aplicației. Aștept, desigur, comentariile voastre pe marginea articolului, precum și eventuale întrebări la care am să încerc să răspund cât mai repede.