Structura si depanare

Mediul de dezvoltare

  • Descarca boundle-ul de la adresa

Acesta contie:

  • Eclipse + ADT plugin
  • Android SDK Tools
  • Android Platform-tools
  • The latest Android platform
  • The latest Android system image for the emulator

Creare unei aplicatii Android

Pentru a crea o aplicatie Android vom deschide Eclipse si vom selecta File->New->Project, dupa care vom selecta Android Application Project.

In urma acestor actiuni, va aparea fereastra urmatoare:

In campurile Application Name si Project Name se va introduce numele aplicatiei, iar in campul Package Name se va introduce numele pachetului care va contine aplicatia noastra. Este de preferat sa se introduca un text de forma WebsiteProducator.NumeAplicatie.

Este de preferat sa se scrie site-ul in ordine inversa. Exemplu:ro.rosedu.android.Proiect1

In campul Build SDK se va selecta versiunea de Android pentru care se creeaza proiectul, iar in campul Minimum Required SDK se va selecta cea mai veche versiune de Android pe care poate rula aplicatia creata.

Structura

Structura unei aplicatii se poate observa din fereastra Package Explorer.

  • In directorul src se gaseste intregul cod sursa.
  • In directorul gen se afla un fisier Java cu ID-uri catre resurse.
  • In bin vom gasi programul compilat.
  • Directorul res contine mai multe directoare drawable. In acestea se salveaza imaginile folosite in aplicatie.
  • In layout gasim fisierul main.xml. Acesta reprezinta interfata grafica, separata de codul programului.
  • Pe langa aceste directoare, se mai observa fisierul AndroidManifest.xml. Aici vom scrie detalii despre aplicatie, cum ar fi permisiunile si versiunea aplicatiei.

Pentru prima aplicatie vom utiliza un buton la a carui apasare va aparea un mesaj.
Pentru a pune buton pe fereastra vom deschide fisierul main.xml. Fisierul este structura pe tag-uri, fiecare element reprezentand un tag. Pentru a adauga butonul, vom scrie urmatoarea bucata de cod:

<Button
     	 android:id="@+id/buton" 
	 android:layout_width="wrap_content"
	 android:layout_height="wrap_content"
	 android:text="Apasa"    />

Pentru a adauga o actiune butonului, deschidem fisierul din directorul src.

Vom crea o noua functie ce va fi apelata la apasarea butonului.

 public void apasa(View v)
    {
    	Toast.makeText(this, "Hello!", Toast.LENGTH_SHORT).show();
    }

Pentru ca functia sa fie apelata la apasarea butonului, va trebui sa facem legatura intre buton si functie. Acest lucru se poate face in doua moduri: din codul programului sau din fisierul main.xml. Alegem cea de-a doua varianta, in care vom adauga urmatoarea linie in tag-ul butonului:

android:onClick="apasa"

Pentru a rula aplicatia, este necesar un simulator. Vom crea unul astfel: in Eclipse vom selecta Window->AVD Manager

Apasam butonul New, introducem numele si versiunea de Android pe care o dorim, dupa care putem rula aplicatia.

Depanare

Depanarea este foarte importanta in procesul de realizare a aplicatiilor pentru dispozitive mobile. Acest proces este insa putin diferit fata de depanarea programelor clasice pentru calculator, in primul rand pentru ca ruleaza pe alt dispozitiv. Tocmai din acest motiv, avem nevoie de programe spcializate pentru a realiza depanarea. De asemenea, fiind vorba de dispozitive mobile, apar si anumite evenimente specifice, cum ar fi apeluri telefonice, descarcarea bateriei etc., evenimente ce trebuie tratate intr-un fel sau altul. In laboratorul de astazi vom prezenta programele de depanare existente si modul lor de functionare. De asemenea, ne vom ocupa putin de studierea evenimentelor ferestrelor.

DDMS

Utilitarul pentru depanarea aplicatiilor pentru Android se numeste DDMS (Dalvik Debug Monitor System). Acesta foloseste de fapt un alt utilitar, numit ADB (Android Debug Bridge), pentru a se conecta la simulatoare sau dispozitive fizice. Cu ajutorul DDMS putem vizualiza parametrii dispozitivului si a programelor ce ruleaza pe acesta. DDMS poate fi accesat sub forma unei perspective in Eclipse.

Activarea se face din meniul:

Window -> Open Perspective -> DDMS

