Differences

This shows you the differences between two versions of the page.

Link to this comparison view

eim:laboratoare:laborator04 [2017/03/17 18:40]
dragos.niculescu
eim:laboratoare:laborator04 [2021/02/16 16:02] (current)
dragos.niculescu
Line 15: Line 15:
  
 În programarea Android, un principiu de bază este de folosi intenții pentru a propaga acțiuni, chiar și în cadrul aceleiași aplicații, în detrimentul încărcării clasei corespunzătoare. În acest fel, se asigură cuplarea slabă a componentelor,​ oferind flexibilitate în cazul înlocuirii acestora, permițând totodată extinderea funcționalității cu ușurință. În programarea Android, un principiu de bază este de folosi intenții pentru a propaga acțiuni, chiar și în cadrul aceleiași aplicații, în detrimentul încărcării clasei corespunzătoare. În acest fel, se asigură cuplarea slabă a componentelor,​ oferind flexibilitate în cazul înlocuirii acestora, permițând totodată extinderea funcționalității cu ușurință.
 +
 +{{ :​eim:​laboratoare:​laborator04:​intent-filters_2x.png?​direct&​400 }}
  
 ==== Structura unei Intenții ==== ==== Structura unei Intenții ====
Line 90: Line 92:
 <note important>​Pentru ca o activitate să poată fi invocată, aceasta trebuie să specifice la elementul ''​category''​ din ''<​intent-filter>''​ valoarea ''​android.intent.category.DEFAULT''​.</​note>​ <note important>​Pentru ca o activitate să poată fi invocată, aceasta trebuie să specifice la elementul ''​category''​ din ''<​intent-filter>''​ valoarea ''​android.intent.category.DEFAULT''​.</​note>​
  
-Pentru ca o funcționalitatea expusă de o activitate să poată fi invocată (în mod anonim) și din contextul altor componente ale sistemului de operare Android, pentru tipul de acțiune și pentru tipurile de date precizate, în cadrul secțiunii ''<​intent-filter>'' ​trebuie precizat ​atributul ''​android:​label''​ (șir de caractere care conține o descriere a funcționalității implementate),​ indicându-se ca tip de categorie valorile ''​ALTERNATIVE'',​ ''​SELECTED_ALTERNATIVE''​ sau ambele.+Pentru ca o funcționalitatea expusă de o activitate să poată fi invocată (în mod anonim) și din contextul altor componente ale sistemului de operare Android, pentru tipul de acțiune și pentru tipurile de date precizate, în cadrul secțiunii ''<​intent-filter>'' ​se poate specifica ​atributul ''​android:​label''​ (șir de caractere care conține o descriere a funcționalității implementate),​ indicându-se ca tip de categorie valorile ''​ALTERNATIVE'',​ ''​SELECTED_ALTERNATIVE''​ sau ambele.
  
 O activitate este în principiu invocată de o intenție care poate fi identificată prin apelul metodei ''​getIntent()''​. Rezultatul acestei metode poate fi inclusiv ''​null'',​ în cazul în care activitatea nu a fost pornită prin intermediul unei intenții. O activitate este în principiu invocată de o intenție care poate fi identificată prin apelul metodei ''​getIntent()''​. Rezultatul acestei metode poate fi inclusiv ''​null'',​ în cazul în care activitatea nu a fost pornită prin intermediul unei intenții.
Line 237: Line 239:
 </​note>​ </​note>​
  
-=== Intenții construite prin intermediul unui URI ===+=== Intenții construite prin intermediul unui URI (Optional) ​===
  
 +<​spoiler>​
 De asemenea, un obiect de tip ''​Intent''​ poate fi creat și prin intermediul unui URI care identifică în mod unic o anumită activitate: De asemenea, un obiect de tip ''​Intent''​ poate fi creat și prin intermediul unui URI care identifică în mod unic o anumită activitate:
  
Line 265: Line 268:
  
 De remarcat este faptul că în structura URI-ului, partea de după ''​schemă:​%%//​%%protocol/''​ poate conține orice șir de caractere, rolul său fiind strict acela de a respecta forma unui astfel de obiect (estetic), fără a influența în vreo formă funcționalitatea acestuia. ​ De remarcat este faptul că în structura URI-ului, partea de după ''​schemă:​%%//​%%protocol/''​ poate conține orice șir de caractere, rolul său fiind strict acela de a respecta forma unui astfel de obiect (estetic), fără a influența în vreo formă funcționalitatea acestuia. ​
 +</​spoiler>​
 ==== Transmiterea de informații între componente prin intermediul intențiilor ==== ==== Transmiterea de informații între componente prin intermediul intențiilor ====
  
