Foreground Service — egy Android szolgáltatás, amely hosszú távú műveleteket hajt végre a felhasználó szeme előtt, kötelező értesítéssel az állapotsorban. Ellentétben a Background Service-szel, amelyet a rendszer erőforráshiány esetén leállíthat, a Foreground Service magas prioritást kap, és korlátozott memória mellett is folytatja a munkát. A Android Developers, 2025 dokumentációja szerint a Foreground Service marad az egyetlen megbízható módja a hosszú távú feladatok végrehajtásának Android 12 és újabb rendszerű eszközökön.
Főbb pontok
Foreground Service — egy Android komponens, amely olyan műveletek végrehajtására szolgál, amelyeket a felhasználó érzékel és lát. Állandó értesítést jelenít meg az értesítési panelen, amely nem távolítható el — addig marad aktív, amíg a szolgáltatás fut. Ez a fő különbség a háttérszolgáltatáshoz képest, amely észrevétlenül működik a felhasználó számára.
Az Android rendszer a Foreground Service-t kritikus fontosságú folyamatként kezeli. RAM hiány esetén a platform először a Background Service-t állítja le, majd a gyorsítótárazott Activity-ket, és csak kivételes esetekben — a Foreground Service-t. Az OOM Killer egy ilyen szolgáltatáshoz ADJ szint 2-t rendel, ami gyakorlatilag kizárja annak kényszerített leállítását.
A Foreground Service elindításához a fejlesztő köteles meghívni a startForeground() metódust néhány másodpercen belül a szolgáltatás létrehozása után, ellenkező esetben a rendszer ForegroundServiceDidNotStartInTimeException kivételt generál. Ez a platform szigorú követelménye, amelyet a nem deklarált háttérfeladatok megakadályozására vezettek be.
A Foreground Service mechanizmus az Android 1.0-ban került bevezetésre az első SDK-val együtt, de a kötelező értesítés az Android 9-ben (API 28) jelent meg. Addig a szolgáltatás a foreground-ban működhetett a felhasználó számára látható jelző nélkül. Az Android 9-től kezdve a Google szigorította a követelményeket: minden alkalmazás, amely meghívja a startForeground-ot, köteles értesítést biztosítani 5 másodpercen belül a szolgáltatás elindítása után.
Az Android 12-ben (API 31) korlátozásokat vezettek be a Foreground Service háttérkontextusból történő indítására — most számos forgatókönyvhöz szükséges a FOREGROUND_SERVICE_SPECIAL_USE engedély. Az Android 14 (API 34) bevezette a foregroundServiceType kötelező deklarálását a manifestben, ami átláthatóbbá és kiszámíthatóbbá tette a szolgáltatások architektúráját.
Működési mechanizmusa a Foreground Service-nek három kulcsfontosságú szakaszon alapul: a szolgáltatás létrehozása, az értesítés csatolása és a feladat végrehajtása. A szolgáltatás a Service osztályból származik, és felülírja az onStartCommand() metódust, amelyben az startForeground() meghívásra kerül egy azonosítóval és a Notification objektummal.
A startForeground() meghívása után a rendszer áthelyezi a szolgáltatás folyamatát a foreground csoportba magasabb túlélési prioritással. Ez azt jelenti, hogy az Android megpróbálja a folyamatot aktívan tartani, függetlenül az operatív memória terhelésétől. A Foreground Service normál körülmények között nem állítható le a rendszer által — csak a felhasználó értesítés eltávolításával vagy a stopSelf() explicit meghívásával.
A Foreground Service életciklusa az onCreate(), onStartCommand() és onDestroy() metódusokon keresztül történik. Az onStartCommand()-ben a fejlesztő határozza meg a szolgáltatás újraindítási stratégiáját a folyamat leállítása után — a START_STICKY konstans arra kényszeríti a rendszert, hogy az erőforrások helyreállítása után újra létrehozza a szolgáltatást, míg a START_NOT_STICKY megakadályozza az automatikus újraindítást.
A Foreground Service indításakor a lépések egymás után történnek: a startService() meghívása, a Service objektum létrehozása az onCreate()-ben, az Intent feldolgozása az onStartCommand()-ben és a startForeground() meghívása a Notification objektummal. Ha a szolgáltatás már fut, és új Intent érkezik, csak az onStartCommand() kerül újra meghívásra — az onCreate() metódus egyszer hajtódik végre a szolgáltatás fennállása alatt.
A Foreground Service befejezése a stopForeground()-ön keresztül történik a REMOVE_NOTIFICATION jelzővel, amely elrejti az értesítést az állapotsorból. Közvetlenül az értesítés eltávolítása után a rendszer megszüntetheti a szolgáltatás foreground-nak tekintését, és csökkentheti a prioritását Background Service-re, ami a folyamatot sebezhetővé teszi a leállítással szemben.
PowerManager fontos szerepet játszik a Foreground Service működésében, mivel az Android energiatakarékos módjai (Doze, App Standby) korlátozhatják a feladatok végrehajtási képességét. Még foreground állapotban is a szolgáltatás az akkumulátor politikák alá tartozik — a hálózati kérések késleltethetők, az időzítők pedig a Doze ablakokkal szinkronizálhatók. A késésekkel szemben ellenálló hosszú távú műveletekhez ajánlott a Foreground Service használata a WorkManager-rel kombinálva.
Android 14-től (API 34) kezdve a Google bevezette a Foreground Service típusának kötelező deklarálását a manifestben. Minden típus meghatározza a megengedett használati forgatókönyvet — a rendszer ellenőrzi a deklarált típus és a szolgáltatás tényleges viselkedése közötti megfelelést. Összesen 9 típus létezik, de a leggyakrabban használtak a következők.
A dataSync típus az eszköz és a szerver közötti adatszinkronizálásra, fájlátvitelre és biztonsági mentésre szolgál. Példák közé tartozik a fényképek felhőtárhelyre történő feltöltése, az adatbázis Firebase-szel való szinkronizálása vagy a naplók távoli szerverre küldése. Ehhez a típushoz kötelező az indoklás megadása a manifestben az android:foregroundServiceType="dataSync" attribútumon keresztül.
A mediaPlayback típus audio és video háttérben történő lejátszására szolgál — zenelejátszók, podcast kliensek, videolejátszók. Ez az egyetlen típus, amely határozatlan ideig működhet a felhasználó beavatkozása nélkül. Az értesítési csatornának magas prioritással kell rendelkeznie, és meg kell jelenítenie a lejátszás vezérlőelemeit — play, pause, next, prev gombokat a MediaStyle-on keresztül.
A location típus a geolokációs szolgáltatásokhoz készült — navigációs alkalmazások, tevékenységkövetés, geokerületek. Android 14+ esetén deklarálni kell a FOREGROUND_SERVICE_LOCATION engedélyt, és meg kell adni a típust a manifestben. Az alkalmazásnak aktív futásidejű engedéllyel kell rendelkeznie a helymeghatározáshoz, ellenkező esetben a rendszer elutasítja a szolgáltatás elindítását.
| Típus | Engedély | Használati példa |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Fájlok szinkronizálása a felhővel |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Zenelejátszó a háttérben |
| location | FOREGROUND_SERVICE_LOCATION | GPS navigátor vezetés közben |
| camera | FOREGROUND_SERVICE_CAMERA | Videómegfigyelő alkalmazás |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | Munka BLE eszközzel |
Fő különbség a Foreground és Background Service között — a látható értesítés jelenléte és a túlélési prioritás. A Background Service bármikor leállítható a rendszer által memóriahiány esetén, míg a Foreground Service a megnövelt folyamat adj szintjének köszönhetően az Android Low Memory Killer mechanizmusában fenntartja a működését.
A Background Service nem igényel értesítést, és észrevétlenül működhet a felhasználó számára. Az Android 8-tól (API 26) kezdve azonban a Google jelentősen korlátozta a háttérszolgáltatásokat: a startService() háttérkontextusból már nem működik, és a Context.startForegroundService() kötelezővé vált bármely olyan szolgáltatás elindításához, amely a foreground-ba kíván lépni. A rendszer bevezette a Background Execution Limits-et is — egy időzítőt (jelenleg 10 perc), amely után a Background Service kényszerítetten leáll.
A Foreground Service ezzel szemben nem rendelkezik végrehajtási időkorláttal. A szolgáltatás órákig vagy napokig működhet — amíg a felhasználó explicit módon le nem állítja, vagy újra nem indítja az eszközt. Ez teszi a Foreground Service-t az optimális választássá a folyamatos háttérmunkát igénylő alkalmazások számára: zenelejátszók, tevékenységkövetők, VoIP hívó alkalmazások.
| Paraméter | Foreground Service | Background Service |
|---|---|---|
| Értesítés | Kötelező | Nem szükséges |
| Élettartam | Korlátlan | Akár 10 perc (API 26+) |
| Rendszer prioritás | Magas (ADJ 2) | Alacsony (ADJ 8+) |
| API 26+ indítás | startForegroundService() | Tilos háttérből |
Android 12-től (API 31) kezdve a Google jelentős korlátozásokat vezetett be a Foreground Service indítására. A fő változás — a startForegroundService() háttérkontextusból történő meghívásának tilalma a legtöbb szolgáltatástípus esetében. Kivételt csak azok az esetek képeznek, amikor a felhasználó kifejezetten hozzájárult (például a FOREGROUND_SERVICE_SPECIAL_USE engedélyen keresztül), vagy a szolgáltatás a BOOT_COMPLETED broadcast szándékra válaszul indul.
A cél API 34+ rendelkező alkalmazás manifestjének tartalmaznia kell a foregroundServiceType blokkot minden deklarált szolgáltatáshoz. Például az adatszinkronizáló szolgáltatás esetében android:foregroundServiceType="dataSync" kerül megadásra. Ha a típus nincs megadva, a rendszer érvénytelennek tekinti a szolgáltatást, és MissingForegroundServiceTypeException kivételt dob az indítási kísérletnél. A Google Play szintén ellenőrzi a típusok megfelelését, és elutasíthatja a közzétételt, ha azok nem egyeznek.
Az Android 14-ben (API 34) minden Foreground Service típushoz külön engedély tartozik. A fejlesztőnek deklarálnia kell azokat a manifestben, és kérnie kell futásidőben a szolgáltatás elindítása előtt. A dataSync esetében FOREGROUND_SERVICE_DATA_SYNC, a mediaPlayback esetében FOREGROUND_SERVICE_MEDIA_PLAYBACK szükséges. A felhasználó visszavonhatja az engedélyt a beállításokban, ami az aktív szolgáltatás leállításához vezet.
A Google bevezette a Foreground Service Notification Timeout mechanizmust is az Android 14-ben: ha a szolgáltatás nem hívja meg a startForeground()-ot 10 másodpercen belül a létrehozás után, a rendszer kivételt generál. Ez a szigorítás azokra az alkalmazásokra irányul, amelyek késleltetik vagy kihagyják az értesítés meghívását, és valójában Background Service-ként működnek a foreground leple alatt.
Foreground Service széles körű olyan feladatokban használatos, amelyek garantált végrehajtást igényelnek a háttérben. A leggyakoribb forgatókönyvek közé tartozik a média lejátszása, a geolokáció követése, az adatszinkronizálás és a perifériás eszközökkel való munka. Vizsgáljuk meg mindegyiket részletesen.
Klasszikus példa — zenelejátszó, amely az alkalmazás minimalizálása után is folytatja a lejátszást. A szolgáltatás MediaStyle értesítéssel, vezérlőgombokkal indul, és a mediaPlayback típust használja. A felhasználó az állapotsorban látja a dal információit, és az alkalmazás megnyitása nélkül vezérelheti a lejátszást.
Navigációs alkalmazások a location típusú Foreground Service-t használják a koordináták folyamatos követésére. A szolgáltatás értesítést jelenít meg az aktuális sebességgel, utazási idővel és a követés leállításának gombjával. Foreground Service nélkül a rendszer néhány perc múlva leállítaná a koordináták lekérését a háttérben, ami lehetetlenné tenné a navigációt.
Hang- és videohívás alkalmazások — VoIP kliensek — a Foreground Service-t használják az aktív kapcsolat fenntartására. A phoneCall típusú szolgáltatás (Android 14-től) garantálja, hogy a hívás nem szakad meg az alkalmazás minimalizálásakor. Az értesítés megjeleníti a hívás időtartamát, valamint a mikrofon és hangszóró vezérlőelemeit.
Vizsgáljuk meg a Foreground Service létrehozását Kotlinban adatszinkronizáláshoz. A szolgáltatás Activity-ből indul, értesítést jelenít meg a haladással, és a munka befejezése után helyesen fejeződik be. A példa bemutatja az összes kötelező elemet: deklarálást a manifestben, értesítési csatornát, a startForeground() meghívását és a foregroundServiceType kezelését.
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"Szinkronizálás",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Adatszinkronizálási csatorna"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Szinkronizálás")
.setContentText("Adatok feltöltése a szerverre")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Szinkronizálás emulálása
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
A szolgáltatás helyes működéséhez Android 12+ rendszeren deklarálni kell a Foreground Service-t az AndroidManifest.xml-ben a típus és a szükséges engedélyek megadásával. A foregroundServiceType attribútum kötelező a cél API 34+ számára, a FOREGROUND_SERVICE_DATA_SYNC és POST_NOTIFICATIONS engedélyeket pedig futásidőben kell kérni.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
A magas megbízhatóság ellenére a Foreground Service-nek vannak korlátozásai. A fő közülük a láthatóság a felhasználó számára. Az alkalmazás nem végezhet hosszú távú feladatokat a háttérben értesítés nélkül, ami UX szempontból nem mindig elfogadható. Ezenkívül a rendszer kényszerítetten leállíthatja még a Foreground Service-t is, ha bizonyos típusok időkorlátja túllépésre kerül — például a dataSync néhány órányi működésre korlátozódik.
Alternatíva a Foreground Service helyett a WorkManager — az Android Jetpack könyvtár elhalasztott és háttérfeladatokhoz. A WorkManager garantálja a feladat végrehajtását még az eszköz újraindítása után is, és támogatja a feladatláncokat, időszakos műveleteket, valamint hálózati és akkumulátor korlátozásokat. A legtöbb háttérművelethez a Google éppen a WorkManager-t ajánlja, nem egy közvetlen szolgáltatást.
JobScheduler — az Androidba beépített API a feladatok ütemezésére. Alkalmas olyan műveletekhez, amelyek elhalaszthatók: szinkronizálás Wi-Fi-n keresztül, adatok letöltése a töltő csatlakoztatásakor. A JobScheduler ablakokba csoportosítja a feladatokat az akkumulátor kímélése érdekében, ellentétben a Foreground Service-szel, amely megszakítás nélkül működik, függetlenül az energiatakarékossági állapottól.
Rövid feladatokhoz (10-15 másodpercig) használható a CoroutineWorker a WorkManager-ből végrehajtási késleltetéssel. Ha egy feladatot pontosan meghatározott időben kell végrehajtani, az AlarmManager használatos a BroadcastReceiver-rel együtt. Így a Foreground Service egy megoldás hosszú távú folyamatos műveletekhez, nem pedig univerzális eszköz az összes háttérforgatókönyvhöz.
Gyakran ismételt kérdések
Foreground Service — egy Android szolgáltatás állandó értesítéssel az állapotsorban, amely hosszú távú feladatokat hajt végre a felhasználó szeme előtt. Magas túlélési prioritással rendelkezik, és nem állítja le a rendszer memóriahiány esetén, ellentétben a Background Service-szel.
Foreground Service kötelező értesítést jelenít meg, nincs munkaidő korlátozása, és védett a rendszer általi leállítástól. Background Service láthatatlan a felhasználó számára, legfeljebb 10 percig működik (API 26+), és bármikor leállíthatja a Low Memory Killer.
Az Android 14 9 típust határoz meg: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health és remoteMessaging. Minden típus megfelelő engedélyt és a manifestben történő megadást igényel a foregroundServiceType attribútumon keresztül.
Ha a szolgáltatás nem hívja meg a startForeground()-ot 10 másodpercen belül a létrehozás után (Android 14), a rendszer ForegroundServiceDidNotStartInTimeException kivételt generál, és kényszerítetten leállítja a szolgáltatást. Az alkalmazás ANR-t (Application Not Responding) is kap, ha a művelet a fő szálon fut.
Nem, a Foreground Service értesítésének programozott elrejtése lehetetlen. Az Android 9-től (API 28) kezdve az értesítés kötelező, és nem távolítható el a felhasználó által. Az egyetlen módja annak eltávolítására a szolgáltatás leállítása a stopForeground(REMOVE_NOTIFICATION) és a stopSelf() meghívásával.
Összefoglalás
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