Utilizare

Cele mai importrante functii pe care DDMS le poate indeplini sunt:

  • Afisarea log-urilor dispozitivelor
  • Afisarea informatiilor despre procesele curente
  • Controlul simulatoarelor

Dispozitive

DDMS poate afisa informatii de depanare atat de la simulatoarele pornite cat si de la dispozitivele conectate la calculator. Alegerea dispozitivului curent se face prin selectarea lui din panoul Devices.

Loguri

Logurile sistemului sunt cele mai importante informatii pe care le poate oferi DDMS. Aici sunt descrise toate actiunile indeplinite de catre dispozitiv, exceptiile aparute si informatii necesare depanaraii. Log-urile vor aparea in panoul denumit LogCat (a nu se confunda cu Console! - acestea sunt mesajele afisate de catre Eclipse).
Fiecare mesaj din aceasta lista este insotit de urmatoarele date (fiecare pe cate o coloana):

  • Tipul mesajului
    • I - Information - mesaj informativ
    • D - Debug - mesaj utile la depanare
    • W - Warning - mesaj de avertizare (exceptiile ce nu sunt foarte importante si nu au un impact important asupra componentei apar sub forma de astfel de mesaje)
    • E - Error - mesaj de eroare (exceptiile ce intrerup o componenta apar sub forma de astfel de mesaje)
    • V - Verbose - informatii suplimentare afisate de programe (in general la cerere, se folosesc la depistarea problemelor de functionare rezultate in general din cauza configurarii gresite a programelor)
  • Time - data si ora la care a fost scris mesajul
  • PID - ID-ul procesului ce a generat mesajul
  • Tag - Eticheta sau categoria mesajului (este util pentru filtre)
  • Message - mesajul propriu-zis (text)

Este de remarcat ca fiecare mesaj reprezinta cate o linie de text. Spre exemplu, exceptiile sunt in general afisate pe mai multe linii, acestea continand foarte multa informatie. Astfel, fiecare exceptie este reprezentata de mai multe mesaje de log.

Ceea ce ne intereseaza in continuare este cum putem genera astfel de mesaje de log. SDK-ul ne pune la dispozitie doua metode:

  • functiile statice ale clasei Log
  • System.out.println mesajele catre consola standard (stdout)

Exemplu pentru clasa Log:

Log.println (Log.DEBUG, "exemplu log", "aceasta este un mesaj de log cu eticheta 'exemplu log'");

Exemplu pentru utilizarea System.out.println. De remarcat este ca mesajele de log trimise sub aceasta forma vor avea eticheta „System.out“ si vor fi de tipul Information.

System.out.println ("aceasta este un mesaj catre consola standard");

Un alta functie importanta ce trebuie discutata este posibilitatea de filtrare a mesajelor de log. Deoarece LogCat agrega toate mesajele de log din sistem, urmarirea unor anumite mesaje poate fi dificila. Pentru a usura aceasta sarcina, se pot genera filtre dupa:

  • PID
  • Tag
  • Tip

Un filtru se creaza prin apasarea butonului plus verde din bara panoului Log (respectiv LogCat in Eclipse).

Controlul Simulatorului

Desi destul de exact, simulatorul Android nu poate totusi simula functiile unui telefon real. Pentru a putea totusi testa comportamentul aplicatiilor cat mai bine, DDMS ne pune la dispozitie un panou de control (Emulator Control). Astfel putem sa simulam:

  • starea conexiunii de voce
  • primirea unui apel telefonic
  • primirea unui SMS
  • date primite de la GPS

Evident, acest panou nou are nici un efect asupra dispozitivelor reale.

Threads

In panoul Threads sunt afisate informatiile despre fiecare fir de executie al fiecarui proces. Deoarece aceste informatii sunt culese prin intermediul unei legaturi de retea, overhead-ul este destul de mare. Pentru nu a incetini semnificativ functionarea dispozitivului (care este mereu nevoit sa trimita aceste date), vizualizarea trebuie activata. Astfel, se selecteaza procesul dorit (din panoul Devices) si se apasa butonul Update Threads. Dupa ce s-au cules informatiile dorite, monitorizarea se poate opri prin inca o apasare a butonului.

Evenimentele Activitatilor

Scopul acestui laborator este studierea evenimetelor ferestrelor utilizand programele de depanare descrise mai sus. Am discutat la curs despre evenimentele pe care le primesc ferestrele. Schema urmatoare le ilustreaza mai bine. Apelurile de functie sunt reprezentate in dreptunghiurile gri.

