Background Service — ce este, tipuri și cum funcționează în Android

Autor: IT Sectr Publicat: 2026-03-27 Timp de citire: 8 min

Background Service — este o componentă Android destinată executării operațiilor de lungă durată în fundal fără interfață de utilizator. Spre deosebire de Activity, Service continuă să funcționeze chiar și după ce aplicația este minimizată sau utilizatorul a trecut la o altă aplicație. Potrivit Android Developers, 2026, există trei tipuri de servicii: Started Service, Bound Service și Foreground Service, fiecare cu propriul ciclu de viață și domeniu de aplicare.

Principalele

  • Background Service — este o componentă Android pentru operații în fundal fără UI, care funcționează independent de activitate.
  • Started Service se lansează prin startService și funcționează până la oprirea explicită prin stopSelf.
  • Bound Service se leagă de componentă prin bindService și trăiește cât timp există clienți conectați.
  • Foreground Service afișează o notificare permanentă și nu este ucis de sistem când bateria este scăzută.
  • De la versiunea Android 8, serviciile de fundal au restricții stricte privind lansarea în fundal.

Ce este Background Service în Android?

Background Service (sau pur și simplu Service) — una dintre cele patru componente principale ale unei aplicații Android, alături de Activity, BroadcastReceiver și ContentProvider. Spre deosebire de Activity, Service nu are interfață vizuală și este destinat executării operațiilor care trebuie să continue indiferent dacă aplicația se află în prim-plan sau nu.

Service rulează în thread-ul principal (main thread) al aplicației, prin urmare orice operație de blocare în interiorul său necesită crearea unui thread separat. Dacă nu se face acest lucru, sistemul va apela ANR (Application Not Responding). Pentru operații simple de fundal, Android oferă IntentService, care creează automat un thread de lucru. În proiectele moderne, se recomandă utilizarea corutinelor Kotlin cu CoroutineScope în interiorul Service pentru procesare asincronă fără blocarea thread-ului principal.

Scopul principal al Service — redarea muzicii, descărcarea fișierelor, lucrul cu cereri de rețea, sincronizarea datelor și alte sarcini care trebuie să continue după ce utilizatorul părăsește aplicația. Cu toate acestea, odată cu lansarea Android 8, dezvoltatorii trebuie să aleagă în cunoștință de cauză între tipurile de servicii, ținând cont de restricțiile de lucru în fundal.

Cum funcționează ciclul de viață al Service?

Service are propriul ciclu de viață care diferă de Activity. Acesta include patru metode cheie: onCreate, onStartCommand, onBind și onDestroy. Înțelegerea acestui ciclu este necesară pentru implementarea corectă a sarcinilor de fundal fără scurgeri de memorie.

onCreate și onStartCommand

Metoda onCreate este apelată la crearea serviciului, o singură dată pe durata vieții acestuia. În ea se inițializează resursele: cronometre, conexiuni la baza de date, socket-uri. Metoda onStartCommand este apelată de fiecare dată la apelarea startService, ceea ce permite transmiterea de comenzi serviciului deja activ. Valoarea returnată determină comportamentul sistemului la repornire.

kotlin
class DownloadService : Service() {

    override fun onCreate() {
        super.onCreate()
        initializeDownloader()
    }

