Differences

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

Link to this comparison view

eim:laboratoare:laborator02 [2019/02/27 23:33]
dragos.niculescu
eim:laboratoare:laborator02 [2022/03/14 09:32] (current)
dan_valentin.bina [Ciclul de Viață al unei Activități]
Line 152: Line 152:
 <note tip>​Distincția între cele două situații în care o activitate este distrusă poate fi realizată prin intermediul metodei ''​isFinishing()''​.</​note>​ <note tip>​Distincția între cele două situații în care o activitate este distrusă poate fi realizată prin intermediul metodei ''​isFinishing()''​.</​note>​
  
-{{ :​eim:​laboratoare:​laborator02:​ciclul_de_viata_al_unei_activitati_2.png?​nolink&​700 }}+{{ :​eim:​laboratoare:​laborator02:​ciclul_de_viata_al_unei_activitati_2_nou.png?​nolink&​700 }} 
  
 <note important>​Fiecare dintre metodele ce gestionează ciclul de viață al activității trebuie să apeleze metoda părintelui. În cazul metodei ''​onCreate()'',​ este necesar ca acest lucru să fie realizat la începutul metodei.</​note>​ <note important>​Fiecare dintre metodele ce gestionează ciclul de viață al activității trebuie să apeleze metoda părintelui. În cazul metodei ''​onCreate()'',​ este necesar ca acest lucru să fie realizat la începutul metodei.</​note>​
Line 272: Line 273:
   super.onSaveInstanceState(savedInstanceState);​   super.onSaveInstanceState(savedInstanceState);​
   EditText usernameEditText = (EditText)findViewById(R.id.username_edit_text);​   EditText usernameEditText = (EditText)findViewById(R.id.username_edit_text);​
-  savedInstanceState.putString(Constants.USERNAME_EDIT_TEXT,​ usernameEditText.getText());​+  savedInstanceState.putString(Constants.USERNAME_EDIT_TEXT,​ usernameEditText.getText().toString());
 } }
 </​code>​ </​code>​
Line 325: Line 326:
  
 ==== Coordonarea Activităților ==== ==== Coordonarea Activităților ====
 +<​spoiler>​
 În situația în care o activitate nouă este pornită în timp ce o activitate veche este în execuție, fiind necesară transmiterea de informații dintre acestea, este util să se cunoască ordinea în care sunt apelate metodele care gestionează ciclul de viață al celor două activități,​ astfel încât comunicarea dintre acestea să se realizeze în mod corect: În situația în care o activitate nouă este pornită în timp ce o activitate veche este în execuție, fiind necesară transmiterea de informații dintre acestea, este util să se cunoască ordinea în care sunt apelate metodele care gestionează ciclul de viață al celor două activități,​ astfel încât comunicarea dintre acestea să se realizeze în mod corect:
   - se apelează metoda ''​onPause()''​ a activității vechi - aici trebuie realizată partea de scriere a informațiilor care trebuie să fie trimise;   - se apelează metoda ''​onPause()''​ a activității vechi - aici trebuie realizată partea de scriere a informațiilor care trebuie să fie trimise;
Line 333: Line 334:
  
 {{ :​eim:​laboratoare:​laborator02:​coordonare_activitati.png?​nolink&​400 }} {{ :​eim:​laboratoare:​laborator02:​coordonare_activitati.png?​nolink&​400 }}
 +</​spoiler>​
 ===== Structura unui Proiect Android ===== ===== Structura unui Proiect Android =====
  
-==== Eclipse ====+<​hidden>​ 
 +==== Eclipse ​- nu mai folosim eclipse ​====
  
 Structura unui proiect Android în mediul integrat de dezvoltare Eclipse poate fi observată în fereastra //Package Explorer//. Structura unui proiect Android în mediul integrat de dezvoltare Eclipse poate fi observată în fereastra //Package Explorer//.