In continuare aveti ilustrat un exemplu de fereastra ce suprascrie toate functiile pentru evenimentele ce controleaza ciclul de viata. De remarcat este faptul ca fiecare dintre aceste functii face un apel catre functia parintelui (functie originala). Acest lucru este obligatoriu.

public class Evenimente extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
    }
 
    @Override
    public void onStart ()
    {
    	super.onStart();
    }
 
    @Override
    public void onRestart ()
    {
    	super.onRestart();
    }
 
    @Override
    public void onResume ()
    {
    	super.onResume();
    }
 
    @Override
    public void onPause ()
    {
    	super.onPause();
    }
 
    @Override
    public void onStop ()
    {
    	super.onStop();
    }
 
    @Override
    public void onDestroy ()
    {
    	super.onDestroy();
    }
 
    // functii folosite pentru salvarea si restaurarea starii    
 
    @Override
    public void onSaveInstanceState (Bundle outState)
    {
        // apelarea functiei din activitatea parinte este recomandata, dar nu obligatorie
    	super.onSaveInstanceState(outState);
    }
 
    @Override
    public void onRestoreInstanceState (Bundle inState)
    {
        // apelarea functiei din activitatea parinte este recomandata, dar nu obligatorie
    	super.onRestoreInstanceState(inState);
    }
}

Puteti observa in exemplul de mai sus ca trei dintre functii primesc ca parametru un obiect de tip Bundle. Acesta este folosit pentru memorarea starii in cazul in care activitatea trebuie inchisa din lipsa de memorie. Astfel, functiile sunt apelate in felul urmator:

  • onCreate - este apelata la crearea ferestrei (atentie: crearea este diferita de afisare). Parametrul savedInstance este fie null, daca fereastra este noua, sau este o instanta a unui obiect de tip Bundle in care a fost salvata starea anterioara (in functia onSaveInstanceState).
  • onRestoreInstanceState - este apelata doar daca in prealabil a fost salvata starea ferestrei in onSaveInstanceState.
  • onSaveInstanceState - este apelata cand fereastra urmeaza sa fie ascunsa si exista posibilitatea ca procesul acesteia sa fie terminat din lipsa de memorie.

Exercitii

  1. Realizati o activitate careia ii suprascrieti urmatoarele functii de eveniment. Afisati cate un mesaj de log cu Tag-ul evenimente din fiecare dintre aceste functii. Textul mesajului de log trebuie sa contina numele evenimentului. De exemplu, in onCreate() puteti afisa un mesaj cu textul s-a apelat onCreate(). Pentru a putea citi mai usor mesajele de log afisate de catre programul vostru, o sa creati un filtru de log dupa tag-ul eveniment.
    • onCreate
    • onRestart
    • onStart
    • onResume
    • onPause
    • onStop
    • onDestroy
  2. Suprascrieti si evenimentele urmatoare. Modificati mesajul de log din functia onCreate astfel incat sa va afiseze daca fereastra este noua sau are o stare ce trebuie reprodusa.
  3. Observati ce se intampla cu evenimentele ferestrelor cand:
    • Primiti un apel telefonic (Hint: utilizati Emulator Control din DDMS)
    • Se apasa butonul Home
    • Se tine mult apasat butonul Home
    • Se apasa butonul de raspundere la convorbire
    • Se apasa butonul de inchidere al ecranului (este butonul de inchidere a convorbrii)

Bonus

  • Pe un device fizic, altul decat tabletele intel, incearca sa vezi ce sa intampla cand intoarci telefonul din orientare portet in landscape. Cum puteti evita intreruperea activitatii?
  • Conecteaza-te si ruleaza aplicatiile pa tabletele cu i5. Pentru asta localizeaza /android-sdk/platform-tools/adb.exe si ruleazadin linia de comanda “…/adb connect 192.168.x.yy , unde „192.168.x.yy“ este ip-ul tabletei.

Unitatea de pe care rulati comanda si tableta trebuie sa fie in aceasi retea. ip-ul tabletei il aflati in setings→wifi→click pe numele retelei la care esti conectat.

programare_android/curs/curs1.txt · Ultima modificare: 2013/08/01 12:19 de către stefan.alexandru
CC Attribution-Noncommercial-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