Documente Academic
Documente Profesional
Documente Cultură
Activity (Activitate)
reprezinta o interfata cu utilizatorul, fereastra sau formular;
o aplicatie Android poate avea una sau mai multe activitati; de exemplu o aplicatie de
tip Agenda poate avea o activitate pentru a gestiona contactele, o activitate pentru a gestiona
intâlniri si una pentru a edita o intrare in agenda;
fiecare Activitate are propriul sau ciclu de viata, independent de ciclul de viata al procesului
asociat aplicatiei;
fiecare activitate are propria stare si datele acesteia pot fi salvate sau restaurate;
activitatile pot fi pornite de aplicatii diferite (daca este permis);
are un ciclu de viata complex deoarece aplicatiile pot avea activitati multiple si doar una este in
prim-plan; utilizând managerul de activitati, sistemul Android gestioneaza o stiva de activitati
care se gasesc in diferite stari (pornire, in executie, intrerupta, oprita, distrusa);
in SDK, Activitatea este implementata folosind o subclasa a clasei Activity care extinde clasa
Context;
utilizati ciclul de viata al activitatii pentru a crea, vizualiza, utiliza si a opri activitatile;
salvati datele utilizatorului inainte ca activitatea sa fie oprita si le restaurati atunci când
activitatea este readusa in prim-plan;
creati aplicatii cu mai multe formulare sau activitati;
Ciclului de viata al unei Activitati descrie starea in care o activitate poate fi la un moment dat
(denumirele sunt lasate intentionat in Engleza deoarece fac parte din vocabularul programatorului):
Running - Activitatea a fost creata (onCreate()), pornita (onStart()) si este afisata pe ecranul
aparatului; in cazul in care activitatea a mai fost utilizata si aplicatia a salvat starea acesteia
(onSaveInstanceState()), activitatea este reluata din acel punct
(onRestoreInstanceState() si onResume()); in aceasta stare utilizatorul interactioneaza cu activitatea
prin intermediul interfetei dispozitivului (tastatura, touchscreen, display);
Paused - Activitatea pierde prim-planul (onPause()), deoarece o alta activitate este executata, cum ar
fi o fereastra de dialog; de asemenea, in cazul in care aparatul intra in modul sleep, activitatea este
oprita temporar; activitatea isi poate relua executia (onResume()) si este plasata inapoi in prim-plan;
Stopped – Activitatea nu este mai in uz si pentru ca este oprita (onStop()) nu este vizibila; pentru a fi
reactivata (ea deja exista), activitatea trebuie sa fi repornita ( onRestart() si onStart()) si reluata
(onResume());
Destroyed – Activitatea este distrusa (onDestroy()) si memoria sa eliberat, deoarece nu mai este
necesara sau sistemul are nevoie de memorie suplimentara pentru rutinele proprii sau pentru alte
activitati; deoarece managementul memoriei este un aspect important pentru sistemul de operare
Linux al dispozitivului mobil, procesul care gazduieste o activitate intrerupta, oprita sau distrusa,
poate fi terminat pentru a elibera memorie pentru noi activitati; doar procesele ce gestioneaza
activitati ce ruleaza sunt protejate;
Dupa cum se poate observa in imaginea anterioara, Activitatea are mai multe stari intre care exista
tranzitii clare. In ciuda faptului ca lucrurile pot arata complicat, in realitate ele sunt mult mai simple
daca ne concentram pe urmatoarele elemente:
Pentru a supradefini metodele anterioare, trebuie sa se acorde atentie semnaturii acestora (numele
metodei si lista de parametri). Este mai sigur sa folosesti adnotarea @Override pentru a solicita o
validare din partea compilatorului (in cazul in care metoda definita nu supradefineste o metoda din
clasa de baza, atunci veti obtine o eroare de compilare).
Pentru a supradefini onCreate() sau onPause(), solutia este:
public class SomeActivity extends Activity {
// The activity is being created.
@Override
public void onCreate(Bundle savedInstanceState) {
// DO NOT forget to call the base method
super.onCreate(savedInstanceState);
}
Intent (Intentie)
reprezinta o entitate folosit pentru a descrie o operatiune care urmeaza sa fie executata; este
un mesaj transmis catre o alta componenta pentru a anunta o operatiune;
oarecum similar cu conceptul de event-handler din .NET sau Java.;
un mesaj asincron utilizat pentru a activa activitati sau servicii;
gestionata de o instanta a clasei Intent;
Service (Serviciu)
un task care se executa in fundal, fara interactiunea directa cu utilizatorul;
gestionata de o instanta a clasei Service;
Structura unei Intenții
În structura unei intenții pot fi identificate mai multe elemente, precizate în cadrul
secțiunii <intent-filter>, prin intermediul cărora se declară faptul că o componentă a
unei aplicații poate realiza o anumită acțiune pentru un anumit set de date (sau pe care un
ascultător al unei intenții cu difuzare îl poate procesa):
acțiunea (action) care trebuie executată este indicată prin
proprietatea android:name, cele mai frecvent utilizate valori
fiind: MAIN, VIEW, DIAL, CALL, ANSWER, SEND, SENDTO, INSERT, EDIT, DELETE, SEARCH
, WEB_SEARCH; fiecare filtru de intenție trebuie să indice cel puțin o acțiune; este
recomandat să se utilizeze convențiile folosite în Java pentru identificarea
pachetelor pentru denumirile acțiunilor;
Între o acțiune și componenta pe care aceasta o invocă nu există o relație de tip 1:1,
întrucât o acțiune poate determina execuția unor componente diferite, în funcție de tipul de
date care sunt atașate acesteia. Astfel, fiecare activitate va defini ca atribute ale
alementului data din <intent-filter> informații legate de categoria MIME ale datelor
procesate (mimeType), de locația la care se găsesc (path, host, port), de schema utilizată
(scheme).
extra (extra) este un obiect de tip Bundle care conține informații suplimentare cu
privire la componenta respectivă; informațiile conținute într-o intenție pot fi
obținute folosind intent.getExtras(), în timp ce specificarea unor informații care
vor fi atașate la o intenție va fi realizată printr-un apel al
metodei intent.putExtras(Bundle).
Dintre aceste componente, esențiale sunt acțiunea și datele:
1. contextul reprezintă punctul central al unei aplicații Android, oferind acces către mai
multe funcționalități ale acesteia (inclusiv la resursele dizpozitivului mobil, serviciile
sistemului de operare, diferite fișiere de configurare); este instanțiat sub forma unui
obiect de tip android.app.Application;
2. activitatea realizează sarcini a căror execuție nu influențează timpul de răspuns al
aplicației Android, astfel încât să nu aibă un impact asupra experienței utilizatorului;
de aceea, este asociată unei ferestre (interfețe grafice), o aplicație Android fiind
formată din una sau mai multe activități;
3. fragmentul conține interfața grafică și logica aplicației corespunzătoare unei părți din
cadrul unei activități; motivul pentru care se recurge la modularizarea unei activități
prin intermediul a mai multor fragmente este asigurarea consistenței și flexibilității
aplicației Android pe mai multe echipamente mobile, cu dispozitive de afișare de
dimensiuni și rezoluții diferite;
4. serviciul încapsulează procese mai complexe, executate în fundal (și posibil la
intervale de timp regulate) a căror rulare durează o perioadă de timp semnificativă,
astfel încât să nu poată fi plasate în cadrul aceluiași fir de execuție ca și interfața
grafică prin care se asigură interacțiunea cu utilizatorul;
5. intenția este mecanismul de comunicare între elementele unei aplicații Android
(activități și servicii); prin intermediul unui sistem de mesagerie (asincronă),
sistemul de operare Android mapează o solicitare (împachetată sub forma unei
intenții) către componenta adecvată.
Operatii asupra Serviciilor
onCreate(Bundle) - apelată în momentul în care activitatea este creată; această
metodă va fi folosită pentru inițializări statice:
încărcarea interfeței grafice printr-un apel al metodei setContentView(int) (al
cărei parametru reprezintă referința către resursa de tip .xml care descrie
interfața grafică);
obținerea de referințe către componentele interfeței grafice printr-un apel al
metodei findViewById(int) (al cărei parametru reprezintă referința către
componenta respectivă - eng. widget - așa cum apare în resurse);
indicarea unor obiecte de tip ascultător care să gestioneze evenimentele legate
de interacțiunea cu utilizatorul;
realizarea unor conexiuni către alte modele de date.
Crearea activității este diferită de apariția acesteia pe ecran.
onRestart() - apelată atunci când activitatea a fost oprită și ulterior repornită; este
urmată întotdeauna de metoda onStart();
onStart() - apelată înainte ca activitatea să apară pe ecran; poate fi urmată de
metoda onResume() dacă activitatea trece în prim-plan sau de
metoda onPause() dacă activitatea trece în fundal;
onResume() - apelată înainte ca activitatea să interacționeze cu utilizatorul; această
metodă va fi folosită pentru a porni servicii sau cod care trebuie să ruleze atâta
timp cât aplicația este afișată pe ecran; este urmată întotdeauna de
metoda onPause();
onPause() - apelată înainte ca activitatea să fie întreruptă temporar, iar o altă
activitate să fie reluată; această metodă va fi utilizată pentru a opri servicii sau cod
care nu trebuie să ruleze atâta timp cât activitatea se află în fundal (întrucât
consumă timp de procesor) și pentru a salva starea diferitelor componente în
vederea asigurării persistenței și a consistenței aplicației înainte și după
evenimentul care a produs suspendarea sa; poate fi urmată de
metoda onResume() dacă activitatea trece în prim-plan sau de
metoda onStop() dacă activitatea este ascunsă;
Procesările realizate în metoda onPause() nu trebuie să ocupe un interval de timp prea
mare întrucât în caz contrar ar bloca noua activitate care urmează să fie lansată în execuție.
onStop() - apelată în momentul în care activitatea este ascunsă, fie din cauză că
urmează să fie distrusă, fie din cauză că o altă activitate, a cărei interfață grafică
ocupă întreaga suprafață a dispozitivului de afișare, urmează să devină vizibilă;
poate fi urmată de metoda onRestart(), dacă activitatea urmează să
interacționeze (din nou) cu utilizatorul, sau de metoda onDestroy() dacă
activitatea urmează să fie terminată sau distrusă de sistemul de operare;
onDestroy() - apelată înainte ca activitatea să se termine sau să fie distrusă de
către sistemul de operare (fie manual, fie automat) din lipsă de memorie; această
metodă va fi utilizată pentru a elibera resursele ocupate.
Distincția între cele două situații în care o activitate este distrusă poate fi realizată prin
intermediul metodei isFinishing().
AsyncTask
Android definește AsyncTask drept „o clasă care extinde clasa Obiect pentru a permite operațiunile
scurte să ruleze asincron în fundal.” Cu „doInBackground” și „onPostExecute”, Async poate rula activități
asincron pe noi fire.
@Override
protected void onPreExecute() {
//Setup precondition to execute some task
}
@Override
protected String doInBackground(String... params) {
//Do some task
publishProgress (1);
return "";
}
@Override
protected void onProgressUpdate(Integer... values) {
//Update the progress of current task
}
@Override
protected void onPostExecute(String s) {
//Show the result obtained from doInBackground
}
}
async
Codul Coroutine trebuie transmis ca lambda în asyncfuncție
async {
// Coroutine body
}
await
Codul de rulare lungă trebuie trecut ca awaitfuncție lambda
async {
val result = await {
//Long running code
}
// Use result
}
Este posibil să aveți multe awaitapeluri în interiorul asyncblocului sau să aveți awaito
buclă
Definiția Context
Interfeţe
Interfeţele duc conceptul abstract un pas mai departe. Se poate considera că o interfaţă este
o clasă abstractă pură: permite programatorului să stabilească o “formă” pentru o clasă (numele
metodelor, lista de argumente, valori întoarse), dar fară nicio implementare. O interfaţă poate
conţine câmpuri dar acestea sunt în mod implicit static și final. Metodele declarate în interfață sunt
în mod implicit public.
Interfaţa este folosită pentru a descrie un contract între clase: o clasă care implementează o
interfaţă va implementa metodele definite în interfaţă. Astfel orice cod care folosește o anumită
interfaţă știe ce metode pot fi apelate pentru aceasta.
Pentru a crea o interfaţă folosim cuvântul cheie interface în loc de class. La fel ca în cazul claselor,
interfaţa poate fi declarată public doar dacă este definită într-un fișier cu același nume ca cel pe
care îl dăm acesteia. Dacă o interfaţă nu este declarată public atunci specificatorul ei de acces
este package-private. Pentru a defini o clasă care este conformă cu o interfaţă anume folosim
cuvântul cheie implements. Această relaţie este asemănătoare cu moștenirea, cu diferenţa că nu
se moștenește comportament, ci doar “interfaţa”. Pentru a defini o interfaţă care moștenește altă
interfaţă folosim cuvântul cheie extends. Dupa ce o interfaţă a fost implementată, acea
implementare devine o clasă obișnuită care poate fi extinsă prin moștenire.
Metode http
1. GET: este cea mai folosită metodă, fiind utilizată atunci când serverului i se cere o resursă.
2. HEAD: se comportă exact ca metoda GET, dar serverul returnează doar antetul resursei,
ceea ce permite clientului să inspecteze antetul resursei, fără a fi nevoit să obțină și corpul
resursei.
3. PUT: metoda este folosită pentru a depune documente pe server, fiind inversul metodei
GET.
4. POST: a fost proiectată pentru a trimite date de intrare către server.
5. DELETE: este opusul metodei PUT.
6. TRACE: este o metodă folosită de obicei pentru diagnosticare, putând da mai multe
informații despre traseul urmat de legătura HTTP, fiecare server proxy adăugându-și
semnătura în antetul Via.
7. OPTIONS: este folosită pentru identificarea capacităților serverului Web, înainte de a face o
cerere.
8. CONNECT: este o metodă folosită în general de serverele intermediare
Numele
Descriere Exemplu stare
câmpului antet
Perman
SCOP Exemple de manipulări A-IM: feed
ent
instanțiale pentru
Numele
Descriere Exemplu stare
câmpului antet
solicitare [10] .
Tipurile de tipuri de
materiale care sunt
Perman
Accept acceptabile pentru Accept: text/html
ent
răspuns. Consultați Ne
gocierea conținutului .
Lista codificărilor
Perman
Accept-Encoding acceptabile. Consultați Accept-Encoding: gzip, deflate
ent
compresia HTTP .
Acces-Control-
Inițiază o cerere
Solicitare-
de partajare a Perman
Metodă,
resurselor de origine Access-Control-Request-Method: GET ent:
Access-Control-
încrucișată cu Origin ( standard
Request-
mai jos).
Headers [11]
HTTP .
Folosit pentru a
specifica directive
care trebuie să fie
respectate de către Perman
Cache-Control Cache-Control: no-cache
toate mecanismele de ent
caching de-a lungul
lanțului de cerere-
răspuns.
Opțiunile de control
pentru conexiunea
curentă și lista Connection: keep-alive
Perman
Conexiune câmpurilor de solicitare ent
hop-by-hop. [12] Connection: Upgrade
Nu trebuie utilizat cu
HTTP / 2. [13]
Lungimea corpului de
solicitare Perman
Content-Length Content-Length: 348
în octeți ( octeți pe 8 ent
biți).
O sumă
binară MD5 codată Content-MD5: Învechit [
Content-MD5 de Base64 a
Q2hlY2sgSW50ZWdyaXR5IQ== 14]
conținutului corpului de
solicitare.
Indică faptul că
anumite
Perman
Aştepta comportamente ale Expect: 100-continue
ent
serverului sunt
solicitate de client.
Adresa de e-mail a
Perman
Din utilizatorului care face From: user@example.com
ent
cererea.
Numele domeniului
serverului
(pentru găzduirea
virtuală )
șinumărul portului
TCP pe care serverul
asculta. Numărulportul
Host: en.wikipedia.org:8080
ui poate fi omis dacă Perman
Gazdă
portul este portul ent
Host: en.wikipedia.org
standard pentru
serviciul solicitat.
Obligatoriu de la HTTP
/ 1.1. [16] Dacă cererea
este generată direct în
HTTP / 2, nu ar trebui
utilizată. [17]
Numele
Descriere Exemplu stare
câmpului antet
O solicitare de upgrade
de la HTTP / 1.1 la
HTTP / 2 TREBUIE să
includă exact
un HTTP2-
Setting câmp de
antet. Câmpul HTTP2-
Settings antetului Perman
HTTP2-Setări este un câmp de antet HTTP2-Settings: token64 ent:
specific pentru standard
conexiune, care
include parametrii care
guvernează
conexiunea HTTP / 2,
furnizate în așteptarea
ca serverul să accepte
cererea de
upgrade. [18] [19]
Executați acțiunea
numai dacă entitatea
furnizată de client se
potrivește cu aceeași
entitate pe
server. Aceasta este în
If-Match: Perman
Dacă-Match principal pentru
"737060cd8c284d8af7ad3082f209582d" ent
metode precum PUT
pentru a actualiza doar
o resursă dacă nu a
fost modificată de la
ultima actualizare a
utilizatorului.
Permite ca un 304 nu
modificat să fie
If-Modified-Since: Sat, 29 Oct 1994 Perman
If-Modified-Since returnat dacă
19:43:31 GMT ent
conținutul este
neschimbat.
Trimiteți răspunsul
Dacă- If-Unmodified-Since: Sat, 29 Oct
numai dacă entitatea Perman
Nemodificată-
nu a fost modificată de 1994 19:43:31 GMT ent
Since
la o anumită oră.
Limitați numărul de
repetări a mesajelor
Perman
Max-Atacanți prin intermediul proxy- Max-Forwards: 10
ent
urilor sau a gateway-
urilor.
Inițiază o cerere
de partajare a
resurselor de origine
Origin: http://www.example-social- Perman
transversală (solicită
Origine [11] ent:
server network.com
standard
pentru câmpurile de
răspunsAccess-
Control- * ).
Domenii specifice
implementării care pot
Perman
Pragma avea efecte diferite Pragma: no-cache
ent
oriunde în lanțul de
solicitare-răspuns.
Codurile de transfer pe
care agentul utilizator
este dispus să le
accepte: pot fi utilizate
aceleași valori ca și
câmpul pentru antetul
de răspuns Transfer-
Encoding, plus
valoarea "remorci" Perman
TE TE: trailers, deflate
(legată de metoda de ent
transfer " chunked ")
pentru a notifica
serverul pe care se
așteaptă să îl accepte
primiți câmpuri
suplimentare în
remorcă după ultima
bucată de dimensiune
Numele
Descriere Exemplu stare
câmpului antet
zero.
Cereți serverului să
facă upgrade la un alt
Upgrade: h2c, HTTPS/1.3, IRC/6.9, Perman
Modernizare protocol.
RTA/x11, websocket ent
Nu trebuie să fie
utilizat în HTTP / 2. [13]
Informează serverul
Via: 1.0 fred, 1.1 example.com Perman
Prin intermediul proxy-urilor prin care
(Apache/1.1) ent
cererea a fost trimisă.
O avertizare generală
cu privire la posibile Perman
Avertizare Warning: 199 Miscellaneous warning
probleme cu entitatea ent
entității.
9.