Documente Academic
Documente Profesional
Documente Cultură
- Noțiunea de Activity
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;
- Activity Lifecycle
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;
- Process Lifecycle
- Structura Intent-lui
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
// У первой активности
ArrayList<File> fileList = new ArrayList<File>();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("FILES_LIST", fileList);
startActivity(intent);
// У второй активности
ArrayList<File> filelist =
(ArrayList<File>)getIntent().getSerializableExtra("FILES_LIST");
Î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, E
DIT, 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).
Când creăm un intent explicit pentru a porni o activitate sau servicu, sistemul imediat
va porni componenta specificată în obiectul Intent.
Figura 1 : Are loc ilustrarea unui intent implicit și anume parcurgerea lui prin sistem
pentru a porni o altă activitate: [1] activitatea A crează un Intent cu acțiunea și o
trasmite la startActivity(). [2] sistemul android caută toate aplicațiile care corespund
intentului, atunci când aplicația necesară a fost găsită [3] sistemul startează activitate
potrivită (Activity B) invocând metoda onCreate() și transmite intent în ea.
Intent Resolution
Când sistemul recepționează intentul implicit pentru pornirea activității, el caută cea
mai bună activitate pentru inent, comparând intentul cu 3 aspecte de bază utilizând
Intent filtrul:
Acțiunea intentului
Datele intentului (ambele URI (Uniform Resource Identifier(Indentificatorul
universal al resurselor)) și tipuri de date)
Categoria intentului
Secțiunele următoare vor descrie cum intenturile se potrivesc la cea mai apropiată
compoonentă cum filtrul intentului este declarat în fișierul Manifest al aplicației.
Exemplele ce urmează, vor găsi intentul potrivit utilizând intent filtrele:
Action test
<intent-filter>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.VIEW" />
...
</intent-filter>
Category test
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
Data test
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
<data android:mimeType="audio/mpeg" android:scheme="http" ... />
...
</intent-filter>
Exemplu de intent pentru a obține datele imaginii dintr-un content provider și să
le afișeze:
<intent-filter>
<data android:mimeType="image/*" />
...
</intent-filter>
- Android Manifest
Structura manifestului:
Fișierul manifestului încapsulează toată arhitectura aplicației Android,
funcționalitățile și configurația acesteia. Elementele rădăcină ale manifestului
reprezintă <manifest>. Alte tag-uri importante și obligatorii sunt <application> și
<uses-sdk>. Elementul <application> reprezintă elementul de bază al manifestului
care conţine multe elemente descendente, care defines structura și lucrul aplicației.
Ordinea localizării elementelor, care se află la același nivel este arbitrar. Toate
valorile se stabilesc prin atributele elementelor.
Atribute:
- xmlns:android- definește namespace pentru Android, și niciodată nu se
schimbă;
- package- defineste numele unic al pachetului aplicatiei, care este definita
la etapa de creare a aplicatiei;
- android:versionCode- indica la numarul intern al versiunii, utilizind pentru
compararea versiunii aplicației;
- android:versionName- indica numarul versiunii de utilizare.
Exemplu concret de fișier AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mark.paiip2" >
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORA
GE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TwoActivity"
/>
</application>
</manifest>
-Noțiunea de Context
Astfel, un serviciu nu trece prin evenimentele ce fac parte din ciclul de viață al unei
activități. Totuși, un serviciu poate fi controlat (pornit, oprit) din contextul altor
componente ale unei aplicații Android (activități, ascultători de intenții cu difuzare, alte
servicii).
Serviciul este rulat pe firul de execuție principal al aplicației Android. De aceea, în
situația în care operațiile pe care le realizează poate influența experiența utilizatorului,
acestea trebuie transferate pe alte fire de execuție din fundal (folosind
clasele HandlerThread sau AsyncTask).
Un serviciu continuă să se ruleze chiar și în situația în care componenta aplicației
Android care l-a invocat prin intermediul unei intenții devine inactivă (nu mai este
vizibilă) sau chiar este distrusă. Acest comportament este adecvat în situația în care
serviciul realizează operații de intrare/ieșire intensive, interacționează cu diverse
servicii accesibile prin intermediul rețelei sau cu furnizori de conținut.
android:permission="ro.pub.cs.systems.eim.lab05.SOME_SERVICE_PERMISSION"
/>
</application>
</manifest>
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ă:
Metode abstracte
Pentru a exprima faptul că o metodă este abstractă (adică se declară doar interfaţa ei,
nu și implementarea), Java folosește cuvântul cheie abstract:
O clasă care conţine metode abstracte este numită clasă abstractă. Dacă o clasă are
una sau mai multe metode abstracte atunci ea trebuie să conţină în definiţie
cuvântul abstract.
Exemplu:
...
Deoarece o clasă abstractă este incompletă (există metode care nu sunt definite),
crearea unui obiect de tipul clasei este împiedicată de compilator.
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.
Broadcast receiver
o componenta care raspunde la anunturi difuzate (propagate) la nivel de sistem;
oarecum similar cu conceptul de handler global (sau evenimente de sistem);
implementata de o subclasa a clasei BroadcastReceiver.
Service (Serviciu)
un task care se executa in fundal, fara interactiunea directa cu utilizatorul;
gestionata de o instanta a clasei Service;
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ă.
Thread
De multe ori, aplicatiile au nevoie de mult timp pentru a rezolva o sarcina
(descarcarea unui fisier, printare, generarea unui raport etc), timp in care programul
nu poate raspunde unei alte actiuni a utilizatorului. Pentru a face ca o aplicatie sa
indeplineasca o sarcina si sa poata primi si altele in acelasi timp, sunt folosite firele de
executie multiple (multiple threads).
Intr-un program liniar se executa o singura linie de cod, se asteapta pentru completare
si apoi se continua cu urmatoarea linie de cod. Programul nu poate raspunde actiunii
unui utilizator in acest timp si chiar in cazul mai multor procesoare, va fi folosit doar
unul singur, limitand performanta, datorita programarii single-thread.
Un fir de executie (thread) este un program secvential, care poate fi executat
concurent cu alte fire. Un thread este o unitate de executie intr-un proces. Un proces
poate avea mai multe fire de executie, el numindu-se multithread. Daca un calculator
are mai multe procesoare sau un procesor cu mai multe nuclee, el poate executa mai
multe fire de executie simultan.
Diferenta dintre un proces si un thread este ca procesele sunt izolate total unul de
celalalt, in timp ce thread-urile impart aceeasi memorie (heap) cu alte thread-uri care
ruleaza in aceeasi aplicatie (un thread poate prelua informatii noi, in timp ce un alt
thread le prelucreaza pe cele existente).
Un fir de executie, thread, poate avea mai multe stari.
Task
Task reprezinta o operatie asincrona.
Task <T result> reprezinta o operatie asincrona ce returneaza o valoare, TResult.
Clasa Task <T result> este derivata din Task.
Instantele clasei Task pot fi create:
Folosind proprietatea Factory ce returneaza o instanta pentru TaskFactory si
in continuare metoda SartNew.
Foloseseste apelul metodei Start.
- Protocolul HTTP
Hypertext Transfer Protocol (HTTP) este metoda cea mai des utilizată pentru
accesarea informațiilor în Internet care sunt păstrate pe servere World Wide Web.
Deseori utilizatorul dorește să transmită informații speciale la website. Aici HTTP
pune la dispozitie două posibilități:
3xx - redirectări:
4xx - erori ale utilizatorilor: această clasă de mesaje/statusuri este folosită în
cazurile în care utilizatorul ar putea greși formularea cererii. Excepția fiind
răspunsurule pentru cererile tip „Direcționat/condus”, atunci serverul ar trebui să
conțină o intrare cu o explicație a situației erorii și dacă e o eroare temporară sau
pemanentă. Aceste răspunsuri sunt aplicabile pentru orice fel de cerere. Browser-ele
ar trebui să arate orice intrare cerută de utilizator.
400 - cerere greșită:
Cererea nu a putut fi înțeleasă/percepută de către server din cauza unei sintaxe
greșite/incomplete. Utilizatorul ar trebui să nu repete cererea fără ca aceasta să
suporte modificări.
401 - neautorizat
- Metodele și cîmpurile prot. HTTP
JSON este un acronim în limba engleză pentru JavaScript Object Notation, și este un
format de reprezentare și interschimb de date între aplicații informatice. Utilizat
pentru reprezentarea obiectelor și a altor structuri de date și este folosit în special
pentru a transmite date structurate prin rețea, procesul purtând numele de serializare.
In c# , seriaizarea are loc prin Json.NET - un popular JSon framework pentru .NET
Cea mai rapidă metodă de conversie dintre text și JSON obiect .NET utilizarea
metodei JsonSerializer.JsonSerializer convertește .NET obiecte în echivalentul lor
JSON si maparea obiect .NET, numele de proprietate la numele de proprietate JSON
și copii valorile pentru tine.
Deseralizarea reprezinta convertarea fisierului json In Obiecte.
Product product = new Product();
product.Name = "Apple";
product.ExpiryDate = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string output = JsonConvert.SerializeObject(product);
Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output);
class Program
{
static void Main()
{
Regex regex = new Regex(@"\d+");
Match match = regex.Match("Dot 55 Perls");
if (match.Success)
{
Console.WriteLine(match.Value);
}
}
}
Output
55
- HTML Parsing/xPath
XPath (XML Path Language) este un limbaj de expresii utilizat pentru a selecta
porţiuni dintr-un document XML sau pentru a calcula valori (şiruri de caractere,
numere, sau valori buleene) pe baza conţinutului unui document XML.Limbajul
XPath este structurat sub formă de arbore a documentului XML, oferind posibilitatea
de a naviga în acest arbore, prin selecţia nodurilor XML care satisfac diferite criterii.
Cea mai întâlnită metodă a expresiilor XPath este path expression. Un path expression
este scrisă ca o secvenţă de paşi pentru a ajunge dintr-un nod XML ('context node'-ul
curent) la un alt nod sau un alt set de noduri. Paşii sunt separaţi de caracterul "/" (ex.
path). Fiecare pas are trei componente:
• Specificatorul de axe
• Node Test
• Predicat