Foreground Service es un servicio de Android que realiza operaciones de larga duración visibles para el usuario con una notificación obligatoria en la barra de estado. A diferencia de Background Service, que el sistema puede detener cuando faltan recursos, Foreground Service recibe alta prioridad y continúa funcionando incluso en condiciones de memoria limitada. Según la documentación de Android Developers, 2025, Foreground Service sigue siendo la única forma fiable de realizar tareas de larga duración en dispositivos con Android 12 y versiones posteriores.
Puntos clave
Foreground Service es un componente de Android diseñado para realizar operaciones que el usuario conoce y ve. Muestra una notificación persistente en el panel de notificaciones que no se puede deslizar — permanece activa mientras el servicio esté funcionando. Esta es la diferencia clave con un servicio en segundo plano, que opera desapercibido para el usuario.
El sistema Android considera Foreground Service como un proceso críticamente importante. Cuando falta memoria RAM, la plataforma finaliza primero los Background Services, luego las Activities en caché, y solo en casos excepcionales — Foreground Service. El OOM Killer asigna a dicho servicio un nivel ADJ de 2, lo que prácticamente elimina su finalización forzada.
Para iniciar Foreground Service, el desarrollador debe llamar al método startForeground() en los segundos posteriores a la creación del servicio, de lo contrario el sistema generará una excepción ForegroundServiceDidNotStartInTimeException. Este es un requisito estricto de la plataforma introducido para prevenir tareas en segundo plano no declaradas.
El mecanismo Foreground Service se introdujo en Android 1.0 con el primer SDK, pero la notificación obligatoria apareció en Android 9 (API 28). Antes de eso, un servicio podía ejecutarse en primer plano sin un indicador visible para el usuario. A partir de Android 9, Google endureció los requisitos: cualquier aplicación que llame a startForeground debe proporcionar una notificación en 5 segundos después del inicio del servicio.
En Android 12 (API 31) se agregaron restricciones para iniciar Foreground Service desde un contexto en segundo plano — ahora se requiere el permiso FOREGROUND_SERVICE_SPECIAL_USE para muchos escenarios. Android 14 (API 34) introdujo la declaración obligatoria de foregroundServiceType en el manifiesto, haciendo la arquitectura de servicios más transparente y predecible.
El mecanismo de funcionamiento de Foreground Service se basa en tres etapas clave: creación del servicio, vinculación de la notificación y ejecución de la tarea. El servicio hereda de la clase Service y sobrescribe el método onStartCommand(), en el que se llama a startForeground() con un identificador y un objeto Notification.
Después de llamar a startForeground(), el sistema mueve el proceso del servicio al grupo de primer plano con mayor prioridad de supervivencia. Esto significa que Android intentará mantener el proceso funcionando independientemente de la carga de memoria RAM. Foreground Service no puede ser detenido por el sistema en condiciones normales — solo mediante el deslizamiento del usuario sobre la notificación o una llamada explícita a stopSelf().
El ciclo de vida de Foreground Service se gestiona a través de los métodos onCreate(), onStartCommand() y onDestroy(). En onStartCommand(), el desarrollador define la estrategia de reinicio después de que el proceso sea eliminado — la constante START_STICKY obliga al sistema a recrear el servicio después de la recuperación de recursos, mientras que START_NOT_STICKY evita el reinicio automático.
Al iniciar Foreground Service, se ejecutan secuencialmente los pasos: llamada a startService(), creación del objeto Service en onCreate(), procesamiento del Intent en onStartCommand() y llamada a startForeground() con un objeto Notification. Si el servicio ya está funcionando y llega un nuevo Intent, solo se vuelve a llamar a onStartCommand() — onCreate() se ejecuta una sola vez durante la existencia del servicio.
La detención de Foreground Service se realiza mediante stopForeground() con el indicador REMOVE_NOTIFICATION, que oculta la notificación de la barra de estado. Inmediatamente después de eliminar la notificación, el sistema puede dejar de considerar el servicio como en primer plano y reducir su prioridad a Background Service, haciendo que el proceso sea vulnerable a la finalización.
PowerManager juega un papel importante en el funcionamiento de Foreground Service, ya que los modos de ahorro de energía de Android (Doze, App Standby) pueden limitar su capacidad para realizar tareas. Incluso en estado de primer plano, el servicio está sujeto a las políticas de batería — las solicitudes de red pueden retrasarse y los temporizadores sincronizarse con las ventanas de Doze. Para operaciones de larga duración tolerantes a retrasos, se recomienda usar Foreground Service en combinación con WorkManager.
A partir de Android 14 (API 34), Google introdujo la declaración obligatoria del tipo de Foreground Service en el manifiesto. Cada tipo define un escenario de uso permitido — el sistema verifica la conformidad entre el tipo declarado y el comportamiento real del servicio. Existen 9 tipos en total, pero los más utilizados son los siguientes.
El tipo dataSync está diseñado para sincronizar datos entre el dispositivo y el servidor, transferencias de archivos y copias de seguridad. Ejemplos incluyen la carga de fotos al almacenamiento en la nube, la sincronización de la base de datos con Firebase o la carga de registros a un servidor remoto. Este tipo requiere especificar la justificación en el manifiesto mediante el atributo android:foregroundServiceType="dataSync".
El tipo mediaPlayback se utiliza para reproducir audio y video en segundo plano — reproductores de música, clientes de podcasts, reproductores de vídeo. Es el único tipo que puede funcionar indefinidamente sin intervención del usuario. El canal de notificación debe tener alta prioridad y mostrar controles de reproducción — botones de reproducción, pausa, siguiente, anterior mediante MediaStyle.
El tipo location está destinado a servicios de geolocalización — aplicaciones de navegación, seguimiento de actividad, geocercas. Para Android 14+ es necesario declarar el permiso FOREGROUND_SERVICE_LOCATION y especificar el tipo en el manifiesto. La aplicación debe tener un permiso de ubicación activo en tiempo de ejecución, de lo contrario el sistema rechazará el inicio del servicio.
| Tipo | Permiso | Ejemplo de uso |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Sincronización de archivos con la nube |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Reproductor de música en segundo plano |
| location | FOREGROUND_SERVICE_LOCATION | Navegador GPS al conducir |
| camera | FOREGROUND_SERVICE_CAMERA | Aplicación de videovigilancia |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | Trabajo con dispositivo BLE |
La diferencia clave entre Foreground y Background Service es la presencia de una notificación visible y la prioridad de supervivencia. Background Service puede ser detenido por el sistema en cualquier momento cuando falta memoria, mientras que Foreground Service continúa funcionando gracias al elevado nivel adj del proceso en el mecanismo Low Memory Killer de Android.
Background Service no requiere notificación y puede ejecutarse desapercibido para el usuario. Sin embargo, a partir de Android 8 (API 26), Google restringió significativamente los servicios en segundo plano: startService() desde un contexto en segundo plano ya no funciona, y Context.startForegroundService() se volvió obligatorio para iniciar cualquier servicio que planee pasar a primer plano. El sistema también introdujo Background Execution Limits — un temporizador (actualmente 10 minutos) después del cual Background Service se detiene forzosamente.
Foreground Service, por el contrario, no tiene límite de tiempo. El servicio puede funcionar durante horas o días — hasta que el usuario lo detenga explícitamente o reinicie el dispositivo. Esto hace que Foreground Service sea la opción óptima para aplicaciones que requieren trabajo continuo en segundo plano: reproductores de música, rastreadores de actividad, aplicaciones de llamadas VoIP.
| Parámetro | Foreground Service | Background Service |
|---|---|---|
| Notificación | Obligatoria | No requerida |
| Tiempo de vida | Sin límite | Hasta 10 minutos (API 26+) |
| Prioridad del sistema | Alta (ADJ 2) | Baja (ADJ 8+) |
| Inicio API 26+ | startForegroundService() | Prohibido desde background |
A partir de Android 12 (API 31), Google introdujo restricciones significativas para iniciar Foreground Service. El cambio principal es la prohibición de llamar a startForegroundService() desde un contexto en segundo plano para la mayoría de los tipos de servicio. Las excepciones solo se aplican cuando el usuario dio su consentimiento explícito (por ejemplo, mediante el permiso FOREGROUND_SERVICE_SPECIAL_USE) o cuando el servicio se inicia en respuesta a la intención de difusión BOOT_COMPLETED.
El manifiesto de la aplicación con API objetivo 34+ debe contener un bloque foregroundServiceType para cada servicio declarado. Por ejemplo, para un servicio de sincronización de datos, se especifica android:foregroundServiceType="dataSync". Si no se especifica el tipo, el sistema considera el servicio inválido y lanza una excepción MissingForegroundServiceTypeException al intentar iniciarlo. Google Play también verifica la conformidad de los tipos y puede rechazar la publicación en caso de discrepancia.
En Android 14 (API 34), cada tipo de Foreground Service tiene un permiso correspondiente. El desarrollador debe declararlos en el manifiesto y solicitarlos en tiempo de ejecución antes de iniciar el servicio. Para dataSync se requiere FOREGROUND_SERVICE_DATA_SYNC, para mediaPlayback — FOREGROUND_SERVICE_MEDIA_PLAYBACK. El usuario puede revocar el permiso en la configuración, lo que detendrá el servicio activo.
Google también introdujo el mecanismo Foreground Service Notification Timeout en Android 14: si el servicio no llama a startForeground() en los 10 segundos posteriores a su creación, el sistema genera una excepción. Este endurecimiento está dirigido a combatir las aplicaciones que retrasan u omiten la llamada de notificación, funcionando efectivamente como Background Service disfrazado de primer plano.
Foreground Service se utiliza en una amplia gama de tareas que requieren ejecución garantizada en segundo plano. Los escenarios más comunes incluyen reproducción de medios, seguimiento de geolocalización, sincronización de datos y trabajo con dispositivos periféricos. Veamos cada uno en detalle.
Un ejemplo clásico es un reproductor de música que continúa la reproducción después de minimizar la aplicación. El servicio se inicia con una notificación MediaStyle, botones de control y utiliza el tipo mediaPlayback. El usuario ve información de la pista en la barra de estado y puede controlar la reproducción sin abrir la aplicación.
Las aplicaciones de navegación utilizan Foreground Service de tipo location para el seguimiento continuo de coordenadas. El servicio muestra una notificación con la velocidad actual, el tiempo de viaje y un botón para detener el seguimiento. Sin Foreground Service, el sistema dejaría de recibir coordenadas en segundo plano después de unos minutos, haciendo imposible la navegación.
Las aplicaciones de llamadas de voz y video — clientes VoIP — utilizan Foreground Service para mantener una conexión activa. El servicio de tipo phoneCall (desde Android 14) garantiza que una llamada no se interrumpa al minimizar la aplicación. La notificación muestra la duración de la llamada y controles de micrófono y altavoz.
Veamos la creación de un Foreground Service en Kotlin para sincronización de datos. El servicio se iniciará desde una Activity, mostrará una notificación con progreso y finalizará correctamente tras la finalización. El ejemplo demuestra todos los elementos obligatorios: declaración en el manifiesto, canal de notificación, llamada a startForeground() y manejo de 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,
"Sincronización",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Canal de sincronización de datos"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Sincronización")
.setContentText("Carga de datos al servidor")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Emulación de sincronización
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Para que el servicio funcione correctamente en Android 12+, es necesario declarar Foreground Service en AndroidManifest.xml especificando el tipo y los permisos necesarios. El atributo foregroundServiceType es obligatorio para API objetivo 34+, y los permisos FOREGROUND_SERVICE_DATA_SYNC y POST_NOTIFICATIONS deben solicitarse en tiempo de ejecución.
<!-- 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>
A pesar de su alta fiabilidad, Foreground Service tiene limitaciones. La principal es la visibilidad para el usuario. La aplicación no puede realizar tareas de larga duración en segundo plano sin una notificación, lo que no siempre es aceptable desde el punto de vista de UX. Además, el sistema puede detener forzosamente incluso Foreground Service cuando se excede el límite de tiempo para algunos tipos — por ejemplo, dataSync está limitado a varias horas de funcionamiento.
Una alternativa a Foreground Service es WorkManager, una biblioteca de Android Jetpack para tareas en segundo plano diferidas. WorkManager garantiza la ejecución de la tarea incluso después de reiniciar el dispositivo y admite cadenas de tareas, operaciones periódicas y restricciones de red y batería. Para la mayoría de las operaciones en segundo plano, Google recomienda WorkManager en lugar de un servicio directo.
JobScheduler es una API de Android integrada para programar tareas. Es adecuado para operaciones que pueden diferirse: sincronización por Wi-Fi, descarga de datos al conectar el cargador. JobScheduler agrupa tareas en ventanas para ahorrar batería, a diferencia de Foreground Service que funciona continuamente independientemente del estado de ahorro de energía.
Para tareas cortas (hasta 10–15 segundos), se puede usar CoroutineWorker de WorkManager con ejecución retrasada. Si una tarea debe ejecutarse estrictamente en un momento determinado, se utiliza AlarmManager junto con BroadcastReceiver. Por lo tanto, Foreground Service es una solución para operaciones continuas de larga duración, no una herramienta universal para todos los escenarios en segundo plano.
Preguntas frecuentes
Foreground Service es un servicio de Android con una notificación persistente en la barra de estado que realiza tareas de larga duración visibles para el usuario. Tiene alta prioridad de supervivencia y no es detenido por el sistema cuando falta memoria, a diferencia de Background Service.
Foreground Service muestra una notificación obligatoria, no tiene límite de tiempo y está protegido contra la finalización del sistema. Background Service es invisible para el usuario, funciona hasta 10 minutos (API 26+) y puede ser detenido por Low Memory Killer en cualquier momento.
Android 14 define 9 tipos: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health y remoteMessaging. Cada tipo requiere un permiso correspondiente y su declaración en el manifiesto mediante el atributo foregroundServiceType.
Si el servicio no llama a startForeground() en los 10 segundos posteriores a su creación (Android 14), el sistema genera una excepción ForegroundServiceDidNotStartInTimeException y detiene forzosamente el servicio. La aplicación también recibirá un ANR (Application Not Responding) si la operación se ejecuta en el hilo principal.
No, ocultar la notificación de Foreground Service mediante programación es imposible. A partir de Android 9 (API 28), la notificación es obligatoria y no puede ser descartada por el usuario. La única forma de eliminarla es detener el servicio llamando a stopForeground(REMOVE_NOTIFICATION) y stopSelf().
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