Line 592: Line 594:
  
 La compilare, este posibil ca unele clase să nu poată fi rezolvate. Se folosește ''​Ctrl+Shift+O''​ pentru a adăuga automat importurile necesare. La compilare, este posibil ca unele clase să nu poată fi rezolvate. Se folosește ''​Ctrl+Shift+O''​ pentru a adăuga automat importurile necesare.
 +</​hidden>​
 ==== Android Studio ==== ==== Android Studio ====
 +<​spoiler>​
 În Android Studio, există mai multe perspective sub care poate fi vizualizată structura unui proiect: În Android Studio, există mai multe perspective sub care poate fi vizualizată structura unui proiect:
   * Project (reprezintă structura de pe discul fizic)   * Project (reprezintă structura de pe discul fizic)
Line 643: Line 645:
     * local.properties     * local.properties
     * settings.gradle     * settings.gradle
 +</​spoiler>​
  
-=== Gradle ===+==== Gradle ​====
  
 Android Studio folosește un mecanism automat pentru construirea aplicației Android, denumit **Gradle**, responsabil cu aducerea bibliotecilor referite de pe un depozit la distanță, cu definirea proprietăților aplicației Android, cu compilarea și împachetarea tuturor resurselor folosite, pentru rularea și instalarea aplicației astfel rezultate. Android Studio folosește un mecanism automat pentru construirea aplicației Android, denumit **Gradle**, responsabil cu aducerea bibliotecilor referite de pe un depozit la distanță, cu definirea proprietăților aplicației Android, cu compilarea și împachetarea tuturor resurselor folosite, pentru rularea și instalarea aplicației astfel rezultate.
Line 693: Line 696:
 } }
 </​file>​ </​file>​
- 
 ===== Rularea și Depanarea unei aplicații Android ===== ===== Rularea și Depanarea unei aplicații Android =====
  
Line 710: Line 712:
 Depanarea unei aplicații Android poate fi realizată în mod clasic, ca în cazul oricărui proiect (prin stabilirea unor puncte în care execuția codului sursă este întreruptă și rularea pas cu pas) sau prin intermediul unor utilitare specifice. Depanarea unei aplicații Android poate fi realizată în mod clasic, ca în cazul oricărui proiect (prin stabilirea unor puncte în care execuția codului sursă este întreruptă și rularea pas cu pas) sau prin intermediul unor utilitare specifice.
  
 +<​hidden>​
 În cadrul mediului integrat de dezvoltare Eclipse, depanarea unei aplicații este facilitată prin împărțirea ecranului în mai multe perspective între care programatorul are posibilitatea de a comuta: În cadrul mediului integrat de dezvoltare Eclipse, depanarea unei aplicații este facilitată prin împărțirea ecranului în mai multe perspective între care programatorul are posibilitatea de a comuta:
   * Java - pentru realizarea de modificări la nivelul codului sursă   * Java - pentru realizarea de modificări la nivelul codului sursă
Line 717: Line 720:
  
 {{ :​eim:​laboratoare:​laborator02:​eclipse_perspectives_for_android.png?​nolink }} {{ :​eim:​laboratoare:​laborator02:​eclipse_perspectives_for_android.png?​nolink }}
 +</​hidden>​
 === Android Debug Bridge (ADB) === === Android Debug Bridge (ADB) ===
  
Line 775: Line 778:
  
 Există două mecanisme prin care utilizatorii pot genera astfel de mesaje: Există două mecanisme prin care utilizatorii pot genera astfel de mesaje:
