This shows you the differences between two versions of the page.
pdm:laboratoare:05 [2016/03/21 00:11] alexandru.radovici |
pdm:laboratoare:05 [2016/03/22 12:22] (current) alexandru.radovici [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laborator 05 - Intenții ====== | + | ====== Laborator 5 - Intenții ====== |
===== Intenții ===== | ===== Intenții ===== | ||
Line 401: | Line 401: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
- | [**0**]. Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/andreirosucojocaru/DAndroid2015_Laborator05.git|]]. În urma acestei operații, directorul ''Laborator05'' va trebui să conțină subdirectorul ''labtasks'' (cu proiectele Android Studio ''MessageMe'' si ''DateAndTime''), fișierele ''README.md'' și ''LICENSE''. <code> | + | - Realizati o aplicatie Android care permite utiliztaorului sa introduca un numar de telefon si sa il apeleze. Folositi ACTION_DIAL si ACTION_CALL. Incercati si pe simulator si pe telefon. Pe simulator va trebui sa cereti permisiunea PHONE_CALL (requestPermission). |
- | student@dandroid2015:~$ git clone https://www.github.com/andreirosucojocaru/DAndroid2015_Laborator05.git | + | - Adaugati in aplicatia posibilitate de a trimite un SMS acelui numar. Folositi ACTION_VIEW si SmsManager. Incercati si pe simulator si pe telefon. |
- | </code> | + | - Adaugati aplicatiei anterioare posibilitatea de a pune o semnatura pentru utiliztaor. Adaugati un buton care deschide o alta activitate unde utilizatorul isi poate scrie o semnatura. Acesa semantura este adaugata la SMS-urile trimise. |
- | Să se importe în mediul integrat de dezvoltare Android Studio proiectele ''MessageMe'' si ''DateAndTime''. | + | - Realizati o aplicatie care scrie afiseaza in logcat (System.out Sau Log) sms-urile primite. (BroadcastReceiver) |
- | + | - Realizati o aplicatie care afiseaza SMS-urile primite (porniti o activitate la primirea unui SMS) | |
- | [**1**]. Să se adauge o acțiune asociată evenimentului de apăsare a butonului ''notYetRegisteredButton'', astfel încât să se lanseze în execuție activitatea ''RegisterActivity''. În cadrul acesteia, un utilizator are posibilitatea de a-și crea un cont, prin completarea unor câmpuri. Pentru ca operația să fie realizată cu succes, este necesar ca toate atributele să fie specificate, iar valorile indicate în cadrul parolelor să corespundă. Rezultatul va fi transmis înapoi activității ''LoginActivity'' care îl va afișa pe ecran. | + | - Inregistrati o activitate care poate afisa fisiere de tip text (Activitatea este pronita de actiunea VIEW si categoria DEFAULT si are in data textul) |
- | + | - Să se implementeze un ascultător pentru mesaje cu difuzare în aplicația ''MessageMe'', care interceptează mesajele trimise de sistemul de operare Android cu privire la schimbările legate de conectivitatea la Internet. Acesta va jurnaliza toate operațiile care au fost detectate, cu ajutorul ''Logcat''. Acțiunea care este transmisă în acest caz este ''android.net.conn.CONNECTIVITY_CHANGE''. Astfel înregistrat, un obiect de acest tip va fi invocat în mod automat, furnizând informații legate de existența unei conexiuni precum și a unei rețele fără fir. | |
- | **a)** În activitatea ''LoginActivity'' se va asocia butonului ''notRegisteredYetButton'' un obiect ascultător pentru evenimentele de tip apăsare (''View.OnClickListener'') care implementează metoda de callback ''onClick(View)''. În cadrul acesteia, se va constui o **intenție implicită** (definită pe baza acțiunii - ''Constants.REGISTER_ACTIVITY_INTENT_ACTION''), după care se va lansa în execuție activitatea corespunzătoare în așteptarea unui rezultat (metoda ''setActivityForResult()'' primește ca parametri intenția și codul de cerere - ''Constants.REGISTER_ACTIVITY_REQUEST_CODE''). | + | |
- | + | ||
- | **b)** În activitatea ''RegisterActivity'' se va proceda similar pentru butoanele ''registerButton'', respectiv ''cancelButton'': | + | |
- | * în cazul ''registerButton'' se verifică ca toate câmpurile să fi fost completate și ca parolele să corespundă, situație în care se transmite activității părinte rezultatul ''Activity.RESULT_OK'', activitatea încheindu-și execuția (se apelează metoda ''finish()''). | + | |
- | * în cazul ''cancelButton'' se transmite activității părinte rezultatul ''Activity.RESULT_CANCELED'', activitatea încheindu-și execuția (se apelează metoda ''finish()''). | + | |
- | + | ||
- | **c)** În clasa ''LoginActivity'' se va implementa metoda ''onActivityResult()'' ce verifică rezultatul cu care s-a terminat activitatea invocată, afișându-l în cadrul interfeței grafice. | + | |
- | + | ||
- | <code java> | + | |
- | @Override | + | |
- | public void onActivityResult(int requestCode, int resultCode, Intent intent); | + | |
- | </code> | + | |
- | + | ||
- | Metoda primește ca parametri: | + | |
- | * ''requestCode'' - codul de cerere transmis ca parametru în metoda ''startActivityForResult()'', în funcție de care se identifică eventualele răspunsuri primite de la invocări diferite; | + | |
- | * ''resultCode'' - codul de răspuns (rezultatul); | + | |
- | * ''Intent'' - obiect prin intermediul căruia pot fi furnizate informații suplimentare. | + | |
- | + | ||
- | <note tip> | + | |
- | Pentru afișarea unui mesaj se poate utiliza următorul cod sursă: | + | |
- | <code java> | + | |
- | Snackbar.make(notRegisteredYetButton, getResources().getString(R.string.activity_returned_with_result) + " " + resultCode, Snackbar.LENGTH_LONG).show(); | + | |
- | </code> | + | |
- | </note> | + | |
- | + | ||
- | [**2**]. Să se adauge o acțiune asociată evenimentului de apăsare a butonului ''loginButton'', astfel încât să se lanseze în execuție activitatea ''MainActivity''. În acest scop, este necesar să se verifice faptul că numele de utilizator și parola au fost completate corespunzător. Pentru invocarea componentei, se va folosi o **intenție explicită** (indicată prin denumirea clasei care o implementează). Informațiile nume de utilizator și parolă trebuie incluse în câmpul ''extra'' al intenției (folosindu-se cheile ''Constants.USERNAME'', respectiv ''Constants.PASSWORD''). | + | |
- | + | ||
- | [**3**]. În fragmentul ''ProfileFragment'', să se obțină valorile corespunzătoare numelui de utilizator și parolei provenite de la activitatea care l-a invocat, prin intermediul intenției corespunzătoare. Să se afișeze aceste valori în câmpurile text ''usernameTextView'', respectiv ''passwordTextView''. | + | |
- | + | ||
- | <note tip>Toate aceste operații trebuie să fie realizate în cadrul metodei ''onActivityCreated()'' pentru că numai în acest moment se garantează faptul că activitatea din care face parte fragmentul poate fi accesată.</note> | + | |
- | + | ||
- | [**4**]. În fragmentul ''ProfileFragment'', să se implementeze trei butoane prin care să se invoce, folosind mecanisme diferite, activitatea ''DateAndTimeActivity'' din contextul altei aplicații Android. Această activitate afișează data și ora curente, folosind un calendar și un ceas analogic. | + | |
- | + | ||
- | **a)** Se va folosi **o intenție** calificată prin intermediul acțiunii ''Constants.DATE_AND_TIME_INTENT_ACTION''. Această valoare trebuie inclusă și în fișierul ''AndroidManifest.xml'' al proiectului ''DateAndTime'', în cadrul unui alt filtru de intenție, ce va avea categoria ''android.intent.category.DEFAULT''. | + | |
- | + | ||
- | <code xml> | + | |
- | <intent-filter> | + | |
- | <action android:name="org.rosedu.dandroid.dateandtime.intent.action.DateAndTimeActivity" /> | + | |
- | <category android:name="android.intent.category.DEFAULT" /> | + | |
- | </intent-filter> | + | |
- | </code> | + | |
- | + | ||
- | **b)** Se va folosi **un ascultător de mesaje cu difuzare**. Tipul de acțiune utilizat va fi ''Constants.DATE_AND_TIME_BROADCAST_RECEIVER_ACTION''. Este necesar să se utilizeze metoda ''sendBroadcast()''. În fișierul ''AndroidManifest.xml'' al proiectului ''DateAndTime'', este necesar să se defineacă un element ''<receiver>'' care va specifica clasa ce implementează obiectul ascultător pentru mesaje cu difuzare și acțiunea în cadrul unui filtru de intenții. | + | |
- | + | ||
- | <code xml> | + | |
- | <receiver android:name=".controller.DateAndTimeBroadcastReceiver"> | + | |
- | <intent-filter> | + | |
- | <action android:name="org.rosedu.dandroid.dateandtime.broadcastreceiver.action.DateAndTimeActivity"/> | + | |
- | </intent-filter> | + | |
- | </receiver> | + | |
- | </code> | + | |
- | + | ||
- | Clasa ''DateAndTimeBroadcastReceiver'' (derivată din ''BroadcastReceiver'') prelucrează mesajele cu difuzare care respectă anumite criterii, metoda ''onReceive()'' fiind apelată în mod automat. În cadrul acestei metode, trebuie să se invoce mai departe, tot prin intermediul unei intenții, activitatea ''DateAndTimeActivity''. Fiind vorba de invocarea unei activități din cadrul aceleiași clase, se va utiliza o intenție explicită (definită prin denumirea clasei). | + | |
- | + | ||
- | <note important>Este necesar să se indice flag-ul ''Intent.FLAG_ACTIVITY_NEW_TASK'', în caz contrar activitatea neputând fi lansată în execuție.</note> | + | |
- | + | ||
- | <file java DateAndTimeBroadcastReceiver.java> | + | |
- | public class DateAndTimeBroadcastReceiver extends BroadcastReceiver { | + | |
- | + | ||
- | @Override | + | |
- | public void onReceive(Context context, Intent intent) { | + | |
- | Intent mainActivityIntent = new Intent(context.getApplicationContext(), DateAndTimeActivity.class); | + | |
- | mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | + | |
- | context.getApplicationContext().startActivity(mainActivityIntent); | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | </file> | + | |
- | + | ||
- | **c)** Se va folosi **un URI** (Uniform Resource Identifier). Invocarea se face prin intermediul unui identificator de resurse (conținut de obiectul ''Constants.DATE_AND_TIME_URI_ACTION''), pe care se aplică acțiunea ''Intent.ACTION_VIEW''. URI-ul conține același protocol și aceeași gazdă ca cele definite în secțiunea de date a fișierului ''AndroidManifest.xml'' din cadrul proiectului ''DateAndTime''. | + | |
- | + | ||
- | <code xml> | + | |
- | <intent-filter> | + | |
- | <action android:name="android.intent.action.VIEW" /> | + | |
- | <category android:name="android.intent.category.DEFAULT" /> | + | |
- | <data | + | |
- | android:scheme="dateandtimeprotocol" | + | |
- | android:host="dandroid.rosedu.org" /> | + | |
- | </intent-filter> | + | |
- | </code> | + | |
- | + | ||
- | <note tip>De remarcat este faptul că pentru aceeași activitate pot fi definite mai multe filtre de intenții având un conținut diferit.</note> | + | |
- | + | ||
- | <note tip>Aplicația ''DateAndTime'' trebuie să fie instalată înainte de a se face invocările din aplicația ''MessageMe'', în caz contrar fiind generată o excepție.</note> | + | |
- | + | ||
- | [**BONUS**]. Să se implementeze un ascultător pentru mesaje cu difuzare în aplicația ''MessageMe'', care interceptează mesajele trimise de sistemul de operare Android cu privire la schimbările legate de conectivitatea la Internet. Acesta va jurnaliza toate operațiile care au fost detectate, cu ajutorul ''Logcat''. Acțiunea care este transmisă în acest caz este ''android.net.conn.CONNECTIVITY_CHANGE''. Astfel înregistrat, un obiect de acest tip va fi invocat în mod automat, furnizând informații legate de existența unei conexiuni precum și a unei rețele fără fir. | + | |
<code java> | <code java> |