Un service este o componentă din Android care poate efectua muncă fără a avea propria interfață cu utilizatorul, precum redarea muzicii, sincronizarea datelor sau un transfer de fișiere în desfășurare. Împreună cu activities, broadcast receivers și content providers, serviceurile sunt una dintre cele patru componente fundamentale ale aplicațiilor în Android și, la fel ca celelalte, trebuie înregistrate în AndroidManifest.xml al aplicației. În mod implicit, un service rulează pe threadul principal al aplicației, așa că munca grea trebuie totuși mutată pe un thread de fundal.
Android face distincția între serviceuri pornite, care efectuează o sarcină până când sunt oprite, și serviceuri legate, la care alte componente se pot lega și cu care pot comunica. Un foreground service efectuează o muncă de care utilizatorul este conștient și trebuie să afișeze o notificare persistentă. Deoarece munca în fundal afectează autonomia bateriei și performanța, Android a introdus treptat restricții privind momentele în care aplicațiile pot porni serviceuri în fundal, iar pentru munca ce poate fi amânată Google recomandă de obicei WorkManager.
Un service în Android este o componentă a aplicației care efectuează muncă fără propria interfață cu utilizatorul, precum redarea muzicii, sincronizarea sau transferurile de fișiere. Poate fi pornit pentru a efectua o sarcină sau legat de alte componente care vor să comunice cu el. Foreground services afișează o notificare persistentă, astfel încât utilizatorul să știe că munca are loc, iar din cauza restricțiilor Android privind munca în fundal, WorkManager este folosit adesea pentru sarcinile care pot fi amânate.
More about Service
Un service este una dintre cele patru componente fundamentale ale unei aplicații Android, alături de activities, broadcast receivers și content providers. În timp ce o activity afișează un ecran cu care utilizatorul interacționează, un service este folosit pentru munca ce nu necesită o interfață cu utilizatorul sau care trebuie să continue chiar dacă utilizatorul părăsește ecranul. Exemple tipice sunt redarea muzicii sau a podcasturilor, navigația, încărcarea fișierelor și sincronizarea datelor cu un server.
Din punct de vedere tehnic, un service este o clasă care moștenește din android.app.Service și este înregistrată cu un element service în AndroidManifest.xml. Sistemul controlează ciclul de viață al serviceului prin metode precum onCreate(), onStartCommand(), onBind() și onDestroy(). Este important de știut că un service nu rulează automat pe un thread separat. În mod implicit, codul său este executat pe threadul principal al aplicației, așa că munca de lungă durată sau blocantă trebuie mutată pe un thread de fundal, de exemplu cu corutine Kotlin, pentru a preveni ca aplicația să nu mai răspundă.
Serviceurile pot fi folosite în moduri diferite, fiecare potrivit pentru nevoi diferite:
Foreground service: Efectuează o muncă de care utilizatorul este conștient, precum redarea muzicii sau urmărirea activă a unui antrenament. Un foreground service trebuie să afișeze o notificare persistentă, iar în versiunile mai noi de Android aplicația trebuie să declare un tip de service și să dețină permisiunile asociate.
Background service: Efectuează o muncă pe care utilizatorul nu o vede direct. Începând cu Android 8.0, există restricții stricte privind momentele în care aplicațiile pot porni astfel de serviceuri în timp ce ele însele sunt în fundal.
Bound service: Oferă o interfață client-server în care alte componente, inclusiv cele din alte aplicații, se pot lega de service, pot trimite cereri și pot primi răspunsuri. Un bound service trăiește atât timp cât cel puțin o componentă este legată de el.
Unul dintre cele mai mari puncte forte ale serviceurilor este că permit unei aplicații să continue o muncă importantă fără ca aceasta să fie legată de un anumit ecran. În același timp, necesită atenție, deoarece munca în fundal consumă baterie, memorie și date. Prin urmare, Android a introdus treptat reguli care restricționează munca în fundal, iar utilizatorii pot vedea și opri aplicațiile care rulează foreground services.
Pentru multe sarcini, Google recomandă în schimb WorkManager, care face parte din Android Jetpack. WorkManager este destinat muncii care trebuie efectuată în mod fiabil, chiar dacă aplicația este închisă sau dispozitivul este repornit, și care poate fi amânată, precum încărcarea fișierelor de log sau sincronizarea periodică. WorkManager ține cont de restricțiile sistemului și poate fi configurat cu condiții precum o conexiune la rețea sau încărcarea.
În concluzie, un service este alegerea potrivită atunci când o aplicație trebuie să efectueze o muncă continuă pe care utilizatorul se așteaptă să continue sau când alte componente trebuie să comunice cu un proces de lungă durată. Alegând tipul potrivit de service sau WorkManager atunci când munca poate fi amânată, dezvoltatorii pot construi aplicații care sunt atât funcționale, cât și blânde cu resursele dispozitivului.
Frequently asked questions about Service
Ce este un service în Android?
Un service este o componentă din Android care efectuează muncă în fundal fără a avea propria interfață cu utilizatorul. Este folosit pentru sarcini care trebuie să continue chiar și atunci când utilizatorul nu se uită la aplicație, precum redarea muzicii, navigația în desfășurare sau încărcarea fișierelor.
Un service trebuie declarat în fișierul AndroidManifest.xml. Este important de știut că, în mod implicit, un service rulează pe threadul principal al aplicației. Prin urmare, sarcinile grele trebuie totuși mutate pe un thread de fundal sau într-o corutină. În versiunile mai noi de Android există și reguli stricte privind momentele în care aplicațiile pot rula în fundal, pentru a economisi bateria.
Ce tipuri de service există în Android?
Android face distincția între trei tipuri de service. Un foreground service efectuează o sarcină de care utilizatorul este conștient și trebuie să afișeze o notificare cât timp rulează. Este folosit, de exemplu, pentru redarea muzicii sau urmărirea unei alergări.
Un background service efectuează o muncă pe care utilizatorul nu o vede direct. Începând cu Android 8.0, există restricții stricte privind momentele în care aplicațiile pot porni astfel de serviceuri, iar pentru multe sarcini se recomandă în schimb WorkManager. Un bound service permite altor componente, precum o activity, să se lege de el și să comunice cu el și rulează doar atât timp cât ceva este legat de el.
Care este diferența dintre un started service și un bound service?
Un started service este pornit cu startService sau startForegroundService și rulează până când se oprește singur sau este oprit. De obicei efectuează o sarcină specifică și nu returnează un rezultat direct componentei care l-a pornit.
Un bound service este pornit când o altă componentă se leagă de el cu bindService. Oferă o interfață prin care componenta poate apela metode și poate primi răspunsuri, de exemplu o activity care controlează un music player. Când nu mai este legată nicio componentă, este oprit. Un service poate fi și ambele în același timp, dacă este atât pornit, cât și legat.
Când ar trebui folosit WorkManager în locul unui service?
WorkManager este soluția recomandată de Google pentru munca în fundal care trebuie efectuată în mod fiabil, chiar dacă aplicația este închisă sau dispozitivul este repornit. Poate fi vorba de sincronizarea datelor, încărcarea fișierelor de log sau curățarea periodică.
WorkManager respectă regulile sistemului privind bateria și activitatea în fundal și poate fi setat să ruleze doar când, de exemplu, dispozitivul este conectat la Wi-Fi sau se încarcă. Un service, în special un foreground service, este mai relevant atunci când munca trebuie să aibă loc imediat și este vizibilă pentru utilizator, precum redarea muzicii sau un apel în desfășurare. Pentru munca de scurtă durată cât timp aplicația este deschisă, corutinele sunt adesea suficiente.
De ce trebuie un foreground service să afișeze o notificare?
Un foreground service poate rula mult timp și poate folosi resurse precum procesorul, bateria și datele de localizare în timp ce utilizatorul nu are aplicația deschisă. Prin urmare, Android îi cere să afișeze o notificare persistentă, astfel încât utilizatorul să știe că aplicația lucrează în fundal.
Acest lucru oferă transparență și îi permite utilizatorului să oprească serviceul sau să deschidă aplicația. În versiunile mai noi de Android, dezvoltatorii trebuie să declare și un tip pentru service, precum redare media, localizare sau sincronizare de date, și să dețină permisiunile asociate. Începând cu Android 13, utilizatorul trebuie să acorde și permisiunea pentru notificări, ceea ce afectează modul în care este afișată notificarea.
Ce restricții impune Android asupra muncii în fundal?
Pentru a economisi bateria și a proteja confidențialitatea utilizatorului, Android a introdus treptat restricții asupra muncii în fundal. Începând cu Android 8.0, aplicațiile aflate în fundal nu pot porni, în general, background services obișnuite, iar sistemul le oprește după scurt timp.
Modul Doze și App Standby amână accesul la rețea și joburile atunci când dispozitivul nu este folosit sau aplicația este folosită rar. Versiunile mai noi necesită tipuri și permisiuni pentru foreground services și restricționează momentele în care acestea pot fi pornite din fundal. Accesul la localizarea în fundal necesită o permisiune separată. Prin urmare, munca în fundal ar trebui programată cu WorkManager ori de câte ori este posibil.
Service for dummies
Un service într-o aplicație Android este un fel de ajutor invizibil care poate continua să lucreze chiar și atunci când nimeni nu se uită la aplicație. Gândește-te la o aplicație de muzică: poate fi pornită o melodie, utilizatorul poate reveni la ecranul de pornire și poate scrie un mesaj, iar muzica continuă să cânte. De asta se ocupă un service. Când o aplicație folosește un service pentru ceva despre care utilizatorul ar trebui să știe, telefonul afișează o mică notificare, astfel încât să fie clar că aplicația lucrează. În același timp, Android se asigură că aplicațiile nu consumă prea multă energie în fundal, astfel încât bateria să țină mai mult.