Line 344: Line 347:
 </​code>​ </​code>​
  
-==== Gestiunea evenimentelor cu difuzare prin intermediul intențiilor ==== +==== Gestiunea evenimentelor cu difuzare prin intermediul intențiilor ​(Optional)==== 
 +<​spoiler>​
 Intențiile reprezintă și un mecanism de comunicație inter-proces,​ asigurând transferul unor mesaje structurate. Astfel, intențiile pot fi distribuite către toate componentele de la nivelul sistemului de operare Android, pentru a notifica producerea unui eveniment (legat de starea dispozitivului mobil sau a unor aplicații),​ fiind procesate în cadrul unor obiecte ascultător dedicate tipului de mesaj respectiv. Intențiile reprezintă și un mecanism de comunicație inter-proces,​ asigurând transferul unor mesaje structurate. Astfel, intențiile pot fi distribuite către toate componentele de la nivelul sistemului de operare Android, pentru a notifica producerea unui eveniment (legat de starea dispozitivului mobil sau a unor aplicații),​ fiind procesate în cadrul unor obiecte ascultător dedicate tipului de mesaj respectiv.
  
Line 367: Line 370:
   PackageManager.DONT_KILL_APP);​   PackageManager.DONT_KILL_APP);​
 </​code>​ </​code>​
 +</​spoiler>​
 === Trimiterea unei intenții cu difuzare === === Trimiterea unei intenții cu difuzare ===
 +<​spoiler>​
 Construirea unei intenții care urmează să fie difuzată la nivelul sistemului de operare Android poate fi realizată prin definirea unui obiect de tipul ''​Intent'',​ pentru care se vor specifica acțiunea, datele și categoria, astfel încât obiectele de tip ascultător să îl poată identifica cât mai exact. Ulterior, acesta va fi trimis tuturor proceselor aferente aplicațiilor instalate pe dispozitivul mobil prin intermediul metodei ''​sendBroadcast()'',​ căreia îi este atașat ca parametru. Construirea unei intenții care urmează să fie difuzată la nivelul sistemului de operare Android poate fi realizată prin definirea unui obiect de tipul ''​Intent'',​ pentru care se vor specifica acțiunea, datele și categoria, astfel încât obiectele de tip ascultător să îl poată identifica cât mai exact. Ulterior, acesta va fi trimis tuturor proceselor aferente aplicațiilor instalate pe dispozitivul mobil prin intermediul metodei ''​sendBroadcast()'',​ căreia îi este atașat ca parametru.
  
Line 381: Line 384:
 sendBroadcast(intent);​ sendBroadcast(intent);​
 </​code>​ </​code>​
 +</​spoiler>​
 === Primirea unui intenții cu difuzare === === Primirea unui intenții cu difuzare ===
 +<​spoiler>​
 Pentru a putea primi o intenție cu difuzare, o componentă trebuie să fie înregistrată în acest sens, definind un filtru de intenții pentru a specifica ce tipuri de acțiuni și ce tipuri de date asociate intenției poate procesa. ​ Pentru a putea primi o intenție cu difuzare, o componentă trebuie să fie înregistrată în acest sens, definind un filtru de intenții pentru a specifica ce tipuri de acțiuni și ce tipuri de date asociate intenției poate procesa. ​
  
