Sunteți pe pagina 1din 20

- Noțiunea de Activity

Componentele aplicatiei Android


Cele mai importante componente ale unei aplicatii Android sunt:

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;

Ciclul de viata al unei Activitati


Activitatea este una dintre cele mai importante componente (alaturi de servicii si broadcast receivers)
ale unei aplicatii Android deoarece este strans legata de interfata cu utilizatorul. O activitate este
utilizat pentru a gestiona interfata cu utilizatorul si este echivalenta cu fereastra sau formularul din
aplicatiile desktop.

Intelegerea modului in care se controleaza activitatea va permite sa:

 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;

Diagrama ciclului de viata pentru o activitate Android

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:

 o singura Activitatea poate fi in prim-plan la un moment dat;


 doar sistemul gestioneaza starile si tranzitiile unei Activitati si NU programatorul (nu in mod
direct, deoarece atunci când se lanseaza o activitate noua se modifica implicit starea activitatii
curente)
 IMPORTANT ! sistemul va anunta atunci când activitatea isi schimba starea prin intermediul
handler-elor (metode de forma onXXX()) pentru evenimentele de tip tranzitie; ca programator,
puteti adauga propriul cod prin supradefinirea acestor metode:
onCreate(Bundle) – apelata cand activitatea este creata; folosind argumentul metodei de
tip Bundle exista posibilitatea sa restabiliti starea activitatii, care a fost salvata intr-o sesiune
anterioara; dupa ce activitatea a fost creata, va fi pornita ( onStart());
onStart() – apelata in cazul in care activitatea urmeaza sa fie afisata; din acest punct, activitatea
poate veni in prim-plan (onResume()) sau ramane ascunsa in fundal (onStop());
onRestoreInstanceState(Bundle) – apelata in cazul in care activitatea este initializata cu datele dintr-o
stare anterioara, ce a fost salvata; in mod implicit, sistemul restaureaza starea interfetei cu
utilizatorul (starea controalelor vizuale, pozitia cursorului, etc);
onResume() – apelata cand activitatea este vizibila iar utilizatorul poate interactiona cu aceasta; din
aceasta stare, activitatea poate fi plasata in fundal, devenind intrerupta ( onPause());
onRestart() – apelata in cazul in care activitatea revine in prim-plan dintr-o stare oprita (stopped);
dupa aceasta, activitate este pornita (onStart()) din nou;
onPause() – apelata atunci când sistemul aduce in prim-plan o alta activitate; activitatea curenta este
mutata in fundal si mai târziu poate fi oprita (onStop()) sau repornita si afisata (onResume()); acesta
este un moment bun pentru a salva datele aplicatiei intr-un mediu de stocare persistent (fisiere,
baze de date) deoarece dupa aceasta faza activitatea poate fi terminata si distrusa fara a se anunta
acest lucru.
onSaveInstanceState(Bundle) – apelata pentru a salva starea curenta a activitatii; in mod implicit,
sistemul salveaza starea interfetei cu utilizatorul;
onStop() – apelata in cazul in care activitatea nu mai este utilizata si nu mai este vizibila deoarece o
alta activitate interactioneaza cu utilizatorul; din acest punct, activitatea poate fi repornita
(onRestart()) sau distrusa (onDestroy());
onDestroy() – apelata in cazul in care activitatea este distrusa, iar memoria sa eliberata; acest lucru
se poate intâmpla in cazul in care sistemul necesita mai multa memorie sau daca programatorul
termina explicit activitatea apeland metoda finish() din clasa Activity;
Deoarece tranzitiile dintre stari sunt descrise prin apeluri catre diferite metode de tipul onXXX(),
ciclul de viata al unei Activitati poate fi descris de succesiunea posibila a acestor apeluri:

Events Handlers pentru o activitate Android

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);
}

// Another activity is put in the foreground.


@Override
protected void onPause() {
// DO NOT forget to call the base method
super.onPause();
}
}
Important !
Atunci când se supradefineste una din metodele onXXX(), trebuie sa apelati (prima
instructiune din metoda) forma metodei din clasa de baza (Activity), deoarece scopul acestei
abordari este de a adauga propriul cod la evenimentele activitatii si NU de a le rescrie.
Important !
Dupa cum se poate observa in ultimele doua imagini, activitatea se poate gasi in stari, cum
ar fi Stopped sau Destroyed, in care sistemul de operare poate termina procesul care
gazduieste activitatea. Sistemul de operare va elibera memoria acupata de activitate, fara a
apela metodele onStop() si onDestroy(). In concluzie, evenimentul anuntat de onPause() este
momentul recomandat pentru a salva starea unei activitati inainte ca aceasta sa fie distrusa.

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).

 categoria (category), indicată tot prin proprietatea android:name oferă informații


