Foreground Service: co to jest, typy i mechanizm działania

Autor: IT Sectr Opublikowano: 2026-03-28 Czas czytania: 11 min

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 — usługa z obowiązkowym powiadomieniem widoczna dla użytkownika na pasku statusu
  • Notification — obowiązkowy element, bez którego system nie pozwoli uruchomić usługi
  • Priorytet — Foreground Service nie jest zabijany przy braku pamięci, w przeciwieństwie do Background Service
  • Android 12+ — wprowadzono ograniczenia uruchamiania foreground service z tła
  • Foreground Service Type — obowiązkowe zadeklarowanie typu usługi dla docelowego API 34+

Czym jest Foreground Service

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.

Historia powstania

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ą.

Jak działa Foreground Service

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.

Cykl życia i stany

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.

Interakcja z PowerManager

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.

Główne typy Foreground Service

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.

dataSync

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".

mediaPlayback

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.

location

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.

TypZezwoleniePrzykład użycia
dataSyncFOREGROUND_SERVICE_DATA_SYNCSynchronizacja plików z chmurą
mediaPlaybackFOREGROUND_SERVICE_MEDIA_PLAYBACKOdtwarzacz muzyczny w tle
locationFOREGROUND_SERVICE_LOCATIONNawigator GPS podczas jazdy
cameraFOREGROUND_SERVICE_CAMERAAplikacja do monitoringu wideo
connectedDeviceFOREGROUND_SERVICE_CONNECTED_DEVICEPraca z urządzeniem BLE

Foreground Service vs Background Service

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.

Tabela porównawcza

ParametrForeground ServiceBackground Service
PowiadomienieObowiązkoweNie wymagane
Czas życiaBez ograniczeńDo 10 minut (API 26+)
Priorytet systemuWysoki (ADJ 2)Niski (ADJ 8+)
API 26+ uruchomieniestartForegroundService()Zabronione z tła

Wymagania w Android 12+

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.

Zezwolenia dla Android 14+

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 mediaPlaybackFOREGROUND_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.

Przykłady użycia Foreground Service

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.

Odtwarzacze multimediów i strumieniowanie audio

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.

Trackery GPS i nawigacja

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ę.

Połączenia VoIP

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.

  • Odtwarzacze multimediów — strumieniowanie audio, podcasty, odtwarzacze wideo w tle
  • Nawigacja — śledzenie GPS, geostrefy, nawigatory samochodowe
  • Połączenia VoIP — Skype, Zoom, Telegram — utrzymywanie aktywnego połączenia
  • Trackery fitness — liczenie kroków, monitorowanie tętna, treningi
  • Synchronizacja — przesyłanie zdjęć, kopia zapasowa danych, aktualizacja treści offline

Tworzenie Foreground Service w Kotlinie

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.

kotlin
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
}

Deklaracja usługi w manifeście

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.

xml
<!-- 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>

Ograniczenia i alternatywy

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.

  • WorkManager — do odroczonych i gwarantowanych zadań z obsługą ponownego uruchomienia
  • JobScheduler — do planowania zadań z uwzględnieniem stanu sieci i baterii
  • AlarmManager — do wykonywania zadań o określonej godzinie
  • CoroutineWorker — do krótkich operacji w tle z obsługą coroutine

Często zadawane pytania

Czym jest Foreground Service w Androidzie?

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.

Czym Foreground Service różni się od 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.

Jakie typy Foreground Service istnieją w Android 14?

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.

Co się stanie, jeśli nie wywoła się startForeground na czas?

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.

Czy można ukryć powiadomienie Foreground Service?

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

  • Foreground Service — usługa Androida z obowiązkowym powiadomieniem widoczna dla użytkownika na pasku statusu
  • Priorytet — Foreground Service praktycznie nie jest zabijany przez system (ADJ 2), w przeciwieństwie do Background Service (ADJ 8+)
  • Typy — Android 14 wymaga deklaracji typu (dataSync, mediaPlayback, location i inne) oraz odpowiednich zezwoleń
  • Ograniczenia — uruchomienie z tła jest zabronione w Android 12+; dla niektórych scenariuszy wymagane jest FOREGROUND_SERVICE_SPECIAL_USE
  • Alternatywy — WorkManager dla zadań odroczonych, JobScheduler do planowania, AlarmManager dla dokładnego czasu
  • Kod — obowiązkowe elementy: NotificationChannel, startForeground(), foregroundServiceType w manifeście
  • Google Play — publikacja aplikacji wymaga zgodności zadeklarowanego typu z faktycznym użyciem usługi

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.

Omów projekt

Przeczytaj również