Line 439: Line 442:
 <note important>​Este necesar ca metoda ''​onReceive()''​ să se termine în maximum 5 secunde, în caz contrar fiind afișată o fereastră de dialog pentru a determina oprirea sa forțată.</​note>​ <note important>​Este necesar ca metoda ''​onReceive()''​ să se termine în maximum 5 secunde, în caz contrar fiind afișată o fereastră de dialog pentru a determina oprirea sa forțată.</​note>​
  
 +
 +</​spoiler>​
 === Tipuri particulare de intenții cu difuzare === === Tipuri particulare de intenții cu difuzare ===
 +<​spoiler>​
  
 Există și tipuri particulare de intenții cu difuzare: Există și tipuri particulare de intenții cu difuzare:
   - intenții cu difuzare **ordonate**,​ utile în situația în care o intenție cu difuzare trebuie să fie procesată secvențial de mai mulți ascultători,​ fiecare dintre aceștia având posibilitatea de a modifica intenția respectivă;​   - intenții cu difuzare **ordonate**,​ utile în situația în care o intenție cu difuzare trebuie să fie procesată secvențial de mai mulți ascultători,​ fiecare dintre aceștia având posibilitatea de a modifica intenția respectivă;​
   - intenții cu difuzare **persistente**,​ care mențin valoarea care a fost transmisă cel mai recent.   - intenții cu difuzare **persistente**,​ care mențin valoarea care a fost transmisă cel mai recent.
 +</​spoiler>​
 == Intenții cu difuzare ordonate == == Intenții cu difuzare ordonate ==
  
 +<​spoiler>​
 Pentru ca o intenție cu difuzare să poate fi procesată de mai mulți ascultători într-o anumită ordine, ar trebui să fie transmisă prin intermediul metodei ''​sendOrderedBroadcast()''​ căreia i se poate atașa (opțional) și o anumită permisiune, pe care clasa ascultător trebuie să o dețină: Pentru ca o intenție cu difuzare să poate fi procesată de mai mulți ascultători într-o anumită ordine, ar trebui să fie transmisă prin intermediul metodei ''​sendOrderedBroadcast()''​ căreia i se poate atașa (opțional) și o anumită permisiune, pe care clasa ascultător trebuie să o dețină:
  
Line 474: Line 481:
 Frecvent, intențiile cu difuzare ordonate sunt folosite atunci când se dorește transmiterea unor rezultate înapoi, către aplicația Android care le-a transmis, după ce toți ascultătorii au realizat procesarea acestora. În acest sens, metoda ''​sendOrderedBroadcast()''​ va primi suplimentar ca parametrii și obiectul de tip ''​BroadcastReceiver''​ care va procesa ultimul intenția cu difuzare, un obiect de tip ''​Handler''​ care va primi rezultatul final (se transmite valoarea ''​null''​ dacă se dorește ca acesta să fie aplicația care a transmis intenția), rezultatul, secțiunile ''​data''​ / ''​extra''​ ale intenției pe care se poate opera. Frecvent, intențiile cu difuzare ordonate sunt folosite atunci când se dorește transmiterea unor rezultate înapoi, către aplicația Android care le-a transmis, după ce toți ascultătorii au realizat procesarea acestora. În acest sens, metoda ''​sendOrderedBroadcast()''​ va primi suplimentar ca parametrii și obiectul de tip ''​BroadcastReceiver''​ care va procesa ultimul intenția cu difuzare, un obiect de tip ''​Handler''​ care va primi rezultatul final (se transmite valoarea ''​null''​ dacă se dorește ca acesta să fie aplicația care a transmis intenția), rezultatul, secțiunile ''​data''​ / ''​extra''​ ale intenției pe care se poate opera.
  
 +</​spoiler>​
 == Intenții cu difuzare persistente == == Intenții cu difuzare persistente ==
 +<​spoiler>​
 Pentru ca o intenție cu difuzare să își mențină cea mai recentă valoare, ar trebui să fie transmisă prin intermediul metodei ''​sendStickyBroadcast()''​. Pentru ca o intenție cu difuzare să își mențină cea mai recentă valoare, ar trebui să fie transmisă prin intermediul metodei ''​sendStickyBroadcast()''​.
  
Line 499: Line 507:
 <​note>​În Android, astfel de intenții sunt utilizate de sistemul de operare pentru a indica starea dispozitivului mobil (nivelul de încărcare al bateriei, conectivitatea la Internet) pentru a îmbunătăți eficiența.</​note>​ <​note>​În Android, astfel de intenții sunt utilizate de sistemul de operare pentru a indica starea dispozitivului mobil (nivelul de încărcare al bateriei, conectivitatea la Internet) pentru a îmbunătăți eficiența.</​note>​
  
 +</​spoiler>​
 === Gestiunea intențiilor cu difuzare native === === Gestiunea intențiilor cu difuzare native ===
 +<​spoiler>​
 Cele mai multe servicii de sistem transmit intenții cu difuzare pentru a semnala faptul că s-au produs anumite modificări la nivelul stării dispozitivului mobil sau al aplicațiilor (primirea unui apel telefonic / mesaj, schimbarea nivelului de încărcare al bateriei, conectivitatea la Internet). Cele mai multe servicii de sistem transmit intenții cu difuzare pentru a semnala faptul că s-au produs anumite modificări la nivelul stării dispozitivului mobil sau al aplicațiilor (primirea unui apel telefonic / mesaj, schimbarea nivelului de încărcare al bateriei, conectivitatea la Internet).
  