suplimentare cu privire la acțiunea care trebuie realizată; fiecare filtru de intenție
poate specifica mai multe categorii, putând fi utilizate valori definite de utilizator
sau valori preexistente în sistemul de operare Android:
 ALTERNATIVE - acțiunea ar trebui să fie disponibilă ca o alternativă la activitatea
implicită pentru tipul de date respectiv;
 SELECTED_ALTERNATIVE - acțiunea poate fi selectată, dintr-o listă, ca o
alternativă la activitatea implicită pentru tipul de date respectiv;
 BROWSABLE - indică o acțiune disponibilă din cadrul navigatorului; pentru ca o
activitate sau un serviciu să poată fi invocate din cadrul navigatorului trebuie să
specifice în mod obligatoriu această categorie;
 DEFAULT - utilizat pentru ca activitatea sau serviciul să fie utilizate în mod
implicit pentru tipul de date specificat în filtrul de intenții; de asemenea, este
necesar pentru activitățile sau serviciile care se doresc a fi lansate în execuție
prin intermediul unor intenții explicite;
 HOME - este folosit pentru a indica o alternativă la ecranul principal, dacă nu este
indicată nici o acțiune;
 LAUNCHER - atunci când este specificat, face ca activitatea să fie inclusă în
meniul de aplicații care pot fi lansate în execuție direct de către utilizator, prin
accesarea lor;
 alte valori: INFO, PREFERENCE, CAR_DOCK, DESK_DOCK, CAR_MODE, APP_MAKET.
 datele (data) reprezință informațiile care vor fi procesate, fiind exprimate de obicei