    override fun onStartCommand(
        intent: Intent?,
        flags: Int,
        startId: Int
    ): Int {
        downloadFile(intent?.getStringExtra("url"))
        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? = null
}

onBind și onDestroy

onBind este apelată la legarea serviciului prin bindService și returnează un obiect IBinder pentru interacțiunea cu clientul. Această metodă este utilizată doar pentru Bound Service. onDestroy — ultimul apel înainte de distrugerea serviciului. în ea se eliberează toate resursele, se opresc thread-urile și se anulează sarcinile.

Tipuri de servicii de fundal

Android oferă trei tipuri de Service, fiecare destinat propriului scenariu. Alegerea tipului greșit poate duce la funcționarea instabilă a aplicației sau la consumul excesiv al bateriei.

Started Service

Started Service se lansează prin apelarea startService și funcționează până la apelarea stopSelf sau stopService. Este potrivit pentru sarcini care trebuie executate imediat: trimiterea de analytics, procesarea imaginilor, descărcarea unui singur fișier. După finalizarea lucrului, serviciul se oprește singur.

Bound Service

Bound Service oferă o interfață client-server, permițând Activity, Fragment sau altă componentă să interacționeze cu serviciul. Serviciul trăiește cât timp există cel puțin un client conectat. Când toți clienții se deconectează, serviciul este distrus. Bound Service este convenabil pentru sarcini care necesită comunicare bidirecțională: player muzical, navigație.

Foreground Service

Foreground Service — este un Started Service cu o notificare permanentă în bara de stare. Sistemul consideră un astfel de serviciu activ și nu-l ucide nici măcar atunci când memoria este insuficientă. Foreground Service este obligatoriu pentru redarea muzicii, înregistrarea audio, urmărirea locației și alte sarcini importante pentru utilizator.

ParametruStartedBoundForeground
LansarestartServicebindServicestartForeground
Viațăpână la stopSelfcât sunt cliențipână la stopForeground
Notificarenunuobligatoriu
Ucisdadanu
Exempludescărcareplayermuzică

Crearea și lansarea Service

Crearea serviciului începe cu declararea clasei care moștenește Service și înregistrarea acesteia în AndroidManifest.xml. Fără înregistrare în manifest, sistemul nu va putea lansa serviciul, iar orice apelare startService va duce la o excepție.

kotlin
// Înregistrarea în AndroidManifest.xml
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {

    override fun onStartCommand(
        intent: Intent?,
        flags: Int,
        startId: Int
    ): Int {
        startForeground(
            NOTIFICATION_ID,
            createNotification()
        )
        performSync(intent)
        return START_NOT_STICKY
    }
}

Pentru lansarea serviciului din Activity sau Fragment se utilizează Intent cu indicarea explicită a clasei serviciului. începând cu Android 8, pentru Foreground Service este necesară permisiunea FOREGROUND_SERVICE în manifest.

kotlin
// Lansarea Started Service
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)

// Lansarea Foreground Service (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent)
} else {
    startService(intent)
}

Restricții în Android 8+

începând cu Android 8 (API 26) Google a introdus restricții stricte privind serviciile de fundal. Lansarea Service în fundal (când aplicația nu este în prim-plan) este permisă doar în cazuri excepționale: la primirea unei notificări push, după încărcarea dispozitivului sau prin JobScheduler.

Pentru sarcini de lungă durată care nu necesită executare imediată, se recomandă utilizarea WorkManager sau JobScheduler. Dacă aplicația are într-adevăr nevoie de un serviciu activ, singura cale — Foreground Service cu o notificare vizibilă pentru utilizator. Lansarea unui serviciu în fundal fără notificare va fi ignorată de sistem.

JobIntentService pentru compatibilitate inversă

JobIntentService — este o clasă specializată care a apărut în support library pentru a funcționa pe Android 5+. Combină comportamentul IntentService (thread de lucru automat, procesare secvențială) cu planificarea prin JobScheduler. Pe Android 8+, JobIntentService utilizează JobScheduler sub capotă, iar pe versiunile mai vechi — Service obișnuit. Aceasta permite gestionarea uniformă a sarcinilor de fundal fără verificări suplimentare ale versiunii Android.

kotlin
class UploadJobService : JobIntentService() {

    companion object {
        private const val JOB_ID = 1000

        fun enqueueWork(context: Context, work: Intent) {
            enqueueWork(
                context,
                UploadJobService::class.java,
                JOB_ID,
                work
            )
        }
    }

    override fun onHandleWork(intent: Intent) {
        val fileUri = intent.getStringExtra("file_uri")
        // Executat în thread-ul de fundal
        uploadFile(fileUri)
    }
}

Gestionarea memoriei și scurgeri în Service

Una dintre problemele frecvente în lucrul cu Background Service sunt scurgerile de memorie. Deoarece Service poate trăi mai mult decât Activity, referințele la Activity în interiorul Service (prin listener, callback sau broadcast) duc la imposibilitatea colectării gunoiului pentru componentele UI. Se recomandă utilizarea WeakReference, ViewModel sau LiveData pentru comunicarea Service cu UI. în onDestroy trebuie anulate toate abonamentele, oprite thread-urile și închiși cursorii.

