Background Execution — mechanismus provádění kódu mobilní aplikace v okamžiku, kdy není v popředí. Bez tohoto mechanismu je aplikace při minimalizaci pozastavena systémem. Podle údajů Apple, 2026, iOS omezuje čas na pozadí na 30 sekund, zatímco Android umožňuje flexibilnější scénáře prostřednictvím WorkManager a Foreground Service.
Hlavní
Background Execution — schopnost aplikace pokračovat v provádění kódu poté, co ji uživatel minimalizoval nebo přešel na jinou aplikaci. Bez speciálních mechanismů převede mobilní OS aplikaci do stavu Suspended (pozastaveno) během několika sekund po přechodu na pozadí, čímž uvolní procesor a paměť pro aktivní aplikace.
Mobilní aplikace prochází několika stavy životního cyklu: Foreground (aktivní), Background (na pozadí), Suspended (pozastaveno) a Terminated (ukončeno). Background — jediný stav, ve kterém může aplikace provádět kód bez viditelného rozhraní. iOS a Android definují dobu trvání a povolené operace v tomto stavu odlišně.
Provádění na pozadí je nezbytné pro úlohy synchronizace dat, stahování obsahu, zpracování Push oznámení, geolokaci na pozadí a přehrávání audia. Synchronizace — nejčastější scénář: aplikace odesílá data na server nebo stahuje aktualizace bez účasti uživatele.
Omezení provádění na pozadí jsou způsobena třemi faktory: spotřeba energie, výkon zařízení a soukromí uživatele. Procesor a rádiové moduly (Wi-Fi, mobilní data) spotřebovávají nejvíce energie — každý proces na pozadí zkracuje dobu provozu baterie.
Výzkumy Google ukazují, že aplikace provádějící úlohy na pozadí každých 5 minut zkracují dobu provozu zařízení o 20–30% denně. I optimalizované operace na pozadí s frekvencí jednou za hodinu mají znatelný dopad, pokud existuje více než dvě takové aplikace.
Každá aplikace na pozadí zabírá operační paměť. Při jejím nedostatku systém uvolňuje aplikace z paměti, což vede k restartu při návratu uživatele. iOS používá algoritmus Jetsam — mechanismus vynuceného ukončení procesů na pozadí při překročení limitu paměti. Android používá LMK (Low Memory Killer) s podobným principem.
Od Androidu 10 a iOS 13 systém vyžaduje, aby aplikace deklarovaly účel práce na pozadí. Android zavedl omezení spouštění Broadcast Receiver na pozadí. iOS vyžaduje uvedení Background Mode v Capabilities projektu. Uživatel může zakázat provádění na pozadí pro jakoukoli aplikaci v nastavení.
| OS | Verze | Omezení | Dopad |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST zakázán | 67% Broadcastů na pozadí rozbito |
| Android | 9.0 | Doze vylepšen | Omezení síťových volání |
| Android | 12+ | Foreground Service omezen | Zákaz spouštění z pozadí |
| iOS | 7+ | Background App Refresh | Periodická okna aktualizace |
| iOS | 13+ | BGTaskScheduler | Plánování místo provádění |
Android poskytuje několik mechanismů pro provádění na pozadí, z nichž každý řeší svou kategorii úloh. WorkManager — doporučené API pro odložené a periodické úlohy. Foreground Service — pro okamžité provádění s viditelným oznámením. JobScheduler — nízkoúrovňová obdoba WorkManageru.
WorkManager — součást Android Jetpack, zajišťující provádění úloh na pozadí s garancí dokončení i po restartu zařízení. API vybírá optimální čas provádění s ohledem na stav sítě, úroveň baterie a režim Doze. WorkManager je kompatibilní s API 14+ a nahrazuje zastaralé AlarmManager a JobScheduler.
Když aplikace potřebuje provést úlohu viditelnou pro uživatele (přehrávání hudby, záznam geolokace), používá se Foreground Service. Služba zobrazuje trvalé oznámení ve stavovém řádku a má vyšší prioritu — systém ji neukončí do dokončení úlohy. Od Androidu 13 je vyžadováno oprávnění POST_NOTIFICATIONS.
Od Androidu 6.0 zařízení přechází při nečinnosti do režimu Doze. V tomto režimu jsou odkládány síťové operace, synchronizace a JobScheduler. WorkManager se automaticky přizpůsobuje Doze — úlohy jsou prováděny v nejbližším Maintenance Window, když zařízení opustí spánek kvůli údržbě.
iOS používá přísnější přístup k provádění na pozadí. Background App Refresh — hlavní mechanismus periodické aktualizace dat. BGTaskScheduler — API pro plánování úloh s ohledem na stav systému. Pro dlouhé operace jsou k dispozici Background Modes: audio, location, voip, fetch a processing.
Background App Refresh umožňuje aplikaci probouzet se každých 15–30 minut pro synchronizaci dat. Doba probuzení závisí na chování uživatele — systém analyzuje, jak často aplikaci otevírá. Uživatel může tuto funkci vypnout pro jednotlivé aplikace v Settings — General — Background App Refresh.
Od iOS 13 nahradil BGTaskScheduler zastaralé performFetch a beginBackgroundTask. Aplikace registruje úlohy s identifikátorem a minimálním intervalem a systém sám určuje optimální čas provádění. Úlohy se dělí na dva typy: BGProcessingTask (dlouhé, 10+ minut) a BGAppRefreshTask (krátké, do 30 sekund).
iOS přiděluje aplikaci omezený čas na provádění úlohy na pozadí — do 30 sekund pro BGAppRefreshTask a do 10 minut pro BGProcessingTask. Po vypršení limitu systém úlohu vynuceně ukončí. Vývojář musí zavolat obslužnou rutinu vypršení (expiration handler) pro uložení dočasných výsledků.
Podívejme se na praktickou implementaci provádění na pozadí na Androidu pomocí WorkManageru. Příklad synchronizace dat každých 8 hodin s ohledem na stav sítě. WorkManager garantuje provedení úlohy i po restartu zařízení.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Data synchronizována")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Spuštění periodické úlohy každých 8 hodin
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)
Pro dlouhé operace viditelné uživateli používejte Foreground Service. Příklad stahování souboru s průběhem v oznámení. Služba volá startForeground() s oznámením, které nelze odmítnout. Po dokončení stahování — 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("Stažení souboru")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
Na iOS je provádění na pozadí konfigurováno prostřednictvím BGTaskScheduler. Příklad registrace a provedení úlohy aktualizace obsahu. Aplikace musí zaregistrovat identifikátor úlohy v Info.plist a zavolat submit v okamžiku, kdy má být úloha naplánována.
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 = {
// Uložit dočasná data
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Pro dlouhé operace (čištění mezipaměti, zpracování dat) používejte BGProcessingTask. Systém dává až 10 minut na provedení. Spouští se pouze když je zařízení na nabíječce a připojeno k Wi-Fi. Vyžaduje samostatný identifikátor v Info.plist a registraci pomocí 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 a iOS se zásadně liší ve filozofii provádění na pozadí. Android poskytuje flexibilní nástroje s velkou kontrolou, ale vyžaduje od vývojáře správný výběr API. iOS omezuje možnosti, ale garantuje stabilní výkon a autonomii pro uživatele.
| Kritérium | Android | iOS |
|---|---|---|
| Doporučené API | WorkManager | BGTaskScheduler |
| Max. doba úlohy | Neomezeno (Foreground Service) | 30 s / 10 min (processing) |
| Periodické úlohy | Ano, pomocí PeriodicWorkRequest | Ano, pomocí BGAppRefreshTask |
| Garance provedení | Ano, i po restartu | Ne — systém rozhoduje kdy |
| Síťový přístup na pozadí | Omezen režimem Doze | Přes URLSession s background config |
| Geolokace na pozadí | Foreground Service + oprávnění | Background Mode location + NSLocation |
| Audio na pozadí | Foreground Service s mediálním oznámením | Background Mode audio + AVAudioSession |
WorkManager je optimální pro úlohy, které musí být provedeny bez ohledu na stav aplikace: synchronizace dat, odesílání analytiky, zpracování front. API garantuje provedení i po vypnutí zařízení — úloha je přeplánována po spuštění.
BGTaskScheduler je vhodný pro úlohy, které systém může provést v libovolném vhodném čase: stahování nového obsahu, aktualizace widgetů, čištění mezipaměti. Není vhodný pro naléhavé operace — systém úlohu odloží, pokud je zařízení v Doze nebo je nízká baterie.
Často kladené otázky
Background Execution — obecný pojem popisující jakýkoli kód prováděný na pozadí. Background Modes — konkrétní mechanismus iOS umožňující aplikaci provádět určité typy operací na pozadí: audio, geolokace, VoIP, fetch. Android používá podobný přístup prostřednictvím typů Foreground Service.
Na iOS je to standardní omezení pro BGAppRefreshTask. Systém vynuceně ukončí úlohu po vypršení limitu. Na Androidu nastává podobná situace, když aplikace nepoužívá WorkManager nebo Foreground Service — běžná Služba je systémem ukončena po přechodu na pozadí.
Na Androidu použijte WorkManager — garantuje provedení i po restartu. Na iOS nelze provedení garantovat — systém sám rozhoduje, kdy úlohu spustí. Jediný způsob garance — použití Background Modes (audio, location) s viditelným indikátorem pro uživatele.
Na iOS zavolejte UIApplication.shared.backgroundRefreshStatus — stav .available, .denied nebo .restricted. Na Androidu použijte PowerManager.isIgnoringBatteryOptimizations() pro kontrolu výjimky z optimalizace baterie. Pro WorkManager není kontrola nutná — API samo zpracovává omezení systému.
Push oznámení — hlavní mechanismus pro spouštění akcí bez kódu na pozadí. Na iOS jsou k dispozici PushKit pro VoIP a Silent Push pro aktualizaci dat. Na Androidu — High Priority FCM a Notification Trampoline. WebSockets přes Foreground Service — alternativa pro real-time aplikace.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také