Foreground Service — је Android сервис који изводи дуготрајне операције пред очима корисника са обавезним обавештењем у статусној траци. За разлику од Background Service-а, који систем може зауставити при недостатку ресурса, Foreground Service добија висок приоритет и наставља рад чак и у условима ограничене меморије. Према документацији Android Developers, 2025, Foreground Service остаје једини поуздани начин за извршавање дуготрајних задатака на уређајима са Android 12 и новијим.
Главно
Foreground Service — је Android компонента намењена за извођење операција којих корисник постаје свестан и види их. Приказује стално обавештење у панелу обавештења које се не може одбацити — остаје активно док сервис ради. Ово је кључна разлика у односу на позадински сервис, који ради неприметно за корисника.
Android систем третира Foreground Service као критично важан процес. При недостатку RAM меморије, платформа прво зауставља Background Service, затим кеширане Activity, и тек у изузетним случајевима — Foreground Service. OOM Killer додељује таквом сервису ADJ ниво 2, што практично искључује његово принудно заустављање.
За покретање Foreground Service-а, програмер је дужан да позове метод startForeground() у року од неколико секунди након креирања сервиса, у супротном ће систем генерисати изузетак ForegroundServiceDidNotStartInTimeException. Ово је строги захтев платформе уведен да би се спречили недекларисани позадински задаци.
Механизам Foreground Service је уведен у Android 1.0 заједно са првим SDK-ом, али обавезно обавештење се појавило у Android 9 (API 28). До тада је сервис могао да ради у foreground-у без видљивог индикатора за корисника. Почевши од Android 9, Google је пооштрио захтеве: свака апликација која позива startForeground мора да обезбеди обавештење у року од 5 секунди након покретања сервиса.
У Android 12 (API 31) додата су ограничења за покретање Foreground Service-а из позадинског контекста — сада је за многе сценарије потребна дозвола FOREGROUND_SERVICE_SPECIAL_USE. Android 14 (API 34) увео је обавезно декларисање foregroundServiceType у манифесту, што је учинило архитектуру сервиса транспарентнијом и предвидљивијом.
Механизам рада Foreground Service-а се заснива на три кључне фазе: креирање сервиса, повезивање обавештења и извршавање задатка. Сервис наслеђује класу Service и преписује метод onStartCommand(), у којем се позива startForeground() са идентификатором и објектом Notification.
Након позива startForeground(), систем премешта процес сервиса у foreground групу са повишеним приоритетом преживљавања. То значи да ће Android настојати да одржи процес активним без обзира на оптерећење оперативне меморије. Foreground Service не може бити заустављен од стране система у нормалним условима — само корисничким одбацивањем обавештења или експлицитним позивом stopSelf().
Животни циклус Foreground Service-а се управља кроз методе onCreate(), onStartCommand() и onDestroy(). У onStartCommand() програмер дефинише стратегију поновног покретања сервиса након убијања процеса — константа START_STICKY приморава систем да поново креира сервис након обнављања ресурса, а START_NOT_STICKY спречава аутоматско поновно покретање.
Приликом покретања Foreground Service-а, кораци се извршавају секвенцијално: позив startService(), креирање објекта Service у onCreate(), обрада Intent-а у onStartCommand() и позив startForeground() са објектом Notification. Ако сервис већ ради и стигне нови Intent, поново се позива само onStartCommand() — метод onCreate() се извршава једном током постојања сервиса.
Завршавање Foreground Service-а се врши кроз stopForeground() са заставицом REMOVE_NOTIFICATION, која сакрива обавештење из статусне траке. Одмах након уклањања обавештења, систем може престати да сматра сервис foreground-ом и смањити његов приоритет на Background Service, што чини процес рањивим за заустављање.
PowerManager игра важну улогу у раду Foreground Service-а, јер режими штедње енергије Android-а (Doze, App Standby) могу ограничити његову способност извршавања задатака. Чак и у foreground статусу, сервис подлеже политикама батерије — мрежни захтеви могу бити одложени, а тајмери синхронизовани са Doze прозорима. За дуготрајне операције отпорне на кашњења, препоручује се коришћење Foreground Service-а у комбинацији са WorkManager-ом.
Почевши од Android 14 (API 34), Google је увео обавезно декларисање типа Foreground Service-а у манифесту. Сваки тип дефинише дозвољени сценарио коришћења — систем проверава усклађеност између декларисаног типа и стварног понашања сервиса. Укупно постоји 9 типова, али најчешће се користе следећи.
Тип dataSync је намењен за синхронизацију података између уређаја и сервера, пренос датотека и прављење резервних копија. Примери укључују отпремање фотографија у облак, синхронизацију базе података са Firebase-ом или слање логова на удаљени сервер. За овај тип је обавезно навођење образложења у манифесту кроз атрибут android:foregroundServiceType="dataSync".
Тип mediaPlayback се користи за репродукцију звука и видеа у позадини — музички плејери, клијенти за подкастове, видео плејери. То је једини тип који може радити неограничено дуго без интервенције корисника. Канал обавештења мора имати висок приоритет и приказивати елементе управљања репродукцијом — дугмад play, pause, next, prev кроз MediaStyle.
Тип location је намењен за геолокацијске сервисе — навигационе апликације, праћење активности, геозоне. За Android 14+ потребно је декларисати дозволу FOREGROUND_SERVICE_LOCATION и навести тип у манифесту. Апликација мора имати активну дозволу за приступ локацији у runtime-у, иначе ће систем одбити покретање сервиса.
| Тип | Дозвола | Пример коришћења |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Синхронизација датотека са облаком |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Музички плејер у позадини |
| location | FOREGROUND_SERVICE_LOCATION | GPS навигатор током вожње |
| camera | FOREGROUND_SERVICE_CAMERA | Апликација за видео надзор |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | Рад са BLE уређајем |
Кључна разлика између Foreground и Background Service-а — присуство видљивог обавештења и приоритет преживљавања. Background Service може бити заустављен од стране система у било ком тренутку при недостатку меморије, док Foreground Service одржава рад захваљујући повишеном adj нивоу процеса у механизму Low Memory Killer Android-а.
Background Service не захтева обавештење и може радити неприметно за корисника. Међутим, почевши од Android 8 (API 26), Google је значајно ограничио позадинске сервисе: startService() из позадинског контекста више не ради, а Context.startForegroundService() је постао обавезан за покретање било ког сервиса који планира да пређе у foreground. Систем је такође увео Background Execution Limits — тајмер (сада 10 минута) након којег се Background Service принудно зауставља.
Foreground Service, напротив, нема ограничење времена извршавања. Сервис може радити сатима или данима — док га корисник експлицитно не заустави или не поново покрене уређај. То чини Foreground Service оптималним избором за апликације којима је потребан непрекидан позадински рад: музички плејери, тракери активности, апликације за VoIP позиве.
| Параметар | Foreground Service | Background Service |
|---|---|---|
| Обавештење | Обавезно | Није потребно |
| Време живота | Без ограничења | До 10 минута (API 26+) |
| Приоритет система | Висок (ADJ 2) | Низак (ADJ 8+) |
| API 26+ покретање | startForegroundService() | Забрањено из позадине |
Почевши од Android 12 (API 31), Google је увео значајна ограничења за покретање Foreground Service-а. Главна измена — забрана позивања startForegroundService() из позадинског контекста за већину типова сервиса. Изузеци су само случајеви када је корисник изричито дао сагласност (на пример, кроз дозволу FOREGROUND_SERVICE_SPECIAL_USE) или се сервис покреће као одговор на емитовану намеру BOOT_COMPLETED.
Манифест апликације са циљаним API 34+ мора садржати блок foregroundServiceType за сваки декларисани сервис. На пример, за сервис синхронизације података наводи се android:foregroundServiceType="dataSync". Ако тип није наведен, систем сматра сервис неважећим и баца изузетак MissingForegroundServiceTypeException при покушају покретања. Google Play такође проверава усклађеност типова и може одбити објављивање приликом неусклађености.
У Android 14 (API 34) сваком типу Foreground Service-а одговара посебна дозвола. Програмер мора да их декларише у манифесту и затражи у runtime-у пре покретања сервиса. За dataSync је потребна FOREGROUND_SERVICE_DATA_SYNC, за mediaPlayback — FOREGROUND_SERVICE_MEDIA_PLAYBACK. Корисник може опозвати дозволу у подешавањима, што ће довести до заустављања активног сервиса.
Google је такође увео механизам Foreground Service Notification Timeout у Android 14: ако сервис не позове startForeground() у року од 10 секунди након креирања, систем генерише изузетак. Ово пооштравање је усмерено на борбу против апликација које одлажу или прескачу позив обавештења, заправо радећи као Background Service под видом foreground-а.
Foreground Service се користи у широком спектру задатака који захтевају гарантовано извршавање у позадини. Најчешћи сценарији укључују репродукцију медија, праћење геолокације, синхронизацију података и рад са периферним уређајима. Размотримо сваки од њих детаљно.
Класичан пример — музички плејер који наставља репродукцију након минимизирања апликације. Сервис се покреће са MediaStyle обавештењем, дугмадима за управљање и користи тип mediaPlayback. Корисник види информације о песми у статусној траци и може управљати репродукцијом без отварања апликације.
Навигационе апликације користе Foreground Service типа location за стално праћење координата. Сервис приказује обавештење са тренутном брзином, временом путовања и дугметом за заустављање праћења. Без Foreground Service-а, систем би зауставио добијање координата у позадини након неколико минута, што би онемогућило навигацију.
Апликације за гласовне и видео позиве — VoIP клијенти — користе Foreground Service за одржавање активне везе. Сервис типа phoneCall (од Android 14) гарантује да се позив неће прекинути при минимизирању апликације. Обавештење приказује трајање позива и елементе за управљање микрофоном и звучником.
Размотримо креирање Foreground Service-а у Kotlin-у за синхронизацију података. Сервис ће се покретати из Activity-ја, приказивати обавештење са напретком и коректно се завршити након завршетка рада. Пример демонстрира све обавезне елементе: декларацију у манифесту, канал обавештења, позив startForeground() и обраду foregroundServiceType.
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,
"Синхронизација",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Канал за синхронизацију података"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Синхронизација")
.setContentText("Отпремање података на сервер")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Емулација синхронизације
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
За исправан рад сервиса на Android 12+ потребно је декларисати Foreground Service у AndroidManifest.xml са навођењем типа и потребних дозвола. Атрибут foregroundServiceType је обавезан за циљани API 34+, а дозволе FOREGROUND_SERVICE_DATA_SYNC и POST_NOTIFICATIONS морају бити затражене у runtime-у.
<!-- 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>
Упркос високој поузданости, Foreground Service има ограничења. Главно од њих — видљивост за корисника. Апликација не може да извршава дуготрајне задатке у позадини без обавештења, што није увек прихватљиво са становишта UX. Поред тога, систем може принудно зауставити чак и Foreground Service при прекорачењу временског ограничења за неке типове — на пример, dataSync је ограничен на неколико сати рада.
Алтернатива Foreground Service-у је WorkManager — библиотека Android Jetpack за одложене и позадинске задатке. WorkManager гарантује извршење задатка чак и након поновног покретања уређаја и подржава ланце задатака, периодичне операције и ограничења мреже и батерије. За већину позадинских операција Google препоручује управо WorkManager, а не директни сервис.
JobScheduler — уграђени Android API за планирање задатака. Погодан је за операције које могу бити одложене: синхронизација преко Wi-Fi-ја, преузимање података при повезивању пуњача. JobScheduler обједињује задатке у прозоре ради уштеде батерије, за разлику од Foreground Service-а који ради непрекидно без обзира на стање уштеде енергије.
За кратке задатке (до 10–15 секунди) може се користити CoroutineWorker из WorkManager-а са кашњењем извршења. Ако задатак мора бити извршен тачно у одређено време, користи се AlarmManager заједно са BroadcastReceiver-ом. Дакле, Foreground Service је решење за дуготрајне непрекидне операције, а не универзални алат за све позадинске сценарије.
Често постављана питања
Foreground Service — је Android сервис са сталним обавештењем у статусној траци који извршава дуготрајне задатке пред очима корисника. Има висок приоритет преживљавања и не зауставља га систем при недостатку меморије, за разлику од Background Service-а.
Foreground Service приказује обавезно обавештење, нема ограничење времена рада и заштићен је од заустављања од стране система. Background Service је невидљив за корисника, ради до 10 минута (API 26+) и може бити заустављен од стране Low Memory Killer-а у било ком тренутку.
Android 14 дефинише 9 типова: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health и remoteMessaging. Сваки тип захтева одговарајућу дозволу и навођење у манифесту кроз атрибут foregroundServiceType.
Ако сервис не позове startForeground() у року од 10 секунди након креирања (Android 14), систем генерише изузетак ForegroundServiceDidNotStartInTimeException и принудно зауставља сервис. Апликација такође добија ANR (Application Not Responding) ако се операција извршава на главној нити.
Не, сакривање обавештења Foreground Service-а програмски није могуће. Почевши од Android 9 (API 28), обавештење је обавезно и не може га одбацити корисник. Једини начин да се уклони је заустављање сервиса позивом stopForeground(REMOVE_NOTIFICATION) и stopSelf().
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође