Background Execution es un mecanismo que permite ejecutar código de una aplicación móvil cuando no está en primer plano. Sin este mecanismo, el sistema suspende la aplicación al minimizarla. Según Apple, 2026, iOS limita el tiempo en segundo plano a 30 segundos, mientras que Android ofrece escenarios más flexibles a través de WorkManager y Foreground Service.
Puntos Clave
Background Execution es la capacidad de una aplicación de continuar ejecutando código después de que el usuario la haya minimizado o cambiado a otra aplicación. Sin mecanismos especiales, el SO móvil pone la aplicación en estado Suspendido a los pocos segundos de pasar a segundo plano, liberando CPU y memoria para las aplicaciones activas.
Una aplicación móvil pasa por varios estados del ciclo de vida: Foreground (activo), Background (en segundo plano), Suspended (suspendido) y Terminated (finalizado). Background es el único estado en el que la aplicación puede ejecutar código sin una interfaz visible. iOS y Android definen la duración y las operaciones disponibles en este estado de manera diferente.
La ejecución en segundo plano es necesaria para la sincronización de datos, descarga de contenido, procesamiento de notificaciones Push, geolocalización en segundo plano y reproducción de audio. La sincronización es el escenario más común: la aplicación envía datos al servidor o descarga actualizaciones sin intervención del usuario.
Las limitaciones de la ejecución en segundo plano vienen dadas por tres factores: consumo de energía, rendimiento del dispositivo y privacidad del usuario. La CPU y los módulos de radio (Wi-Fi, datos móviles) consumen la mayor parte de la energía — cada proceso en segundo plano reduce la duración de la batería.
Los estudios de Google muestran que las aplicaciones que ejecutan tareas en segundo plano cada 5 minutos reducen la duración de la batería del dispositivo entre un 20 y un 30% al día. Incluso las operaciones en segundo plano optimizadas con una frecuencia de una hora tienen un impacto notable si hay más de dos aplicaciones de este tipo.
Cada aplicación en segundo plano ocupa memoria RAM. Cuando la RAM es insuficiente, el sistema descarga aplicaciones de la memoria, lo que provoca un reinicio al regresar el usuario. iOS utiliza el algoritmo Jetsam — un mecanismo de finalización forzosa de procesos en segundo plano al superar el límite de memoria. Android emplea LMK (Low Memory Killer) con un principio similar.
A partir de Android 10 e iOS 13, el sistema exige que las aplicaciones declaren el propósito del trabajo en segundo plano. Android introdujo restricciones al lanzamiento de Broadcast Receivers en segundo plano. iOS requiere especificar Background Mode en las capacidades del proyecto. Los usuarios pueden desactivar la ejecución en segundo plano para cualquier aplicación en los ajustes.
| SO | Versión | Restricción | Impacto |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST prohibido | 67% de Broadcast en segundo plano rotos |
| Android | 9.0 | Doze mejorado | Llamadas de red restringidas |
| Android | 12+ | Foreground Service restringido | Inicio desde segundo plano prohibido |
| iOS | 7+ | Background App Refresh | Ventanas de actualización periódicas |
| iOS | 13+ | BGTaskScheduler | Planificación en lugar de ejecución |
Android proporciona varios mecanismos para la ejecución en segundo plano, cada uno diseñado para una categoría diferente de tareas. WorkManager es la API recomendada para tareas diferidas y periódicas. Foreground Service es para ejecución inmediata con una notificación visible. JobScheduler es una alternativa de bajo nivel a WorkManager.
WorkManager forma parte de Android Jetpack y proporciona ejecución de tareas en segundo plano con garantía de finalización incluso tras reiniciar el dispositivo. La API elige el momento óptimo de ejecución teniendo en cuenta el estado de la red, el nivel de batería y el modo Doze. WorkManager es compatible con API 14+ y reemplaza a los obsoletos AlarmManager y JobScheduler.
Cuando una aplicación necesita realizar una tarea visible para el usuario (reproducción de música, registro de geolocalización), se utiliza Foreground Service. El servicio muestra una notificación persistente en la barra de estado y tiene mayor prioridad — el sistema no lo finalizará hasta que la tarea termine. A partir de Android 13, se requiere el permiso POST_NOTIFICATIONS.
A partir de Android 6.0, el dispositivo entra en modo Doze cuando está inactivo. En este modo se aplazan las operaciones de red, la sincronización y JobScheduler. WorkManager se adapta automáticamente a Doze — las tareas se ejecutan durante la siguiente Maintenance Window cuando el dispositivo sale del sueño para mantenimiento.
iOS utiliza un enfoque más estricto para la ejecución en segundo plano. Background App Refresh es el mecanismo principal para la actualización periódica de datos. BGTaskScheduler es la API para planificar tareas según el estado del sistema. Para operaciones prolongadas están disponibles los Background Modes: audio, location, voip, fetch y processing.
Background App Refresh permite que la aplicación se active cada 15–30 minutos para sincronizar datos. El tiempo de activación depende del comportamiento del usuario — el sistema analiza con qué frecuencia abre la aplicación. Los usuarios pueden desactivar esta función para aplicaciones individuales en Ajustes — General — Background App Refresh.
A partir de iOS 13, BGTaskScheduler reemplazó a los obsoletos performFetch y beginBackgroundTask. La aplicación registra tareas con un identificador e intervalo mínimo, y el sistema determina el momento óptimo de ejecución. Las tareas se dividen en dos tipos: BGProcessingTask (prolongadas, 10+ minutos) y BGAppRefreshTask (cortas, hasta 30 segundos).
iOS asigna tiempo limitado para la ejecución de tareas en segundo plano — hasta 30 segundos para BGAppRefreshTask y hasta 10 minutos para BGProcessingTask. Al superar el límite, el sistema finaliza la tarea forzosamente. El desarrollador debe llamar al manejador de finalización (expiration handler) para guardar los resultados intermedios.
Veamos una implementación práctica de la ejecución en segundo plano en Android usando WorkManager. Un ejemplo de sincronización de datos cada 8 horas con conocimiento del estado de la red. WorkManager garantiza la ejecución de la tarea incluso tras reiniciar el dispositivo.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Datos sincronizados")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Ejecutar tarea periódica cada 8 horas
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)
Para operaciones prolongadas visibles para el usuario, use Foreground Service. Un ejemplo de descarga de archivo con progreso en la notificación. El servicio llama a startForeground() con una notificación que no se puede descartar. Al completar la descarga — 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("Descargar archivo")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
En iOS, la ejecución en segundo plano se configura a través de BGTaskScheduler. Un ejemplo de registro y ejecución de una tarea de actualización de contenido. La aplicación debe registrar el identificador de la tarea en Info.plist y llamar a submit cuando la tarea deba programarse.
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 = {
// Guardar datos intermedios
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Para operaciones prolongadas (limpieza de caché, procesamiento de datos), use BGProcessingTask. El sistema concede hasta 10 minutos para la ejecución. Solo se ejecuta cuando el dispositivo está cargando y conectado a Wi-Fi. Requiere un identificador separado en Info.plist y registro a través de 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 e iOS difieren fundamentalmente en su filosofía de ejecución en segundo plano. Android ofrece herramientas flexibles con mayor control, pero requiere que el desarrollador elija la API correcta. iOS limita las capacidades pero garantiza un rendimiento estable y autonomía para el usuario.
| Criterio | Android | iOS |
|---|---|---|
| API recomendada | WorkManager | BGTaskScheduler |
| Tiempo máximo de tarea | Sin límite (Foreground Service) | 30 s / 10 min (processing) |
| Tareas periódicas | Sí, mediante PeriodicWorkRequest | Sí, mediante BGAppRefreshTask |
| Garantía de ejecución | Sí, incluso tras reinicio | No — el sistema decide cuándo |
| Acceso a red en segundo plano | Limitado por modo Doze | Mediante URLSession con background config |
| Geolocalización en segundo plano | Foreground Service + permiso | Background Mode location + NSLocation |
| Audio en segundo plano | Foreground Service con notificación multimedia | Background Mode audio + AVAudioSession |
WorkManager es óptimo para tareas que deben completarse independientemente del estado de la aplicación: sincronización de datos, envío de análisis, procesamiento de colas. La API garantiza la ejecución incluso tras apagar el dispositivo — la tarea se reprograma después del inicio.
BGTaskScheduler es adecuado para tareas que el sistema puede realizar en cualquier momento conveniente: descargar contenido nuevo, actualizar widgets, limpiar caché. No es adecuado para operaciones urgentes — el sistema retrasa la tarea si el dispositivo está en Doze o tiene poca batería.
Preguntas Frecuentes
Background Execution es un concepto general que describe cualquier código que se ejecuta en segundo plano. Background Modes es un mecanismo específico de iOS que permite a una aplicación realizar ciertos tipos de operaciones en segundo plano: audio, geolocalización, VoIP, fetch. Android utiliza un enfoque similar mediante tipos de Foreground Service.
En iOS, este es el límite estándar para BGAppRefreshTask. El sistema finaliza forzosamente la tarea al alcanzar el límite. En Android, ocurre una situación similar cuando la aplicación no usa WorkManager o Foreground Service — un Service normal es terminado por el sistema al pasar a segundo plano.
En Android, use WorkManager — garantiza la ejecución incluso tras reinicio. En iOS, la ejecución no se puede garantizar — el sistema decide cuándo ejecutar la tarea. La única forma de garantizar la ejecución es usar Background Modes (audio, location) con un indicador visible para el usuario.
En iOS, llame a UIApplication.shared.backgroundRefreshStatus — estado .available, .denied o .restricted. En Android, use PowerManager.isIgnoringBatteryOptimizations() para verificar la exención de optimización de batería. Para WorkManager no se requiere verificación — la API maneja las restricciones del sistema por sí misma.
Las notificaciones Push son el mecanismo principal para desencadenar acciones sin código en segundo plano. En iOS, están disponibles PushKit para VoIP y Silent Push para actualización de datos. En Android — High Priority FCM y Notification Trampoline. WebSockets a través de Foreground Service es una alternativa para aplicaciones en tiempo real.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también