Line 529: Line 538:
 boolean isMobile = (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE);​ boolean isMobile = (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE);​
 </​code>​ </​code>​
 +</​spoiler>​
 <​hidden>​ <​hidden>​
 ===== Fragmente (opțional) ===== ===== Fragmente (opțional) =====
-<​hidden>​ 
 Propun să nu mai facem fragente. Pare o complexitate nenecesară: ​ Propun să nu mai facem fragente. Pare o complexitate nenecesară: ​
 {{:​eim:​laboratoare:​laborator04:​complete_android_fragment_lifecycle.png?​direct&​200|}} {{:​eim:​laboratoare:​laborator04:​complete_android_fragment_lifecycle.png?​direct&​200|}}
-</​hidden>​ 
  
 Un fragment este o componentă Android atomică, încapsulând o interfață grafică ce poate fi reutilizată,​ definind un ciclu de viață propriu. O activitate poate fi formată din unul sau mai multe fragmente, în funcție de cerințele aplicației la un moment dat de timp. Un fragment este o componentă Android atomică, încapsulând o interfață grafică ce poate fi reutilizată,​ definind un ciclu de viață propriu. O activitate poate fi formată din unul sau mai multe fragmente, în funcție de cerințele aplicației la un moment dat de timp.
Line 945: Line 952:
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
 +
 +</​spoiler>​
  
 ===== Activitate de Laborator ===== ===== Activitate de Laborator =====
Line 961: Line 970:
  
 **2.** Să se cloneze într-un director de pe discul local conținutul depozitului la distanță astfel creat. În urma acestei operații, directorul Laborator04 va trebui să se conțină fișierele ''​README.md'',​ ''​.gitignore''​ care indică tipurile de fișiere (extensiile) ignorate și ''​LICENSE''​. <​code>​ **2.** Să se cloneze într-un director de pe discul local conținutul depozitului la distanță astfel creat. În urma acestei operații, directorul Laborator04 va trebui să se conțină fișierele ''​README.md'',​ ''​.gitignore''​ care indică tipurile de fișiere (extensiile) ignorate și ''​LICENSE''​. <​code>​
-student@eim2017:~$ git clone https://​www.github.com/​perfectstudent/​Laborator04+student@eim-lab:~$ git clone https://​www.github.com/​perfectstudent/​Laborator04.git
 </​code>​ </​code>​
  
Line 975: Line 984:
 {{ :​eim:​laboratoare:​laborator04:​04androidstudio.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator04:​04androidstudio.png?​nolink&​600 }}
  