-  * metodele statice ale clasei [[http://​developer.android.com/​reference/​android/​util/​Log.html|Log]],​ care primesc ca parametru prioritatea mesajului, eticheta și mesajul propriu zis<code java>​Log.println ​(Log.DEBUG, "log sample",​ "this is a log message using 'log sample'​ tag"​);</​code>​Pentru a se evita specificarea priorității mesajului de fiecare dată, se pot utiliza metode specifice, care primesc ca parametrii doar denumirea etichetei și mesajul ce se dorește a fi jurnalizat:+  * metodele statice ale clasei [[http://​developer.android.com/​reference/​android/​util/​Log.html|Log]],​ care primesc ca parametru prioritatea mesajului, eticheta și mesajul propriu zis<code java>​Log.[wdiea] ​(Log.DEBUG, "log sample",​ "this is a log message using 'log sample'​ tag"​);</​code>​Pentru a se evita specificarea priorității mesajului de fiecare dată, se pot utiliza metode specifice, care primesc ca parametrii doar denumirea etichetei și mesajul ce se dorește a fi jurnalizat:
  
 <​HTML>​ <​HTML>​
Line 801: Line 804:
   * nivelului minim al tipului de mesaj (''​verbose''​ → ''​assert''​)   * nivelului minim al tipului de mesaj (''​verbose''​ → ''​assert''​)
  
-Un filtru se creează prin apăsarea butonului plus de culoare verde din bara panoului Log (respectiv LogCat în Eclipse).+Un filtru se creează prin apăsarea butonului plus de culoare verde din bara panoului Log (respectiv LogCat în Eclipse). ​In Android Studio, LogCat se poate accesa din partea stânga jos a IDE-ului. 
 + 
 +{{ :​eim:​laboratoare:​logcat_2.png?​900&​nolink }}
  
 {{ :​eim:​laboratoare:​laborator02:​logcat_message_filter_settings.png?​nolink }} {{ :​eim:​laboratoare:​laborator02:​logcat_message_filter_settings.png?​nolink }}
Line 809: Line 814:
 {{ :​eim:​laboratoare:​laborator02:​logcat_configuration.png?​nolink&​700 }} {{ :​eim:​laboratoare:​laborator02:​logcat_configuration.png?​nolink&​700 }}
  
-=== Android Device Monitor ===+<​hidden>​ 
 +=== Android Device Monitor ​- deprecated!!! ​===
  
 Utilitarul pentru depanarea aplicațiilor pentru Android se numește **Android Device Monitor** (anterior purta denumirea DDMS - Dalvik Debug Monitor System). Acesta folosește **ADB (Android Debug Bridge)**, pentru a se conecta dispozitive fizice sau la emulatoare. Prin intermediul ADM se pot vizualiza parametrii dispozitivului si a aplicațiilor ce ruleaza pe acesta. În Android Studio, Android Device Monitor este accesibil din //Tools// → //Android// → //Android Device Monitor//. În Eclipse, poate fi accesat sub forma unei perspective,​ care va fi deschisă prin //Window// → //Open Perspective//​ → //​DDMS//​. ​ Utilitarul pentru depanarea aplicațiilor pentru Android se numește **Android Device Monitor** (anterior purta denumirea DDMS - Dalvik Debug Monitor System). Acesta folosește **ADB (Android Debug Bridge)**, pentru a se conecta dispozitive fizice sau la emulatoare. Prin intermediul ADM se pot vizualiza parametrii dispozitivului si a aplicațiilor ce ruleaza pe acesta. În Android Studio, Android Device Monitor este accesibil din //Tools// → //Android// → //Android Device Monitor//. În Eclipse, poate fi accesat sub forma unei perspective,​ care va fi deschisă prin //Window// → //Open Perspective//​ → //​DDMS//​. ​
Line 827: Line 833:
  
 **Procese și Fire de Execuție** **Procese și Fire de Execuție**
- 
 În panoul **//​Threads//​** sunt afișate informațiile despre fiecare fir de execuție corespunzător unui proces. Întrucât aceste informații sunt preluate prin intermediul unei legături de rețea, astfel încât traficul generat este destul de mare, pentru nu a se încetini semnificativ funcționarea dispozitivului mobil (care este nevoit sa transmită aceste date permanent), vizualizarea trebuie activată manual. Astfel, se selectează dispozitivul mobil dorit și procesul respectiv (din panoul //​Devices//​) și se apasă butonul //​Refresh//​. În panoul **//​Threads//​** sunt afișate informațiile despre fiecare fir de execuție corespunzător unui proces. Întrucât aceste informații sunt preluate prin intermediul unei legături de rețea, astfel încât traficul generat este destul de mare, pentru nu a se încetini semnificativ funcționarea dispozitivului mobil (care este nevoit sa transmită aceste date permanent), vizualizarea trebuie activată manual. Astfel, se selectează dispozitivul mobil dorit și procesul respectiv (din panoul //​Devices//​) și se apasă butonul //​Refresh//​.
  
 {{ :​eim:​laboratoare:​laborator02:​ddms_threads.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_threads.png?​nolink&​600 }}
- 
 **Utilizarea Memoriei** **Utilizarea Memoriei**
- 
 DDMS oferă posibilitatea de a monitoriza utilizarea memoriei în cadrul panourilor **//​Heap//​** și **//​Allocation Tracker//​**,​ oferind informații cu privire la gradul de ocupare a memoriei, defalcată pe tipuri de obiecte (obiecte, clase, tablouri conținând elemente stocate pe 1, 2, 4, 8 octeți, date non-Java). ​ DDMS oferă posibilitatea de a monitoriza utilizarea memoriei în cadrul panourilor **//​Heap//​** și **//​Allocation Tracker//​**,​ oferind informații cu privire la gradul de ocupare a memoriei, defalcată pe tipuri de obiecte (obiecte, clase, tablouri conținând elemente stocate pe 1, 2, 4, 8 octeți, date non-Java). ​
  
 {{ :​eim:​laboratoare:​laborator02:​ddms_heap.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_heap.png?​nolink&​600 }}
- 
 **Sistemul de Fișiere** **Sistemul de Fișiere**
- 
 Consultarea sistemului de fișiere al dispozitivului mobil poate fi realizat prin intermediul panoului **//File Explorer//​**,​ putând fi vizualizate datele aplicației,​ stocate în ''​data/​data/<​package-name>'',​ unde ''<​package-name>''​ este denumirea pachetului corespunzător aplicației investigate. Consultarea sistemului de fișiere al dispozitivului mobil poate fi realizat prin intermediul panoului **//File Explorer//​**,​ putând fi vizualizate datele aplicației,​ stocate în ''​data/​data/<​package-name>'',​ unde ''<​package-name>''​ este denumirea pachetului corespunzător aplicației investigate.
- 
 {{ :​eim:​laboratoare:​laborator02:​ddms_file_explorer.png?​nolink&​600 }} {{ :​eim:​laboratoare:​laborator02:​ddms_file_explorer.png?​nolink&​600 }}
 +</​hidden>​
 **Simularea unor evenimente de tip întrerupere pentru emulator** **Simularea unor evenimente de tip întrerupere pentru emulator**
- +<​spoiler>​ 
-Întrucât emulatorul de Android nu poate simula toate funcțiile unui telefon real, pentru a se putea testa comportamentul aplicațiilor în cazul apariției unor evenimente de tip întrerupere,​ DDMS pune la dispoziție un panou **//​Emulator Control//​**,​ prin care pot fi controlate:+Întrucât emulatorul de Android nu poate simula toate funcțiile unui telefon real, pentru a se putea testa comportamentul aplicațiilor în cazul apariției unor evenimente de tip întrerupere,​ DDMS(deprecated) ​pune la dispoziție un panou **//​Emulator Control//​**,​ prin care pot fi controlate:
   * starea conexiunii de voce / date   * starea conexiunii de voce / date
   * primirea unui apel telefonic / SMS (apel, pierdere apel)   * primirea unui apel telefonic / SMS (apel, pierdere apel)
Line 860: Line 860:
   * cameră foto   * cameră foto
   * accelerometru   * accelerometru
 +</​spoiler>​
 === Layout Inspector === === Layout Inspector ===
 +<​spoiler>​
 Un alt program foarte util pentru depanare este **Layout Inspector** (anterior, purta denumirea Hierarchy View). Acesta permite vizualizarea arborescentă a structurii ferestrelor. De asemenea, afișează parametrii fiecărui ''​View'',​ inclusiv timpul de încărcare. O altă funcționalitate pusă la dispoziția programatorilor este posibilitatea capturării unei imagini a View-ului. ​ Un alt program foarte util pentru depanare este **Layout Inspector** (anterior, purta denumirea Hierarchy View). Acesta permite vizualizarea arborescentă a structurii ferestrelor. De asemenea, afișează parametrii fiecărui ''​View'',​ inclusiv timpul de încărcare. O altă funcționalitate pusă la dispoziția programatorilor este posibilitatea capturării unei imagini a View-ului. ​
  
Line 886: Line 886:
  
 {{ :​eim:​laboratoare:​laborator02:​hierarchy_view_layout_view.png?​nolink }} {{ :​eim:​laboratoare:​laborator02:​hierarchy_view_layout_view.png?​nolink }}
 +</​spoiler>​
  
 ===== Activitate de Laborator ===== ===== Activitate de Laborator =====
Line 925: Line 926:
     - se apasă butonul //Back//     - se apasă butonul //Back//
     - se apasă butonul //OK// din cadrul aplicației (indiferent dacă datele de autentificare sunt corecte sau nu)     - se apasă butonul //OK// din cadrul aplicației (indiferent dacă datele de autentificare sunt corecte sau nu)
-    - se ține apăsat butonul //Home// o perioadă de timp mai mare+    - se apasă butonul //lista app// 
     - se primește un apel telefonic\\ a) pentru AVD, se poate folosi //ADM// → //Emulator Control//\\ b) pentru Genymotion se poate simula doar formarea unui număr de telefon <​code>​     - se primește un apel telefonic\\ a) pentru AVD, se poate folosi //ADM// → //Emulator Control//\\ b) pentru Genymotion se poate simula doar formarea unui număr de telefon <​code>​
 student@eim-lab:/​opt/​android-sdk-linux/​platform-tools$ adb devices student@eim-lab:/​opt/​android-sdk-linux/​platform-tools$ adb devices
Line 944: Line 945:
 | 2) buton //Back// |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | 2) buton //Back// |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | 3) buton //OK// din aplicație |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | 3) buton //OK// din aplicație |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