Service vs WorkManager: când să alegem ce

Alegerea între Background Service și WorkManager depinde de scenariu. Service este potrivit pentru sarcini care trebuie executate imediat și continuu: redarea muzicii, înregistrarea audio, urmărirea GPS. WorkManager este mai bun pentru sarcini amânate, garantate: sincronizare, trimitere de analytics, încărcarea logurilor. WorkManager supraviețuiește repornirii dispozitivului, iar Service — nu. Service poate fi Foreground cu notificare, iar WorkManager lucrează silențios în fundal. În practică, dezvoltatorii combină ambele abordări: Foreground Service pentru sarcini critice ale utilizatorului și WorkManager pentru întreținerea în fundal.

Android 12 a introdus un flag android:foregroundServiceType care necesită specificarea tipului de serviciu: dataSync, camera, connectedDevice, location, mediaPlayback și altele. Specificarea incorectă a tipului duce la o excepție la lansare. Această practică face Background Service mai transparent pentru utilizator și sistem.

Exemplu de înregistrare a Service în AndroidManifest

Înregistrarea corectă a Service în manifest include atributele exported (accesibilitatea pentru aplicații externe), foregroundServiceType (tipul serviciului de fundal pe Android 12+) și permission. Pentru Bound Service, de asemenea, trebuie declarat android:permission="android.permission.BIND_JOB_SERVICE" pentru JobIntentService. Fără înregistrare în manifest, orice apelare startService sau bindService se va încheia cu o excepție, de aceea verificarea manifestului este primul pas în diagnosticarea problemelor cu Service.

întrebări frecvente

în ce thread rulează Service în mod implicit?

Service rulează în thread-ul principal (UI Thread) al aplicației. Orice operație de blocare în interiorul onStartCommand sau onHandleIntent trebuie mutată într-un thread separat sau corutină, altfel sistemul va apela ANR după 5 secunde.

Cu ce diferă IntentService de Service obișnuit?

IntentService — este un moștenitor al Service care creează automat un thread de lucru și procesează comenzile secvențial. După finalizarea ultimei sarcini, IntentService se oprește singur. începând cu Android 8, IntentService este considerat învechit în favoarea JobIntentService sau WorkManager.

Se poate lansa Service când aplicația este în fundal pe Android 12?

Lansarea Started Service din fundal pe Android 12 este interzisă. Excepție — Foreground Service cu foregroundServiceType declarat în manifest și o notificare validă. De asemenea, este permisă o pornire scurtă după primirea unui mesaj FCM de înaltă prioritate.

Cum să transmitem date din Service în Activity?

Există trei moduri: BroadcastReceiver cu broadcast local, mecanismul Messenger prin Handler și LiveData/Flow în arhitectura MVVM cu ViewModel partajat. Pentru Bound Service se utilizează IBinder cu apelarea directă a metodelor.

Ce se întâmplă la repornirea aplicației dacă Service funcționa?

Dacă Service a fost lansat cu flag-ul START_STICKY, sistemul îl va reporni după distrugerea procesului din cauza lipsei de memorie. Flag-ul START_NOT_STICKY înseamnă că sistemul nu va reporni serviciul. START_REDELIVER_INTENT este similar cu START_STICKY, dar transmite ultimul Intent.

Rezumat

  • Background Service — este o componentă Android pentru operații în fundal fără interfață, care rulează în thread-ul principal.
  • Trei tipuri — Started, Bound și Foreground — acoperă diferite scenarii: de la o sarcină unică până la lucrul continuu cu notificare.
  • Ciclul de viață include onCreate, onStartCommand, onBind și onDestroy — este important să eliberați resursele în onDestroy.
  • Foreground Service — singurul tip care funcționează stabil pe Android 8+ fără riscul de a fi ucis de sistem.
  • WorkManager și JobScheduler sunt preferabile pentru sarcini de fundal amânate și garantate.
  • Nu utilizați Service pentru sarcini care necesită sincronizare exactă a timpului — pentru aceasta există AlarmManager.
  • Înregistrați întotdeauna Service în AndroidManifest.xml și specificați android:foregroundServiceType pe Android 12+.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și