-Se indică platforma pentru care se dezvoltă aplicația Android (se bifează doar //Phone and Tablet//), iar SDK-ul Android (minim) pentru care se garantează funcționarea este API 16 (Jelly Bean, 4.1).+Se indică platforma pentru care se dezvoltă aplicația Android (se bifează doar //Phone and Tablet//), iar SDK-ul Android (minim) pentru care se garantează funcționarea este API 24 (Nougat).
  
 {{ :​eim:​laboratoare:​laborator04:​05androidstudio.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator04:​05androidstudio.png?​nolink&​600 }}
Line 1066: Line 1075:
   * se înregistrează o instanță a clasei ascultător ca mecanism de tratare a evenimentelor de tip accesare a butoanelor din cadrul interfeței grafice, prin apelul metodei ''​setOnClickListener()''​.   * se înregistrează o instanță a clasei ascultător ca mecanism de tratare a evenimentelor de tip accesare a butoanelor din cadrul interfeței grafice, prin apelul metodei ''​setOnClickListener()''​.
  
-**5.** Să se modifice aplicația Android [[https://​github.com/​eim2017/​Laborator03.git|Phone Dialer]] astfel încât să conțină un buton suplimentar prin care este invocată aplicația //Contacts Manager// căreia îi transmite numărul de telefon format și așteptând un rezultat cu privire la stocarea contactului în agenda telefonică.+**5.** Să se modifice aplicația Android [[https://​github.com/​eim-lab/​Laborator03.git|Phone Dialer]] astfel încât să conțină un buton suplimentar prin care este invocată aplicația //Contacts Manager// căreia îi transmite numărul de telefon format și așteptând un rezultat cu privire la stocarea contactului în agenda telefonică.
  
 {{ :​eim:​laboratoare:​laborator04:​10phone_dialer_portrait.png?​nolink&​300 }} {{ :​eim:​laboratoare:​laborator04:​10phone_dialer_portrait.png?​nolink&​300 }}
Line 1138: Line 1147:
  
 {{ :​eim:​laboratoare:​laborator04:​13android_studio_run_debug_configurations.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator04:​13android_studio_run_debug_configurations.png?​nolink&​600 }}
 +  * Să se verifice în emulator/​telefon faptul că ContactsManager nu este o aplicație care poate fi lansată din launcher. Dacă aveți utilitarul MyAndroidTools,​ acesta va lista aplicația cu Activitatea definită.  ​
 +  * Să se verifice în emulator/​telefon pachetele instalate ​
 +<code shell>
 +student@eg106:​~$ adb shell 
 +vbox86p:/ # pm list packages -f
 +</​code>​
  
 **7.** ​ Să se încarce modificările realizate în cadrul depozitului '​Laborator04'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​ **7.** ​ Să se încarce modificările realizate în cadrul depozitului '​Laborator04'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​
-student@eim2017:​~/​Laborator04$ git add * +student@eim-lab:​~/​Laborator04$ git add * 
-student@eim2017:​~/​Laborator04$ git commit -m "​implemented taks for laboratory 04" +student@eim-lab:​~/​Laborator04$ git commit -m "​implemented taks for laboratory 04" 
-student@eim2017:​~/​Laborator04$ git push origin master+student@eim-lab:​~/​Laborator04$ git push origin master
 </​code>​ </​code>​
  
 ===== Resurse Utile ===== ===== Resurse Utile =====
  
 +[[https://​developer.android.com/​guide/​components/​intents-filters.html| Intents and Intent Filters(android.com)]]\\ ​
 [[http://​ptgmedia.pearsoncmg.com/​images/​9780321940261/​samplepages/​0321940261.pdf|Joseph ANNUZZI, Jr, Lauren DARCEY, Shane CONDER, Introduction to Android Application Development - Developer'​s Library, 4th Edition, Addison-Wesley,​ 2013]] - capitolul 4, subcapitolele //​Organizing Activity Components with Fragments//,​ //Managing Activity Transition with Intents//, //Working with Services//, //Receiving and Broadcasting Intents//​\\ ​ [[http://​ptgmedia.pearsoncmg.com/​images/​9780321940261/​samplepages/​0321940261.pdf|Joseph ANNUZZI, Jr, Lauren DARCEY, Shane CONDER, Introduction to Android Application Development - Developer'​s Library, 4th Edition, Addison-Wesley,​ 2013]] - capitolul 4, subcapitolele //​Organizing Activity Components with Fragments//,​ //Managing Activity Transition with Intents//, //Working with Services//, //Receiving and Broadcasting Intents//​\\ ​
 [[http://​www.bignerdranch.com/​we-write/​android-programming/​|Bill PHILLIPS, Brian HARDY, Android Programming. The Big Nerd Ranch Guide, Pearson Technology Group, 2013]] - capitolele 5, 7, 10, 21, 23, 29, 30\\  [[http://​www.bignerdranch.com/​we-write/​android-programming/​|Bill PHILLIPS, Brian HARDY, Android Programming. The Big Nerd Ranch Guide, Pearson Technology Group, 2013]] - capitolele 5, 7, 10, 21, 23, 29, 30\\ 
Line 1156: Line 1172:
 [[http://​www.coreservlets.com/​android-tutorial|Android Programming Tutorials - Core Servlets]] - secțiunile Intents - part I, II & III\\  [[http://​www.coreservlets.com/​android-tutorial|Android Programming Tutorials - Core Servlets]] - secțiunile Intents - part I, II & III\\ 
 [[http://​www.vogella.com/​tutorials/​AndroidIntent/​article.html|Android Intents - Tutorial]] [[http://​www.vogella.com/​tutorials/​AndroidIntent/​article.html|Android Intents - Tutorial]]
 +
 +===== Android Fundamentals =====
 +[[https://​docs.google.com/​presentation/​d/​1kjxsI9brdVRIx3rqoB0H-1-PmVlzJbiQNf4PyqzZKJM/​edit#​slide=id.g116e4ee7f0_0_171|Android Intents]]
 +[[https://​docs.google.com/​presentation/​d/​1DSl-LNN7Kp3gQ9ZadBe8clWNGhs_8xdcYQoxZbF5cRk/​edit#​slide=id.g116d7d9d49_3_13|Explicit and Implicit Intents]]
eim/laboratoare/laborator04.1489768817.txt.gz · Last modified: 2017/03/17 18:40 by dragos.niculescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0