Background Service — egy Android komponens, amely hosszú ideig tartó műveletek háttérben történő végrehajtására szolgál felhasználói felület nélkül. Az Activity-től eltérően a Service akkor is tovább működik, miután az alkalmazást minimalizálták vagy a felhasználó másik alkalmazásra váltott. A Android Developers, 2026 szerint három típusú szolgáltatás létezik: Started Service, Bound Service és Foreground Service, mindegyik saját életciklussal és alkalmazási területtel.
Főbb pontok
Background Service (vagy egyszerűen Service) — az Activity, BroadcastReceiver és ContentProvider mellett az Android alkalmazás négy fő komponensének egyike. Az Activity-től eltérően a Service nem rendelkezik vizuális felülettel és olyan műveletek végrehajtására szolgál, amelyeknek folytatódniuk kell függetlenül attól, hogy az alkalmazás az előtérben van-e vagy sem.
A Service az alkalmazás fő szálán (main thread) fut, ezért minden blokkoló művelet benne külön szál létrehozását igényli. Ha ez nem történik meg, a rendszer ANR (Application Not Responding)-et hív. Az egyszerű háttérműveletekhez az Android IntentService-t biztosít, amely automatikusan létrehoz egy munka szálat. Modern projektekben ajánlott a Kotlin-korutinok használata CoroutineScope-pal a Service-ben aszinkron feldolgozáshoz a fő szál blokkolása nélkül.
A Service fő célja — zenelejátszás, fájlok letöltése, hálózati kérések kezelése, adatok szinkronizálása és egyéb feladatok, amelyeknek a felhasználó távozása után is folytatódniuk kell. Az Android 8 megjelenésével azonban a fejlesztőknek tudatosan kell választaniuk a szolgáltatástípusok között, figyelembe véve a háttérmunka korlátozásait.
Service saját életciklussal rendelkezik, amely eltér az Activity-től. Négy kulcsfontosságú metódust foglal magában: onCreate, onStartCommand, onBind és onDestroy. Ennek a ciklusnak a megértése elengedhetetlen a háttérfeladatok helyes megvalósításához memóriaszivárgás nélkül.
Az onCreate metódust a szolgáltatás létrehozásakor hívja meg, egyszer az élettartama alatt. Ebben inicializálódnak az erőforrások: időzítők, adatbázis kapcsolatok, socketek. Az onStartCommand metódust minden alkalommal meghívja, amikor a startService-t hívják, ami lehetővé teszi parancsok küldését a már futó szolgáltatásnak. A visszatérési érték határozza meg a rendszer viselkedését óraindításkor.
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
}
Az onBind a szolgáltatás bindService-en keresztüli kötésekor hívódik meg és egy IBinder objektumot ad vissza az ügyféllel való interakcióhoz. Ezt a metódust csak Bound Service esetén használják. Az onDestroy — az utolsó hívás a szolgáltatás megsemmisítése előtt. Ebben felszabadulnak az összes erőforrások, leállítódnak a szálak és törlődnek a feladatok.
Android három típusú Service-t kínál, mindegyik a saját forgatókönyvéhez tervezve. A rossz típus kiválasztása az alkalmazás instabil működéséhez vagy az akkumulátor túlzott fogyasztásához vezethet.
Started Service a startService hívással indul és addig működik, amíg a stopSelf vagy stopService hívásra nem kerül sor. Alkalmas olyan feladatokra, amelyeket azonnal végre kell hajtani: analitika küldése, képfeldolgozás, egyetlen fájl letöltése. A munka befejezése után a szolgáltatás magától leáll.
Bound Service kliens-szerver interfészt biztosít, lehetővé téve az Activity, Fragment vagy más komponens számára a szolgáltatással való interakciót. A szolgáltatás addig él, amíg legalább egy kapcsolódó kliens létezik. Amikor az összes kliens lecsatlakozik, a szolgáltatás megsemmisül. A Bound Service kényelmes kétirányú kommunikációt igénylő feladatokhoz: zenelejátszó, navigáció.
Foreground Service — egy Started Service állandó értesítéssel az állapotsorban. A rendszer az ilyen szolgáltatást aktívnak tekinti és nem öli meg, még memóriahiány esetén sem. A Foreground Service kötelező zenelejátszáshoz, hangfelvételhez, helymeghatározáshoz és más, a felhasználó számára fontos feladatokhoz.
| Paraméter | Started | Bound | Foreground |
|---|---|---|---|
| Indítás | startService | bindService | startForeground |
| Élettartam | stopSelf-ig | amíg vannak kliensek | stopForeground-ig |
| Értesítés | nem | nem | kötelező |
| Megölve | igen | igen | nem |
| Példa | letöltés | lejátszó | zene |
Létrehozás a szolgáltatás egy Service-ből származó osztály deklarálásával és annak AndroidManifest.xml-ben történő regisztrálásával kezdődik. A manifestben való regisztráció nélkül a rendszer nem tudja elindítani a szolgáltatást, és bármely startService hívás kivételhez vezet.
// Regisztrálás az AndroidManifest.xml-ben
@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
}
}
A szolgáltatás Activity-ből vagy Fragment-ből történő elindításához Intent-et használnak a szolgáltatás osztályának explicit megadásával. Android 8-tól kezdve a Foreground Service-hez FOREGROUND_SERVICE engedély szükséges a manifestben.
// Started Service indítása
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Foreground Service indítása (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Android 8-tól (API 26) a Google szigorú korlátozásokat vezetett be a háttérszolgáltatásokra. A Service háttérben történő elindítása (amikor az alkalmazás nincs az előtérben) csak kivételes esetekben engedélyezett: push értesítés fogadásakor, az eszköz betöltése után vagy JobScheduler-en keresztül.
A hosszú ideig tartó feladatokhoz, amelyek nem igényelnek azonnali végrehajtást, ajánlott a WorkManager vagy JobScheduler használata. Ha az alkalmazásnak valóban szüksége van egy futó szolgáltatásra, az egyetlen mód a Foreground Service a felhasználó által látott értesítéssel. A szolgáltatás értesítés nélküli háttérben történő elindítását a rendszer figyelmen kívül hagyja.
JobIntentService — egy speciális osztály, amely a support library-ben jelent meg az Android 5+-on való munkához. Ötvözi az IntentService viselkedését (automatikus munka szál, szekvenciális feldolgozás) a JobScheduler-en keresztüli ütemezéssel. Android 8+-on a JobIntentService a JobScheduler-t használja a motorháztető alatt, régebbi verziókon pedig a szokásos Service-t. Ez lehetővé teszi a háttérfeladatok egységes kezelését az Android verzió további ellenőrzése nélkül.
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")
// Háttérszálon végrehajtva
uploadFile(fileUri)
}
}
A Background Service-szel való munka során gyakori probléma a memóriaszivárgás. Mivel a Service tovább élhet, mint az Activity, az Activity-re való hivatkozások a Service-ben (listener, callback vagy broadcast útján) a szemétgyűjtő képtelenségéhez vezetnek az UI komponensek számára. Ajánlott a WeakReference, ViewModel vagy LiveData használata a Service és az UI közötti kommunikációhoz. Az onDestroy-ben feltétlenül le kell mondani az összes feliratkozást, le kell állítani a szálakat és be kell zárni a kurzorokat.
A Background Service és a WorkManager közötti választás a forgatókönyvtől függ. A Service alkalmas olyan feladatokra, amelyeket azonnal és folyamatosan kell végrehajtani: zenelejátszás, hangfelvétel, GPS követés. A WorkManager jobb a késleltetett, garantált feladatokhoz: szinkronizálás, analitika küldése, naplók feltöltése. A WorkManager túléli az eszköz óraindítását, a Service viszont nem. A Service lehet Foreground értesítéssel, míg a WorkManager csendben dolgozik a háttérben. A gyakorlatban a fejlesztők mindkét megközelítést kombinálják: Foreground Service a kritikus felhasználói feladatokhoz és WorkManager a háttérkarbantartáshoz.
Az Android 12 bevezette a android:foregroundServiceType jelzőt, amely megköveteli a szolgáltatás típusának megadását: dataSync, camera, connectedDevice, location, mediaPlayback és mások. A típus helytelen megadása kivételhez vezet az indításkor. Ez a gyakorlat átláthatóbbá teszi a Background Service-t a felhasználó és a rendszer számára.
A Service helyes regisztrálása a manifestben tartalmazza az exported (külső alkalmazások számára való elérhetőség), foregroundServiceType (háttérszolgáltatás típusa Android 12+-on) és permission attribútumokat. A Bound Service esetében szintén deklarálni kell a android:permission="android.permission.BIND_JOB_SERVICE"-t a JobIntentService számára. A manifestben való regisztráció nélkül bármely startService vagy bindService hívás kivétellel ér véget, ezért a manifest ellenőrzése az első lépés a Service-szel kapcsolatos problémák diagnosztizálásában.
Gyakran ismételt kérdések
Service az alkalmazás fő szálán (UI Thread) fut. Bármely blokkoló műveletet az onStartCommand vagy onHandleIntent belsejében külön szálra vagy korutinba kell helyezni, különben a rendszer 5 másodperc után ANR-t hív.
IntentService — a Service örököse, amely automatikusan létrehoz egy munka szálat és szekvenciálisan dolgozza fel a parancsokat. Az utolsó feladat befejezése után az IntentService magától leáll. Android 8-tól az IntentService elavultnak számít a JobIntentService vagy WorkManager javára.
A Started Service elindítása a háttérből Android 12-n tilos. Kivétel — a manifestben deklarált foregroundServiceType-tel és érvényes értesítéssel rendelkező Foreground Service. Szintén engedélyezett a rövid indítás magas prioritású FCM üzenet fogadása után.
Három mód létezik: BroadcastReceiver helyi broadcast-tal, Messenger mechanizmus Handler-en keresztül, és LiveData/Flow az MVVM architektúrában megosztott ViewModel-lel. Bound Service esetén IBinder-t használnak a metódusok közvetlen hívásával.
Ha a Service a START_STICKY jelzővel lett elindítva, a rendszer óraindítja a folyamat megsemmisítése után memóriahiány miatt. A START_NOT_STICKY jelző azt jelenti, hogy a rendszer nem indítja újra a szolgáltatást. A START_REDELIVER_INTENT hasonló a START_STICKY-hoz, de továbbítja az utolsó Intent-et.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is