sub forma unui URI, fie că este vorba despre un număr de telefon (prefixat
de tel:), despre datele unei persoane din lista de contacte (prefixate
de content://contacts/people), despre coordonate geografice (prefixate
de geo:) sau o adresă Internet (prefixată de http://www.); pot fi specificate o
serie de proprietăți (în orice combinație) pentru a indica datele suportate de
componenta respectivă:
 android:host - o adresă (accesibilă prin rețea - poate fi indicată denumirea sau
adresa IP a gazdei) la care se găsesc datele ce pot fi procesate de componentă;
 android:mimeType - tipul de date;
 android:path - locația la care se găsesc datele;
 android:port - portul pe care se permite conexiunea pentru accesarea datelor;
 android:scheme - un protocol prin intermediul căruia pot fi accesate datele
(spre exemplu, file, http, mailto, content, tel).
 tipul (type) referă în mod explicit clasificarea MIME al datelor (deși aceasta poate fi
dedus în mod automat din conținutul propriu-zis al datelor respective);
 componenta (component) specifică în mod explicit denumirea unei clase care va fi
invocată de intenție (deși aceasta putea fi dedusă în mod automat din denumirea
acțiunii și categoria ei, datele și tipul lor);
În situația în care se specifică un nume de componentă, intenția se numește explicită, iar în
situația în care aceasta este determinată în funcție de acțiune și de date, intenția se
numește implicită.

 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:

 acțiunea este transmisă ca parametru al constructorului clasei Intent;


 datele sunt transmise prin intermediul metodei setData() (pentru acțiunile care
necesită date); fiind vorba despre un URI, acesta va fi construit ca rezultat
al Uri.parse(…).
După ce a fost construit obiectul de tip Intent prin specificarea acestor parametri, acțiunea
poate fi executată prin transmiterea acestuia ca parametru al
metodei startActivity() sau startService(), disponibile în
clasa android.content.Context.
startActivity(intent); startService(intent);
Terminarea unei activități (moment în care se realizează revenirea la activitatea părinte)
este realizată prin apelul metodei finish().
Servicii
În Android, clasa android.app.Service este utilizată pentru componente a căror
funcționalitate implică procesări complexe, de lungă durată, necesitând acces la anumite
resurse, fără a fi necesar să pună la dispoziție o interfață grafică sau un mecanism de
interacțiune cu utilizatorul. Prin intermediul unui serviciu, se asigură faptul că aplicația
Android continuă să se găsească în execuție, chiar și atunci când interfața grafică a acesteia
nu este vizibilă.

Structura unui Serviciu

Se observă faptul că ciclul de viață al unui serviciu are loc între


metodele onCreate() și onDestroy(). De cele mai multe ori, este necesar ca un serviciu să
folosească unul sau mai multe fire de execuție (dedicate) astfel încât să nu influențeze
responsivitatea aplicației Android. Într-o astfel de situație, firul de execuție va fi pornit pe
metoda onCreate() și va fi oprit pe metoda onDestroy(). De asemenea, în cadrul
metodei onCreate() au loc diferite operații de configurare (inițializări), în timp ce în cadrul
metodei onDestroy() realizează eliberarea resurselor folosite.
Metodele onCreate() și onDestroy() sunt invocate pentru toate tipurile de servicii, atât
pentru cele de tip started, cât și pentru cele de tip bounded.
În cazul unui serviciu de tip started, perioada activă din ciclul de viață este cuprinsă între
apelul metodei onStartCommand() (apelată în mod automat atunci când o componentă
apelează metoda startService(), primind ca argument obiectul de tip Intent care a fost
folosit la invocarea sa) și apelul metodei onDestroy() (apelat atunci când serviciul este
oprit, prin intermediul uneia dintre metodele stopSelf() sau stopService()).
În cazul unui serviciu de tip bounded, perioada activă din ciclul de viață este cuprinsă între
apelul metodei onBind() (apelată în mod automat atunci când o componentă apelează
metoda bindService(), primind ca argument obiectul de tip Intent care a fost folosit la
invocarea sa) și apelul metodei onUnbind() (apelată în mod automat atunci când toate
componentele asociate serviciului au apelat metoda unbindService()).

Structura unei Aplicații (I)


O aplicație Android poate conține mai multe componente:

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.

Metoda onCreate() este întotdeauna urmată de metoda onStart().

 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.

Procesul în contextul căruia rulează o activitate nu poate fi distrus de sistemul de operare


până ce nu s-a terminat apelul metodei onPause(), aceasta fiind singura metodă care este
apelată în mod garantat înainte de a se solicita memoria pe care activitatea o folosește.

 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.

Sarcinile asincrone folosesc:

1. Parame, parametri care sunt trimiși sarcinii la executare.


2. Progres, unitățile de progres care sunt publicate în timpul calculului de fundal.
3. Rezultat, rezultatele calculului de fundal.

Când o sarcină asincronă este executată, sarcina parcurge 4 pași:


1. onPreExecute : pas folosit pentru a configura sarcina
2. doInBackground : un pas utilizat pentru îndeplinirea sarcinii efective
3. onProgressUpdate : un pas utilizat pentru actualizarea stării de progres curente a sarcinii care
se execută în doInBackground
4. onPostExecute : odată ce doInBackground termină execuția sarcinii, acest pas livrează
rezultatul înapoi la firul principal al UI și oprește procesul AsyncTask

Exemple de utilizare a AsyncTask

Doriți să încercați AsyncTask? Iată un exemplu de utilizare a acestei funcții.

class DoSomeTask extends AsyncTask{

@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

 Contextul reprezintă datele mediului


 Oferă acces la lucruri precum baze de date
Lucrurile care implică context sunt:
1. Încărcarea unei resurse.
2. Lansarea unei noi activități.
3. Crearea de vizualizări.
4. obținerea serviciului de sistem.
Clase abstracte vs Interfețe
Folosim o clasă abstractă atunci când vrem:

 sa implementăm doar unele din metodele din clasă


 ca respectiva clasă să nu poată fi instanțiată
Folosim o interfață atunci când vrem:

 să avem doar o descriere a structurii, fără implementări


 ca interfața în cauză să fie folosită împreună cu alte interfețe în contextul moștenirii
Clase abstracte
Dorim să stabilim interfaţa comună pentru a putea crea funcţionalitate diferită pentru fiecare subtip și
pentru a ști ce anume au clasele derivate în comun. O clasă cu caracteristicile enumerate mai sus
se numește abstractă. Creăm o clasă abstractă atunci când dorim să:

 manipulăm un set de clase printr-o interfaţă comună


 reutilizăm o serie metode si membrii din această clasă in clasele derivate.
Metodele suprascrise în clasele derivate vor fi apelate folosind dynamic binding (late binding).
Acesta este un mecanism prin care compilatorul, în momentul în care nu poate determina
implementarea unei metode în avans, lasă la latitudinea JVM-ului (mașinii virtuale) alegerea
implementării potrivite, în funcţie de tipul real al obiectului. Această legare a implementării de
numele metodei la momentul execuţiei stă la baza polimorfismului. Nu există instanţe ale unei
clase abstracte, aceasta exprimând doar un punct de pornire pentru definirea unor instrumente
reale. De aceea, crearea unui obiect al unei clase abstracte este o eroare, compilatorul Java
semnalând acest fapt.

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 .

Seturi de caractere Perman


Accept-Charset Accept-Charset: utf-8
acceptabile. ent

Lista codificărilor
Perman
Accept-Encoding acceptabile. Consultați Accept-Encoding: gzip, deflate
ent
compresia HTTP .

Lista de limbi umane


acceptate pentru Perman
Accept-Language Accept-Language: en-US
răspuns. ConsultațiNe ent
gocierea conținutului .

Versiune acceptabilă Accept-Datetime: Thu, 31 May 2007 Tempor


Acceptați-Datăoră
în timp. 20:35:00 GMT ar

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]

Autentificări de Authorization: Basic Perman


Autorizare
autentificare QWxhZGRpbjpvcGVuIHNlc2FtZQ== ent
pentru autentificare
Numele
Descriere Exemplu stare
câmpului antet

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.

Tipul media al corpului Content-Type: application/x-www- Perman


Tipul de conținut cererii (utilizat cu
form-urlencoded ent
POST și PUT cereri).

Un cookie HTTP trimis Perman


fursec anterior de server Cookie: $Version=1; Skin=new; ent:
cu Set-Cookie (mai jos). standard
Numele
Descriere Exemplu stare
câmpului antet

Data și ora la care a


provenit mesajul (în
format "HTTP-date" Perman
Data Date: Tue, 15 Nov 1994 08:12:31 GMT
definit de ent
formatele RFC 7231
Date / Time ).

Indică faptul că
anumite
Perman
Aştepta comportamente ale Expect: 100-continue
ent
serverului sunt
solicitate de client.

Dezvăluiți informațiile Forwarded:


originale ale unui client
for=192.0.2.60;proto=http;by=203.0. Perman
transmis care se conectează la
113.43Forwarded: for=192.0.2.43, ent
un server web printr-un
proxy HTTP. [15] for=198.51.100.17

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.

Dacă-Fără-Match Permite ca un 304 nu If-None-Match: Perman


Numele
Descriere Exemplu stare
câmpului antet

modificat să fie "737060cd8c284d8af7ad3082f209582d" ent


returnat dacă
conținutul este
neschimbat, vezi HTTP
ETAG .

Dacă entitatea este


neschimbată, trimiteți
partea (părțile) pe care If-Range: Perman
Dacă-Range
o lipsesc; în caz "737060cd8c284d8af7ad3082f209582d" ent
contrar, trimite-mi
întreaga entitate nouă.

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.

Proxy-Autorizare Autorizări de autorizare


Proxy-Authorization: Basic Perman
pentru conectarea la
Numele
Descriere Exemplu stare
câmpului antet

un proxy. QWxhZGRpbjpvcGVuIHNlc2FtZQ== ent

Solicitați numai o parte


a unei entități. Bytes-
urile sunt numerotate Perman
Gamă Range: bytes=500-999
din 0. ent
Consultați Servirea
Byte .

Aceasta este adresa


paginii web anterioare
de la care a fost urmat
un link către pagina
solicitată. (Cuvântul
"referrer" a fost corect Referer:
Perman
Referer [ sic ] scris în RFC, precum http://en.wikipedia.org/wiki/Main_P ent
și în majoritatea
age
implementărilor, până
la punctul în care a
devenit uzual și este
considerat terminologia
corectă)

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.

Numai trailers este


acceptat în HTTP /
2. [13]

Șir agent User-Agent: Mozilla/5.0 (X11; Linux


Perman
Agent utilizator de utilizator al x86_64; rv:12.0) Gecko/20100101 ent
agentului utilizator.
Firefox/12.0

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.

S-ar putea să vă placă și