-| 4) buton //Home// perioadă de timp mai mare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |+| 4) buton //lista app//  |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | 5) apel telefonic |   ​||||||| | 5) apel telefonic |   ​|||||||
 | a) acceptare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | a) acceptare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 | 6) rotire ecran |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  | | 6) rotire ecran |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +
 +<​hidden>​
 +2019, genymotion, Nexus 5X API 24, butoane "​hardware"​
 +
 +^  ^  ''​onCreate()'' ​ ^  ''​onRestart()'' ​ ^  ''​onStart()'' ​ ^  ''​onResume()'' ​ ^  ''​onPause()'' ​ ^  ''​onStop()'' ​ ^  ''​onDestroy()'' ​ ^ ''​onSaveInst()'' ​ ^ ''​onRestoreInst()'' ​ ^
 +| 1) buton //Home// |   ​| ​  ​| ​   |    |  1  |  3  |   ​| ​ 2  |   |
 +| 2) buton //Back// |   ​| ​  ​| ​   |    |  1  |  2  |  3  |     ​| ​  |
 +| 3) buton //OK// din aplicație |  nici | una   | dintre ​  | metode ​ | nu   | se  | apelează ​ |
 +| 4) buton //lista app//  |   ​| ​  ​| ​  ​| ​  ​| ​ 1  |  3  |   ​| ​ 2  | |  ​
 +| 5) apel telefonic |   | | | |  1  |  3  | |  2  | |  ​
 +| a) acceptare |   ​| ​ 1  |  2  |   ​| ​   |    |   ​| ​ |  | 
 +| b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +| 6) rotire ecran |  5  |   ​| ​ 6  |   ​| ​ 1  |  3  |  4  |  2  |  7  |
 +
 +Galaxy S7, butoane hw 
 +^  ^  ''​onCreate()'' ​ ^  ''​onRestart()'' ​ ^  ''​onStart()'' ​ ^  ''​onResume()'' ​ ^  ''​onPause()'' ​ ^  ''​onStop()'' ​ ^  ''​onDestroy()'' ​ ^ ''​onSaveInst()'' ​ ^ ''​onRestoreInst()'' ​ ^
 +| 1) buton //Home// |   ​| ​  ​| ​   |    |  1  |  3  |   ​| ​ 2  |   |
 +| 2) buton //Back// |   ​| ​  ​| ​   |    |  1  |  2  |  3  |     ​| ​  |
 +| 3) buton //OK// din aplicație |  nici | una   | dintre ​  | metode ​ | nu   | se  | apelează ​ |
 +| 4) buton //lista app//  |   ​| ​  ​| ​  ​| ​  ​| ​ 1  |  3  |   ​| ​ 2  | |  ​
 +| 5) apel telefonic |   ​|||||||
 +| a) acceptare |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +| b) respingere |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +| 6) rotire ecran |   ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  ​| ​  |
 +
 +
 +
 +</​hidden>​
 +
  
 **9.** Să se dezactiveze opțiunea de salvare a stării. ​ **9.** Să se dezactiveze opțiunea de salvare a stării. ​
