Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator05 [2016/03/25 02:08] Andrei Roșu-Cojocaru [Servicii ce Rulează în Prim-Plan] |
laboratoare:laborator05 [2017/02/20 20:54] (current) |
||
|---|---|---|---|
| Line 39: | Line 39: | ||
| <application ...> | <application ...> | ||
| <service | <service | ||
| - | android:name="ro.pub.cs.systems.eim.lab04.SomeService" | + | android:name="ro.pub.cs.systems.eim.lab05.SomeService" |
| android:enabled="true" | android:enabled="true" | ||
| android:exported="true" | android:exported="true" | ||
| - | android:permission="ro.pub.cs.systems.eim.lab04.SOME_SERVICE_PERMISSION" /> | + | android:permission="ro.pub.cs.systems.eim.lab05.SOME_SERVICE_PERMISSION" /> |
| </application> | </application> | ||
| </manifest> | </manifest> | ||
| Line 154: | Line 154: | ||
| <note important>În cazul metodelor care guvernează ciclul de viață al unui serviciu, NU este obligatoriu să se apeleze metodele din clasa părinte (nu se va genera nici o excepție în această situație).</note> | <note important>În cazul metodelor care guvernează ciclul de viață al unui serviciu, NU este obligatoriu să se apeleze metodele din clasa părinte (nu se va genera nici o excepție în această situație).</note> | ||
| - | {{ :laboratoare:laborator05:01service_lifecycle.png?nolink&800 }} | + | {{ :eim:laboratoare:laborator05:service_lifecycle.png?nolink&800 }} |
| Se observă faptul că ciclul de viață al unui serviciu are loc între metodele ''onCreate()'' și ''onDestroy()''. De cele mai multe ori, este necesar ca un serviciu să folosească unul sau mai multe fire de execuție (dedicate) astfel încât să nu influențeze responsivitatea aplicației Android. Într-o astfel de situație, firul de execuție va fi pornit pe metoda ''onCreate()'' și va fi oprit pe metoda ''onDestroy()''. De asemenea, în cadrul metodei ''onCreate()'' au loc diferite operații de configurare (inițializări), în timp ce în cadrul metodei ''onDestroy()'' realizează eliberarea resurselor folosite. Metodele ''onCreate()'' și ''onDestroy()'' sunt invocate pentru toate tipurile de servicii, atât pentru cele de tip started, cât și pentru cele de tip bounded. | Se observă faptul că ciclul de viață al unui serviciu are loc între metodele ''onCreate()'' și ''onDestroy()''. De cele mai multe ori, este necesar ca un serviciu să folosească unul sau mai multe fire de execuție (dedicate) astfel încât să nu influențeze responsivitatea aplicației Android. Într-o astfel de situație, firul de execuție va fi pornit pe metoda ''onCreate()'' și va fi oprit pe metoda ''onDestroy()''. De asemenea, în cadrul metodei ''onCreate()'' au loc diferite operații de configurare (inițializări), în timp ce în cadrul metodei ''onDestroy()'' realizează eliberarea resurselor folosite. Metodele ''onCreate()'' și ''onDestroy()'' sunt invocate pentru toate tipurile de servicii, atât pentru cele de tip started, cât și pentru cele de tip bounded. | ||
| Line 226: | Line 226: | ||
| Pentru oprirea unui serviciu este suficient un singur apel al uneia dintre metodele ''stopSelf()'' sau ''stopService()''. | Pentru oprirea unui serviciu este suficient un singur apel al uneia dintre metodele ''stopSelf()'' sau ''stopService()''. | ||
| - | == Utilizarea clasei PendingIntent == | + | == Utilizarea clasei IntentService == |
| Recursul la clasa [[http://developer.android.com/reference/android/app/IntentService.html|IntentService]] este adecvată în situația în care se dorește implementarea unor servicii care rulează în fundal, **pe un fir de execuție dedicat** realizând un set de operații la un moment dat de timp, atunci când sunt solicitate. În situația în care serviciul este accesat simultan de mai multe componente ale unei (unor) aplicații Android, procesarea acestora va fi realizată secvențial. | Recursul la clasa [[http://developer.android.com/reference/android/app/IntentService.html|IntentService]] este adecvată în situația în care se dorește implementarea unor servicii care rulează în fundal, **pe un fir de execuție dedicat** realizând un set de operații la un moment dat de timp, atunci când sunt solicitate. În situația în care serviciul este accesat simultan de mai multe componente ale unei (unor) aplicații Android, procesarea acestora va fi realizată secvențial. | ||
| Line 232: | Line 232: | ||
| Un obiect de acest tip este lansat în execuție prin pornirea unui serviciu și transmiterea unui obiect de tip ''Intent'' care conține toți parametrii necesari pentru realizarea sarcinii respective. Toate operațiile solicitate sunt înregistrate într-o coadă de așteptare și executate succesiv, prin invocarea automată a metodei [[http://developer.android.com/reference/android/app/IntentService.html#onHandleIntent(android.content.Intent)|onHandleIntent()]]. După ce procesarea a fost finalizată, procesul se oprește singur (nu este necesar să se apeleze metodele ''stopSelf()'' sau ''stopService()'' explicit). | Un obiect de acest tip este lansat în execuție prin pornirea unui serviciu și transmiterea unui obiect de tip ''Intent'' care conține toți parametrii necesari pentru realizarea sarcinii respective. Toate operațiile solicitate sunt înregistrate într-o coadă de așteptare și executate succesiv, prin invocarea automată a metodei [[http://developer.android.com/reference/android/app/IntentService.html#onHandleIntent(android.content.Intent)|onHandleIntent()]]. După ce procesarea a fost finalizată, procesul se oprește singur (nu este necesar să se apeleze metodele ''stopSelf()'' sau ''stopService()'' explicit). | ||
| - | <note tip>Clasa ''PendingIntent'' oferă o implementare implicită a metodelor ''onStartCommand()'' care plasează intenția către coada de așteptare și invocă metoda ''onHandleIntent()'' precum și a metodei ''onBind()'' care întoarce valoarea ''null''.</note> | + | <note tip>Clasa ''IntentService'' oferă o implementare implicită a metodelor ''onStartCommand()'' care plasează intenția către coada de așteptare și invocă metoda ''onHandleIntent()'' precum și a metodei ''onBind()'' care întoarce valoarea ''null''.</note> |
| Prin urmare, o implementare presupune definirea unei clase derivată din ''IntentService'' care suprascrie metoda ''onHandleIntent()'', ce primește ca parametru intenția conținând parametrii ce se doresc a fi procesați, execuția sa fiind realizată (în mod transparent) pe un fir de execuție ce rulează în fundal. De asemenea, trebuie furnizat și un constructor implicit. | Prin urmare, o implementare presupune definirea unei clase derivată din ''IntentService'' care suprascrie metoda ''onHandleIntent()'', ce primește ca parametru intenția conținând parametrii ce se doresc a fi procesați, execuția sa fiind realizată (în mod transparent) pe un fir de execuție ce rulează în fundal. De asemenea, trebuie furnizat și un constructor implicit. | ||
| Line 504: | Line 504: | ||
| - utilizarea clasei [[http://developer.android.com/reference/android/os/AsyncTask.html|AsyncTask]] permite definirea unei operații care va fi realizată pe un fir de execuție separat, oferind metode care oferă informații cu privire la progres, ce pot fi consultate de alte fire de execuție; | - utilizarea clasei [[http://developer.android.com/reference/android/os/AsyncTask.html|AsyncTask]] permite definirea unei operații care va fi realizată pe un fir de execuție separat, oferind metode care oferă informații cu privire la progres, ce pot fi consultate de alte fire de execuție; | ||
| - definirea unei clase derivate din [[http://developer.android.com/reference/android/content/Loader.html|Loader]]; | - definirea unei clase derivate din [[http://developer.android.com/reference/android/content/Loader.html|Loader]]; | ||
| + | - utilizarea clasei [[http://developer.android.com/reference/android/os/Handler.html|Handler]]; | ||
| - implementarea unui fir de execuție definit de utilizator, transmiterea valorilor către interfața grafică fiind realizat prin intermediul clasei [[http://developer.android.com/reference/android/os/Handler.html|Handler]]. | - implementarea unui fir de execuție definit de utilizator, transmiterea valorilor către interfața grafică fiind realizat prin intermediul clasei [[http://developer.android.com/reference/android/os/Handler.html|Handler]]. | ||
| Line 641: | Line 642: | ||
| <note>În Android, alarmele rămân active chiar și atunci când dispozitivul mobil se găsește într-o stare de latență (//eng.// sleep mode), putând fi utilizate pentru a-l scoate din aceasta. Totuși, ele devin inactive în momentul în care dispozitivul mobil este repornit.</note> | <note>În Android, alarmele rămân active chiar și atunci când dispozitivul mobil se găsește într-o stare de latență (//eng.// sleep mode), putând fi utilizate pentru a-l scoate din aceasta. Totuși, ele devin inactive în momentul în care dispozitivul mobil este repornit.</note> | ||
| - | Operațiile cu alarme sunt realizate prin intermediul serviciului de sistem ''AlarmManager'' care poate fi accesat prin intermediul metodei ''getSystemService()'' care primește ca parametru argumentul ''Context.ALARM_SERVICE''. | + | Operațiile cu alarme sunt realizate prin intermediul serviciului de sistem [[http://developer.android.com/reference/android/app/AlarmManager.html|AlarmManager]] care poate fi accesat prin intermediul metodei [[http://developer.android.com/reference/android/content/Context.html#getSystemService%28java.lang.String%29|Context.getSystemService()]] care primește ca parametru argumentul [[http://developer.android.com/reference/android/content/Context.html#ALARM_SERVICE|Context.ALARM_SERVICE]]. |
| Există mai multe tipuri de alarme: | Există mai multe tipuri de alarme: | ||
| - | * ''RTC_WAKEUP'' - scoate dispozitivul mobil din starea de latență prin transmiterea unei intenții în așteptare, la un anumit moment de timp specificat; | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#RTC_WAKEUP|RTC_WAKEUP]] - scoate dispozitivul mobil din starea de latență prin transmiterea unei intenții în așteptare, la un anumit moment de timp specificat; |
| - | * ''RTC'' - transmite o intenție în așteptare, la un anumit moment de timp specificat, fără a scoate dispozitivul mobil din starea de latență; | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#RTC|RTC]] - transmite o intenție în așteptare, la un anumit moment de timp specificat, fără a scoate dispozitivul mobil din starea de latență; |
| - | * ''ELAPSED_REALTIME'' - transmite o intenție în așteptare, la un anumit interval de timp scurs de la momentul în care dispozitivul mobil a fost pornit, fără a-l scoate din starea de latență; | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME|ELAPSED_REALTIME]] - transmite o intenție în așteptare, la un anumit interval de timp scurs de la momentul în care dispozitivul mobil a fost pornit, fără a-l scoate din starea de latență; |
| - | * ''ELAPSED_REALTIME_WAKEUP'' - scoate dispozitivul mobil din starea de latență prin transmiterea unei intenții în așteptare, la un anumit interval de timp scurs de la momentul în care acesta a fost pornit. | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME_WAKEUP|ELAPSED_REALTIME_WAKEUP]] - scoate dispozitivul mobil din starea de latență prin transmiterea unei intenții în așteptare, la un anumit interval de timp scurs de la momentul în care acesta a fost pornit. |
| - | În funcție de aceste valori, parametrul furnizat metodei ''set()'' a obiectului de tip ''AlarmManager'' reprezintă un moment de timp sau un interval. | + | În funcție de aceste valori, parametrul furnizat metodei [[http://developer.android.com/reference/android/app/AlarmManager.html#set(int,%20long,%20android.app.PendingIntent)|set()]] a obiectului de tip ''AlarmManager'' reprezintă un moment de timp sau un interval. |
| În momentul în care se declanșează, obiectul de tip ''PendingIntent'' este distribuit la nivelul tuturor componentelor sistemului de operare. | În momentul în care se declanșează, obiectul de tip ''PendingIntent'' este distribuit la nivelul tuturor componentelor sistemului de operare. | ||
| Line 660: | Line 661: | ||
| </code> | </code> | ||
| - | Anularea unei alarme se face prin intermediul metodei ''cancel()'' a obiectului de tip ''AlarmManager'' care primește ca parametru intenția în așteptare care nu mai trebuie transmisă. | + | Anularea unei alarme se face prin intermediul metodei [[http://developer.android.com/reference/android/app/AlarmManager.html#cancel(android.app.PendingIntent)|cancel()]] a obiectului de tip ''AlarmManager'' care primește ca parametru intenția în așteptare care nu mai trebuie transmisă. |
| <code java> | <code java> | ||
| Line 667: | Line 668: | ||
| Utilizatorul are și posibilitatea de a indica anumite intervale de timp la care alarma este repetată, prin intermediul unor metode definite în clasa ''AlarmManager'': | Utilizatorul are și posibilitatea de a indica anumite intervale de timp la care alarma este repetată, prin intermediul unor metode definite în clasa ''AlarmManager'': | ||
| - | * ''setRepeating()'' - utilizată când se dorește un control foarte exact asupra intervalului de timp la care alarma este repetată, exprimat la nivel de milisecunde; | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int,%20long,%20long,%20android.app.PendingIntent)|setRepeating()]] - utilizată când se dorește un control foarte exact asupra intervalului de timp la care alarma este repetată, exprimat la nivel de milisecunde; |
| - | * ''setInexactRepeating()'' - folosit pentru a economisi consumul de baterie realizat la scoaterea dispozitivului mobil din starea de latență de fiecare dată când este necesară realizarea unor sarcini planificate (care nu se suprapun); astfel, sistemul de operare Android va sincroniza mai multe alarme cu modul de repetare inexact, declanșându-le simultan; metoda primește ca parametru una dintre constantele: | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating(int,%20long,%20long,%20android.app.PendingIntent)|setInexactRepeating()]] - folosit pentru a economisi consumul de baterie realizat la scoaterea dispozitivului mobil din starea de latență de fiecare dată când este necesară realizarea unor sarcini planificate (care nu se suprapun); astfel, sistemul de operare Android va sincroniza mai multe alarme cu modul de repetare inexact, declanșându-le simultan; metoda primește ca parametru una dintre constantele: |
| - | * ''INTERVAL_FIFTEEN_MINUTES'' | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_FIFTEEN_MINUTES|INTERVAL_FIFTEEN_MINUTES]] |
| - | * ''INTERVAL_HALF_HOUR'' | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_HALF_DAY|INTERVAL_HALF_HOUR]] |
| - | * ''INTERVAL_HOUR'' | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_HALF_HOUR|INTERVAL_HOUR]] |
| - | * ''INTERVAL_HALF_DAY'' | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_HALF_DAY|INTERVAL_HALF_DAY]] |
| - | * ''INTERVAL_DAY'' | + | * [[http://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_DAY|INTERVAL_DAY]] |
| Ambele metode primesc ca parametrii tipul de alarmă, un moment de timp la care alarma va fi declanșată inițial și o intenție în așteptare care va fi transmisă. | Ambele metode primesc ca parametrii tipul de alarmă, un moment de timp la care alarma va fi declanșată inițial și o intenție în așteptare care va fi transmisă. | ||
| Line 683: | Line 684: | ||
| <note important>Impactul pe care alarmele recurente îl au asupra consumului de baterie poate fi semnificativ. De aceea, este recomandat ca frecvența de repetare a alarmei să fie cât mai mică, scoțând dispozitivul mobil din starea de latență numai atunci când este necesar și utilizând tipul de repetare inexact, dacă este posibil.</note> | <note important>Impactul pe care alarmele recurente îl au asupra consumului de baterie poate fi semnificativ. De aceea, este recomandat ca frecvența de repetare a alarmei să fie cât mai mică, scoțând dispozitivul mobil din starea de latență numai atunci când este necesar și utilizând tipul de repetare inexact, dacă este posibil.</note> | ||
| - | Anularea unei alarme recurente se face tot prin intermediul metodei ''cancel()'' a obiectului de tip ''AlarmManager'' care primește ca parametru intenția în așteptare care nu mai trebuie transmisă. | + | Anularea unei alarme recurente se face tot prin intermediul metodei [[http://developer.android.com/reference/android/app/AlarmManager.html#cancel(android.app.PendingIntent)|cancel()]] a obiectului de tip ''AlarmManager'' care primește ca parametru intenția în așteptare care nu mai trebuie transmisă. |
| ===== Activitate de Laborator ===== | ===== Activitate de Laborator ===== | ||
