Foreground Service — to usługa Androida wykonująca długotrwałe operacje na widoku użytkownika z obowiązkowym powiadomieniem na pasku statusu. W przeciwieństwie do Background Service, który system może zatrzymać przy braku zasobów, Foreground Service otrzymuje wysoki priorytet i kontynuuje działanie nawet w warunkach ograniczonej pamięci. Według dokumentacji Android Developers, 2025, Foreground Service pozostaje jedynym niezawodnym sposobem wykonywania długotrwałych zadań na urządzeniach z systemem Android 12 i nowszym.
Najważniejsze
Foreground Service — to komponent Androida przeznaczony do wykonywania operacji, które użytkownik uświadamia sobie i widzi. Wyświetla stałe powiadomienie w panelu powiadomień, którego nie można przesunąć — pozostaje aktywne, dopóki usługa działa. To kluczowa różnica w stosunku do usługi działającej w tle, która działa niezauważalnie dla użytkownika.
System Android traktuje Foreground Service jako krytycznie ważny proces. Przy braku pamięci RAM platforma w pierwszej kolejności kończy Background Service, następnie zapisane w pamięci podręcznej Activity, a dopiero w wyjątkowych przypadkach — Foreground Service. OOM Killer przypisuje takiej usłudze poziom ADJ 2, co praktycznie wyklucza jej wymuszone zakończenie.
Aby uruchomić Foreground Service, programista jest zobowiązany wywołać metodę startForeground() w ciągu kilku sekund po utworzeniu usługi, w przeciwnym razie system wygeneruje wyjątek ForegroundServiceDidNotStartInTimeException. To rygorystyczny wymóg platformy wprowadzony, aby zapobiec niezadeklarowanym zadaniom w tle.
Mechanizm Foreground Service został wprowadzony w Android 1.0 wraz z pierwszym SDK, ale obowiązkowe powiadomienie pojawiło się w Android 9 (API 28). Do tego czasu usługa mogła działać na pierwszym planie bez widocznego dla użytkownika wskaźnika. Od Androida 9 Google zaostrzyła wymagania: każda aplikacja wywołująca startForeground musi dostarczyć powiadomienie w ciągu 5 sekund po uruchomieniu usługi.
W Android 12 (API 31) dodano ograniczenia uruchamiania Foreground Service z kontekstu tła — teraz wymagane jest zezwolenie FOREGROUND_SERVICE_SPECIAL_USE dla wielu scenariuszy. Android 14 (API 34) wprowadził obowiązkowe deklarowanie foregroundServiceType w manifeście, co uczyniło architekturę usług bardziej przejrzystą i przewidywalną.
Mechanizm działania Foreground Service opiera się na trzech kluczowych etapach: utworzenie usługi, przypisanie powiadomienia i wykonanie zadania. Usługa dziedziczy po klasie Service i nadpisuje metodę onStartCommand(), w której wywoływana jest startForeground() z identyfikatorem i obiektem Notification.
Po wywołaniu startForeground() system przenosi proces usługi do grupy pierwszoplanowej z podwyższonym priorytetem przeżywalności. Oznacza to, że Android będzie starał się utrzymać proces działający niezależnie od obciążenia pamięci operacyjnej. Foreground Service nie może być zatrzymany przez system w normalnych warunkach — tylko przez przesunięcie powiadomienia przez użytkownika lub jawne wywołanie stopSelf().
Cykl życia Foreground Service jest zarządzany przez metody onCreate(), onStartCommand() i onDestroy(). W onStartCommand() programista określa strategię ponownego uruchomienia usługi po zabiciu procesu — stała START_STICKY zmusza system do ponownego utworzenia usługi po przywróceniu zasobów, a START_NOT_STICKY zapobiega automatycznemu ponownemu uruchomieniu.
Podczas uruchamiania Foreground Service kolejno wykonywane są kroki: wywołanie startService(), utworzenie obiektu Service w onCreate(), przetworzenie Intent w onStartCommand() i wywołanie startForeground() z obiektem Notification. Jeśli usługa już działa i pojawi się nowy Intent, ponownie wywoływane jest tylko onStartCommand() — metoda onCreate() jest wykonywana raz na czas istnienia usługi.
Zakończenie Foreground Service następuje przez stopForeground() z flagą REMOVE_NOTIFICATION, która ukrywa powiadomienie na pasku statusu. Natychmiast po usunięciu powiadomienia system może przestać uznawać usługę za pierwszoplanową i obniżyć jej priorytet do Background Service, co czyni proces podatnym na zakończenie.
PowerManager odgrywa ważną rolę w działaniu Foreground Service, ponieważ tryby oszczędzania energii Androida (Doze, App Standby) mogą ograniczać jego zdolność do wykonywania zadań. Nawet będąc w statusie pierwszoplanowym, usługa podlega politykom baterii — żądania sieciowe mogą być opóźnione, a timery zsynchronizowane z oknami Doze. W przypadku długotrwałych operacji odpornych na opóźnienia zaleca się używanie Foreground Service w kombinacji z WorkManager.
Począwszy od Android 14 (API 34), Google wprowadziła obowiązkowe deklarowanie typu Foreground Service w manifeście. Każdy typ określa dozwolony scenariusz użycia — system sprawdza zgodność między zadeklarowanym typem a faktycznym zachowaniem usługi. Istnieje 9 typów, ale najczęściej używane są następujące.
Typ dataSync jest przeznaczony do synchronizacji danych między urządzeniem a serwerem, przesyłania plików i tworzenia kopii zapasowych. Przykładami są przesyłanie zdjęć do chmury, synchronizacja bazy danych z Firebase lub wysyłanie logów na zdalny serwer. Dla tego typu obowiązkowe jest podanie uzasadnienia w manifeście przez atrybut android:foregroundServiceType="dataSync".
Typ mediaPlayback jest używany do odtwarzania audio i wideo w tle — odtwarzacze muzyczne, klienty podcastów, odtwarzacze wideo. To jedyny typ, który może działać przez nieokreślony czas bez interwencji użytkownika. Kanał powiadomień musi mieć wysoki priorytet i wyświetlać elementy sterowania odtwarzaniem — przyciski play, pause, next, prev przez MediaStyle.
Typ location jest przeznaczony dla usług geolokalizacyjnych — aplikacji nawigacyjnych, śledzenia aktywności, geostref. Dla Android 14+ należy zadeklarować zezwolenie FOREGROUND_SERVICE_LOCATION i podać typ w manifeście. Aplikacja musi mieć aktywne zezwolenie na dostęp do lokalizacji w runtime, w przeciwnym razie system odrzuci uruchomienie usługi.
| Typ | Zezwolenie | Przykład użycia |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Synchronizacja plików z chmurą |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Odtwarzacz muzyczny w tle |
| location | FOREGROUND_SERVICE_LOCATION | Nawigator GPS podczas jazdy |
| camera | FOREGROUND_SERVICE_CAMERA | Aplikacja do monitoringu wideo |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | Praca z urządzeniem BLE |
Kluczowa różnica między Foreground a Background Service — obecność widocznego powiadomienia i priorytet przeżywalności. Background Service może być zatrzymany przez system w dowolnym momencie przy braku pamięci, podczas gdy Foreground Service utrzymuje działanie dzięki podwyższonemu poziomowi adj procesu w mechanizmie Low Memory Killer Androida.
Background Service nie wymaga powiadomienia i może działać niezauważalnie dla użytkownika. Jednak począwszy od Androida 8 (API 26), Google znacząco ograniczyła usługi w tle: startService() z kontekstu tła już nie działa, a Context.startForegroundService() stał się obowiązkowy do uruchomienia każdej usługi, która planuje przejść na pierwszy plan. System wprowadził również Background Execution Limits — timer (obecnie 10 minut), po którym Background Service jest wymuszenie zatrzymywany.
Foreground Service, przeciwnie, nie ma ograniczenia czasu wykonania. Usługa może działać godzinami lub dniami — dopóki użytkownik jej jawnie nie zatrzyma lub nie uruchomi ponownie urządzenia. To czyni Foreground Service optymalnym wyborem dla aplikacji wymagających ciągłej pracy w tle: odtwarzaczy muzyki, trackerów aktywności, aplikacji do połączeń VoIP.
| Parametr | Foreground Service | Background Service |
|---|---|---|
| Powiadomienie | Obowiązkowe | Nie wymagane |
| Czas życia | Bez ograniczeń | Do 10 minut (API 26+) |
| Priorytet systemu | Wysoki (ADJ 2) | Niski (ADJ 8+) |
| API 26+ uruchomienie | startForegroundService() | Zabronione z tła |
Począwszy od Android 12 (API 31), Google wprowadziła znaczące ograniczenia uruchamiania Foreground Service. Główna zmiana — zakaz wywoływania startForegroundService() z kontekstu tła dla większości typów usług. Wyjątki stanowią tylko przypadki, gdy użytkownik wyraźnie wyraził zgodę (na przykład przez zezwolenie FOREGROUND_SERVICE_SPECIAL_USE) lub usługa jest uruchamiana w odpowiedzi na intencję rozgłoszeniową BOOT_COMPLETED.
Manifest aplikacji z docelowym API 34+ musi zawierać blok foregroundServiceType dla każdej zadeklarowanej usługi. Na przykład dla usługi synchronizacji danych podaje się android:foregroundServiceType="dataSync". Jeśli typ nie jest podany, system uznaje usługę za nieważną i zgłasza wyjątek MissingForegroundServiceTypeException przy próbie uruchomienia. Google Play również sprawdza zgodność typów i może odrzucić publikację w przypadku niezgodności.
W Android 14 (API 34) każdemu typowi Foreground Service odpowiada osobne zezwolenie. Programista musi zadeklarować je w manifeście i poprosić o nie w runtime przed uruchomieniem usługi. Dla dataSync wymagane jest FOREGROUND_SERVICE_DATA_SYNC, dla mediaPlayback — FOREGROUND_SERVICE_MEDIA_PLAYBACK. Użytkownik może cofnąć zezwolenie w ustawieniach, co doprowadzi do zatrzymania aktywnej usługi.
Google wprowadziła również mechanizm Foreground Service Notification Timeout w Android 14: jeśli usługa nie wywoła startForeground() w ciągu 10 sekund po utworzeniu, system generuje wyjątek. To zaostrzenie ma na celu walkę z aplikacjami, które opóźniają lub pomijają wywołanie powiadomienia, faktycznie działając jako Background Service pod pozorem pierwszoplanowego.
Foreground Service jest używany w szerokim spektrum zadań wymagających gwarantowanego wykonania w tle. Najczęstsze scenariusze obejmują odtwarzanie multimediów, śledzenie geolokalizacji, synchronizację danych i pracę z urządzeniami peryferyjnymi. Przyjrzyjmy się każdemu z nich szczegółowo.
Klasyczny przykład — odtwarzacz muzyczny, który kontynuuje odtwarzanie po zminimalizowaniu aplikacji. Usługa uruchamiana jest z powiadomieniem MediaStyle, przyciskami sterowania i używa typu mediaPlayback. Użytkownik widzi informacje o utworze na pasku statusu i może sterować odtwarzaniem bez otwierania aplikacji.
Aplikacje nawigacyjne używają Foreground Service typu location do ciągłego śledzenia współrzędnych. Usługa wyświetla powiadomienie z informacją o aktualnej prędkości, czasie podróży i przyciskiem zatrzymania śledzenia. Bez Foreground Service system zatrzymałby pobieranie współrzędnych w tle po kilku minutach, co uniemożliwiłoby nawigację.
Aplikacje do połączeń głosowych i wideo — klienty VoIP — używają Foreground Service do utrzymywania aktywnego połączenia. Usługa typu phoneCall (od Androida 14) gwarantuje, że połączenie nie zostanie przerwane po zminimalizowaniu aplikacji. Powiadomienie wyświetla czas trwania połączenia oraz elementy sterowania mikrofonem i głośnikiem.
Rozważmy utworzenie Foreground Service w Kotlinie do synchronizacji danych. Usługa będzie uruchamiana z Activity, wyświetlać powiadomienie z postępem i poprawnie kończyć działanie po zakończeniu pracy. Przykład demonstruje wszystkie obowiązkowe elementy: deklarację w manifeście, kanał powiadomień, wywołanie startForeground() i obsługę 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,
"Synchronizacja",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Kanał synchronizacji danych"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Synchronizacja")
.setContentText("Przesyłanie danych na serwer")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Emulacja synchronizacji
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Dla poprawnego działania usługi na Android 12+ należy zadeklarować Foreground Service w AndroidManifest.xml z podaniem typu i wymaganych zezwoleń. Atrybut foregroundServiceType jest obowiązkowy dla docelowego API 34+, a zezwolenia FOREGROUND_SERVICE_DATA_SYNC i POST_NOTIFICATIONS muszą być wymagane w 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>
Pomimo wysokiej niezawodności, Foreground Service ma ograniczenia. Głównym z nich jest widoczność dla użytkownika. Aplikacja nie może wykonywać długotrwałych zadań w tle bez powiadomienia, co nie zawsze jest akceptowalne z punktu widzenia UX. Ponadto system może wymusić zatrzymanie nawet Foreground Service po przekroczeniu limitu czasu dla niektórych typów — na przykład dataSync jest ograniczony do kilku godzin pracy.
Alternatywą dla Foreground Service jest WorkManager — biblioteka Android Jetpack do odroczonych i działających w tle zadań. WorkManager gwarantuje wykonanie zadania nawet po ponownym uruchomieniu urządzenia i obsługuje łańcuchy zadań, operacje okresowe oraz ograniczenia dotyczące sieci i baterii. Dla większości operacji w tle Google zaleca właśnie WorkManager, a nie bezpośrednią usługę.
JobScheduler — wbudowane w Androida API do planowania zadań. Nadaje się do operacji, które mogą być odroczone: synchronizacja przez Wi-Fi, pobieranie danych po podłączeniu ładowarki. JobScheduler łączy zadania w okna w celu oszczędzania baterii, w przeciwieństwie do Foreground Service, który działa nieprzerwanie niezależnie od stanu oszczędzania energii.
Do krótkich zadań (do 10–15 sekund) można użyć CoroutineWorker z WorkManager z opóźnieniem wykonania. Jeśli zadanie ma być wykonane ściśle o określonej godzinie, używa się AlarmManager wraz z BroadcastReceiver. Zatem Foreground Service jest rozwiązaniem dla długotrwałych ciągłych operacji, a nie uniwersalnym narzędziem do wszystkich scenariuszy w tle.
Często zadawane pytania
Foreground Service — to usługa Androida ze stałym powiadomieniem na pasku statusu, która wykonuje długotrwałe zadania na widoku użytkownika. Ma wysoki priorytet przeżywalności i nie jest zatrzymywana przez system przy braku pamięci, w przeciwieństwie do Background Service.
Foreground Service wyświetla obowiązkowe powiadomienie, nie ma ograniczenia czasu pracy i jest chroniona przed zakończeniem przez system. Background Service jest niewidoczna dla użytkownika, działa do 10 minut (API 26+) i może być zatrzymana przez Low Memory Killer w dowolnym momencie.
Android 14 określa 9 typów: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health i remoteMessaging. Każdy typ wymaga odpowiedniego zezwolenia i podania w manifeście przez atrybut foregroundServiceType.
Jeśli usługa nie wywoła startForeground() w ciągu 10 sekund po utworzeniu (Android 14), system wygeneruje wyjątek ForegroundServiceDidNotStartInTimeException i wymusi zatrzymanie usługi. Aplikacja otrzyma również ANR (Application Not Responding), jeśli operacja jest wykonywana na głównym wątku.
Nie, ukrycie powiadomienia Foreground Service programowo jest niemożliwe. Począwszy od Androida 9 (API 28), powiadomienie jest obowiązkowe i nie może być przesunięte przez użytkownika. Jedynym sposobem na jego usunięcie jest zatrzymanie usługi przez wywołanie stopForeground(REMOVE_NOTIFICATION) i stopSelf().
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również