Line 954: Line 984:
 <note tip>În fișierul ''​activity_lifecycle_monitor.xml'',​ pentru fiecare dintre elementele grafice pentru care se dorește să se dezactiveze opțiunea de salvare a stării, se va completa proprietatea ''​android:​saveEnabled="​false"''​.</​note>​ <note tip>În fișierul ''​activity_lifecycle_monitor.xml'',​ pentru fiecare dintre elementele grafice pentru care se dorește să se dezactiveze opțiunea de salvare a stării, se va completa proprietatea ''​android:​saveEnabled="​false"''​.</​note>​
  
-Să se observe care este comportamentul în privința informațiilor reținute în elementele grafice de tip ''​EditText'',​ respectiv ''​CheckBox'',​ în condițiile în care activitatea este distrusă (se apasă butonul //Home//, astfel încât să se apeleze metodele ''​onPause()''​ și ''​onStop()'',​ apoi, în DDMS, în panoul //​Devices//, ​se identifică procesul corespunzător ​aplicației și se oprește folosind butonul //Stop Process//). Să se repornească aplicația din meniul dispozitivului mobil. ​+Să se observe care este comportamentul în privința informațiilor reținute în elementele grafice de tip ''​EditText'',​ respectiv ''​CheckBox'',​ în condițiile în care activitatea este distrusă (se apasă butonul //Home//, astfel încât să se apeleze metodele ''​onPause()''​ și ''​onStop()'',​ apoi se închide ​aplicația. Să se repornească aplicația din meniul dispozitivului mobil. ​
  
 **10.** Să se implementeze metoda ''​onSaveInstanceState()'',​ astfel încât, **în condițiile în care este bifat elementul grafic de tip ''​CheckBox''​**,​ să se salveze informațiile din interfața cu utilizatorul. **10.** Să se implementeze metoda ''​onSaveInstanceState()'',​ astfel încât, **în condițiile în care este bifat elementul grafic de tip ''​CheckBox''​**,​ să se salveze informațiile din interfața cu utilizatorul.
eim/laboratoare/laborator02.1551303224.txt.gz · Last modified: 2019/02/27 23:33 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