Background Execution — mechanizm wykonywania kodu aplikacji mobilnej w momencie, gdy nie znajduje się ona na pierwszym planie. Bez tego mechanizmu aplikacja jest wstrzymywana przez system przy minimalizacji. Według danych Apple, 2026, iOS ogranicza czas działania w tle do 30 sekund, podczas gdy Android pozwala na bardziej elastyczne scenariusze przez WorkManager i Foreground Service.
Najważniejsze
Background Execution — to zdolność aplikacji do kontynuowania wykonywania kodu po tym, jak użytkownik zminimalizował ją lub przełączył się na inną aplikację. Bez specjalnych mechanizmów mobilny SO przenosi aplikację w stan Suspended (wstrzymana) po kilku sekundach od przejścia w tło, zwalniając procesor i pamięć dla aktywnych aplikacji.
Aplikacja mobilna przechodzi przez kilka stanów cyklu życia: Foreground (aktywna), Background (w tle), Suspended (wstrzymana) i Terminated (zakończona). Background — jedyny stan, w którym aplikacja może wykonywać kod bez widocznego interfejsu. iOS i Android różnie określają czas trwania i dostępne operacje w tym stanie.
Wykonywanie w tle jest niezbędne do zadań synchronizacji danych, pobierania treści, przetwarzania powiadomień Push, geolokalizacji w tle i odtwarzania audio. Synchronizacja — najczęstszy scenariusz: aplikacja wysyła dane na serwer lub pobiera aktualizacje bez udziału użytkownika.
Ograniczenia wykonywania w tle wynikają z trzech czynników: zużycia energii, wydajności urządzenia i prywatności użytkownika. Procesor i moduły radiowe (Wi-Fi, dane komórkowe) zużywają najwięcej energii — każdy proces w tle skraca czas pracy na baterii.
Badania Google pokazują, że aplikacje wykonujące zadania w tle co 5 minut skracają czas pracy urządzenia o 20–30% dziennie. Nawet zoptymalizowane operacje w tle z częstotliwością raz na godzinę mają zauważalny wpływ, jeśli takich aplikacji jest więcej niż dwie.
Każda aplikacja działająca w tle zajmuje pamięć operacyjną. Przy jej braku system zwalnia aplikacje z pamięci, co prowadzi do ponownego uruchomienia przy powrocie użytkownika. iOS używa algorytmu Jetsam — mechanizmu wymuszonego kończenia procesów w tle po przekroczeniu limitu pamięci. Android stosuje LMK (Low Memory Killer) z podobną zasadą.
Od Androida 10 i iOS 13 system wymaga od aplikacji deklarowania celu pracy w tle. Android wprowadził ograniczenie uruchamiania Broadcast Receiver w tle. iOS wymaga określenia Background Mode w Capabilities projektu. Użytkownik może wyłączyć wykonywanie w tle dla dowolnej aplikacji w ustawieniach.
| SO | Wersja | Ograniczenie | Wpływ |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST zabroniony | 67% Broadcastów w tle zepsute |
| Android | 9.0 | Doze ulepszony | Ograniczenie wywołań sieciowych |
| Android | 12+ | Foreground Service ograniczony | Zakaz uruchamiania z tła |
| iOS | 7+ | Background App Refresh | Okresowe okna aktualizacji |
| iOS | 13+ | BGTaskScheduler | Planowanie zamiast wykonywania |
Android udostępnia kilka mechanizmów do wykonywania w tle, z których każdy rozwiązuje swoją kategorię zadań. WorkManager — zalecane API do odroczonych i okresowych zadań. Foreground Service — do natychmiastowego wykonywania z widocznym powiadomieniem. JobScheduler — niskopoziomowy odpowiednik WorkManagera.
WorkManager — część Android Jetpack, zapewniająca wykonywanie zadań w tle z gwarancją ukończenia nawet po restarcie urządzenia. API wybiera optymalny czas wykonania uwzględniając stan sieci, poziom baterii i tryb Doze. WorkManager jest zgodny z API 14+ i zastępuje przestarzałe AlarmManager i JobScheduler.
Gdy aplikacja musi wykonać zadanie widoczne dla użytkownika (odtwarzanie muzyki, zapis geolokalizacji), używany jest Foreground Service. Serwis pokazuje stałe powiadomienie w pasku stanu i ma wyższy priorytet — system nie zakończy go do zakończenia zadania. Od Androida 13 wymagane jest zezwolenie POST_NOTIFICATIONS.
Od Androida 6.0 urządzenie przechodzi w tryb Doze przy bezczynności. W tym trybie odkładane są operacje sieciowe, synchronizacja i JobScheduler. WorkManager automatycznie dostosowuje się do Doze — zadania są wykonywane w najbliższym Maintenance Window, gdy urządzenie wychodzi ze snu w celu obsługi.
iOS stosuje bardziej rygorystyczne podejście do wykonywania w tle. Background App Refresh — główny mechanizm okresowej aktualizacji danych. BGTaskScheduler — API do planowania zadań uwzględniające stan systemu. Do długotrwałych operacji dostępne są Background Modes: audio, location, voip, fetch i processing.
Background App Refresh pozwala aplikacji budzić się co 15–30 minut w celu synchronizacji danych. Czas budzenia zależy od zachowania użytkownika — system analizuje, jak często otwiera on aplikację. Użytkownik może wyłączyć tę funkcję dla poszczególnych aplikacji w Settings — General — Background App Refresh.
Od iOS 13 BGTaskScheduler zastąpił przestarzałe performFetch i beginBackgroundTask. Aplikacja rejestruje zadania z identyfikatorem i minimalnym interwałem, a system sam określa optymalny czas wykonania. Zadania dzielą się na dwa typy: BGProcessingTask (długotrwałe, 10+ minut) i BGAppRefreshTask (krótkie, do 30 sekund).
iOS przydziela aplikacji ograniczony czas na wykonanie zadania w tle — do 30 sekund dla BGAppRefreshTask i do 10 minut dla BGProcessingTask. Po przekroczeniu limitu system wymusza zakończenie zadania. Deweloper musi wywołać handler zakończenia (expiration handler) w celu zapisania pośrednich wyników.
Rozważmy praktyczną implementację wykonywania w tle na Androidzie za pomocą WorkManagera. Przykład synchronizacji danych co 8 godzin z uwzględnieniem stanu sieci. WorkManager gwarantuje wykonanie zadania nawet po restarcie urządzenia.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Dane zsynchronizowane")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Uruchamianie zadania okresowego co 8 godzin
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(false)
.build()
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(
8, TimeUnit.HOURS
).setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(syncRequest)
Do długotrwałych operacji widocznych dla użytkownika używaj Foreground Service. Przykład pobierania pliku z postępem w powiadomieniu. Serwis wywołuje startForeground() z powiadomieniem, którego nie można odrzucić. Po zakończeniu pobierania — stopForeground(STOP_FOREGROUND_REMOVE).
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, id: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
downloadFile()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
return START_NOT_STICKY
}
private fun createNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Pobieranie pliku")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
Na iOS wykonywanie w tle konfiguruje się przez BGTaskScheduler. Przykład rejestracji i wykonania zadania aktualizacji treści. Aplikacja musi zarejestrować identyfikator zadania w Info.plist i wywołać submit w momencie, gdy zadanie ma być zaplanowane.
import BackgroundTasks
func registerBackgroundTask() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.app.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.app.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = {
// Zapisz dane tymczasowe
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Do długotrwałych operacji (czyszczenie pamięci podręcznej, przetwarzanie danych) używaj BGProcessingTask. System daje do 10 minut na wykonanie. Uruchamiane tylko gdy urządzenie jest na ładowarce i podłączone do Wi-Fi. Wymaga osobnego identyfikatora w Info.plist i rejestracji przez register(forTaskWithIdentifier:).
func scheduleProcessing() {
let request = BGProcessingTaskRequest(
identifier: "com.app.cleanup"
)
request.requiresExternalPower = true
request.requiresNetworkConnectivity = true
request.earliestBeginDate = Date(timeIntervalSinceNow: 24 * 60 * 60)
try? BGTaskScheduler.shared.submit(request)
}
Android i iOS radykalnie różnią się filozofią wykonywania w tle. Android oferuje elastyczne narzędzia z dużą kontrolą, ale wymaga od dewelopera prawidłowego wyboru API. iOS ogranicza możliwości, ale gwarantuje stabilną wydajność i autonomię dla użytkownika.
| Kryterium | Android | iOS |
|---|---|---|
| Zalecane API | WorkManager | BGTaskScheduler |
| Maks. czas zadania | Nieograniczony (Foreground Service) | 30 s / 10 min (processing) |
| Zadania okresowe | Tak, przez PeriodicWorkRequest | Tak, przez BGAppRefreshTask |
| Gwarancja wykonania | Tak, nawet po restarcie | Nie — system decyduje when |
| Dostęp sieciowy w tle | Ograniczony przez Doze mode | Przez URLSession z background config |
| Geolokalizacja w tle | Foreground Service + zezwolenie | Background Mode location + NSLocation |
| Audio w tle | Foreground Service z powiadomieniem medialnym | Background Mode audio + AVAudioSession |
WorkManager jest optymalny dla zadań, które muszą zostać wykonane niezależnie od stanu aplikacji: synchronizacja danych, wysyłanie analityki, przetwarzanie kolejek. API gwarantuje wykonanie nawet po wyłączeniu urządzenia — zadanie jest przeplanowywane po uruchomieniu.
BGTaskScheduler nadaje się do zadań, które system może wykonać w dowolnym dogodnym czasie: pobieranie nowej treści, aktualizacja widżetów, czyszczenie pamięci podręcznej. Nie nadaje się do pilnych operacji — system odkłada zadanie, jeśli urządzenie jest w Doze lub ma niski poziom baterii.
Często zadawane pytania
Background Execution — ogólne pojęcie opisujące każdy kod wykonywany w tle. Background Modes — konkretny mechanizm iOS pozwalający aplikacji wykonywać określone typy operacji w tle: audio, geolokalizacja, VoIP, fetch. Android stosuje podobne podejście przez typy Foreground Service.
Na iOS to standardowe ograniczenie dla BGAppRefreshTask. System wymusza zakończenie zadania po przekroczeniu limitu. Na Androidzie podobna sytuacja ma miejsce, gdy aplikacja nie używa WorkManagera ani Foreground Service — zwykły Service jest kończony przez system po przejściu w tło.
Na Androidzie używaj WorkManager — gwarantuje wykonanie nawet po restarcie. Na iOS nie można zagwarantować wykonania — system sam decyduje, kiedy uruchomić zadanie. Jedynym sposobem na gwarancję jest użycie Background Modes (audio, location) z widocznym wskaźnikiem dla użytkownika.
Na iOS wywołaj UIApplication.shared.backgroundRefreshStatus — status .available, .denied lub .restricted. Na Androidzie użyj PowerManager.isIgnoringBatteryOptimizations() do sprawdzenia wyjątku z optymalizacji baterii. Dla WorkManagera sprawdzenie nie jest wymagane — API sam obsługuje ograniczenia systemu.
Powiadomienia Push — główny mechanizm do wyzwalania działań bez kodu w tle. Na iOS dostępne są PushKit dla VoIP i Silent Push do aktualizacji danych. Na Androidzie — High Priority FCM i Notification Trampoline. WebSockets przez Foreground Service — alternatywa dla aplikacji real-time.
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ż