Background Service — qué es, tipos y cómo funciona en Android

Autor: IT Sectr Publicado: 2026-03-27 Tiempo de lectura: 8 min

Background Service es un componente de Android diseñado para ejecutar operaciones prolongadas en segundo plano sin interfaz de usuario. A diferencia de Activity, Service continúa funcionando incluso después de que la aplicación se minimiza o el usuario cambia a otra aplicación. Según Android Developers, 2026, existen tres tipos de servicios: Started Service, Bound Service y Foreground Service, cada uno con su propio ciclo de vida y ámbito de aplicación.

Puntos clave

  • Background Service es un componente de Android para operaciones en segundo plano sin UI, que funciona independientemente de cualquier actividad.
  • Started Service se inicia mediante startService y funciona hasta que se detiene explícitamente con stopSelf.
  • Bound Service se vincula a un componente mediante bindService y vive mientras haya clientes conectados.
  • Foreground Service muestra una notificación persistente y el sistema no lo elimina cuando la batería está baja.
  • Desde Android 8, los servicios en segundo plano tienen restricciones estrictas para su inicio en segundo plano.

¿Qué es Background Service en Android?

Background Service (o simplemente Service) es uno de los cuatro componentes fundamentales de una aplicación Android, junto con Activity, BroadcastReceiver y ContentProvider. A diferencia de Activity, Service no tiene interfaz visual y está diseñado para realizar operaciones que deben continuar independientemente de si la aplicación está en primer plano o no.

Service se ejecuta en el hilo principal de la aplicación, por lo que cualquier operación bloqueante dentro de él requiere crear un hilo separado. Si no se hace esto, el sistema lanzará un ANR (Application Not Responding). Para operaciones simples en segundo plano, Android proporciona IntentService, que crea automáticamente un hilo de trabajo. En proyectos modernos, se recomienda usar corrutinas de Kotlin con CoroutineScope dentro de Service para procesamiento asíncrono sin bloquear el hilo principal.

El propósito principal de Service es reproducir música, descargar archivos, manejar solicitudes de red, sincronizar datos y otras tareas que deben continuar después de que el usuario salga de la aplicación. Sin embargo, desde Android 8, los desarrolladores deben elegir conscientemente entre los tipos de servicios, teniendo en cuenta las restricciones del trabajo en segundo plano.

¿Cómo funciona el ciclo de vida de Service?

Service tiene su propio ciclo de vida, que difiere de Activity. Incluye cuatro métodos clave: onCreate, onStartCommand, onBind y onDestroy. Comprender este ciclo es esencial para implementar correctamente tareas en segundo plano sin fugas de memoria.

onCreate y onStartCommand

El método onCreate se llama cuando se crea el servicio, una vez durante su vida. Aquí se inicializan recursos como temporizadores, conexiones de base de datos y sockets. El método onStartCommand se llama cada vez que se invoca startService, permitiendo enviar comandos a un servicio ya en ejecución. El valor de retorno determina el comportamiento del sistema al reiniciar.

kotlin
class DownloadService : Service() {

    override fun onCreate() {
        super.onCreate()
        initializeDownloader()
    }

    override fun onStartCommand(
        intent: Intent?,
        flags: Int,
        startId: Int
    ): Int {
        downloadFile(intent?.getStringExtra("url"))
        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? = null
}

onBind y onDestroy

onBind se llama al vincular un servicio mediante bindService y devuelve un objeto IBinder para la interacción con el cliente. Este método se usa solo para Bound Service. onDestroy es la última llamada antes de destruir el servicio. Aquí se liberan todos los recursos, se detienen hilos y se cancelan tareas.

Tipos de servicios en segundo plano

Android ofrece tres tipos de Service, cada uno diseñado para su propio escenario. Elegir el tipo incorrecto puede provocar un comportamiento inestable de la aplicación o un consumo excesivo de batería.

Started Service

Started Service se inicia llamando a startService y funciona hasta que llama a stopSelf o stopService. Es adecuado para tareas que deben ejecutarse de inmediato: enviar análisis, procesar una imagen, descargar un archivo. Al finalizar su trabajo, el servicio se detiene solo.

Bound Service

Bound Service proporciona una interfaz cliente-servidor, permitiendo que una Activity, Fragment u otro componente interactúe con el servicio. El servicio vive mientras haya al menos un cliente vinculado. Cuando todos los clientes se desvinculan, el servicio se destruye. Bound Service es útil para tareas que requieren comunicación bidireccional: reproductor de música, navegación.

Foreground Service

Foreground Service es un Started Service con una notificación persistente en la barra de estado. El sistema considera que dicho servicio está activo y no lo elimina incluso con poca memoria. Foreground Service es obligatorio para la reproducción de música, grabación de audio, seguimiento de ubicación y otras tareas importantes para el usuario.

ParámetroStartedBoundForeground
IniciostartServicebindServicestartForeground
Vidahasta stopSelfmientras haya clienteshasta stopForeground
Notificaciónnonoobligatoria
Eliminableno
Ejemplodescargareproductormúsica

Creación y ejecución de Service

Crear un servicio comienza declarando una clase que hereda de Service y registrándola en AndroidManifest.xml. Sin el registro en el manifiesto, el sistema no podrá iniciar el servicio y cualquier llamada a startService provocará una excepción.

kotlin
// Registro en AndroidManifest.xml
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {

    override fun onStartCommand(
        intent: Intent?,
        flags: Int,
        startId: Int
    ): Int {
        startForeground(
            NOTIFICATION_ID,
            createNotification()
        )
        performSync(intent)
        return START_NOT_STICKY
    }
}

Para iniciar un servicio desde una Activity o Fragment, se utiliza un Intent con una referencia explícita a la clase del servicio. A partir de Android 8, Foreground Service requiere el permiso FOREGROUND_SERVICE en el manifiesto.

kotlin
// Iniciar un Started Service
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)

// Iniciar un Foreground Service (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent)
} else {
    startService(intent)
}

Restricciones en Android 8+

A partir de Android 8 (API 26), Google introdujo restricciones estrictas para los servicios en segundo plano. El inicio de un servicio en segundo plano (cuando la aplicación no está en primer plano) solo está permitido en casos excepcionales: al recibir una notificación push, después del inicio del dispositivo o mediante JobScheduler.

Para tareas prolongadas que no requieren ejecución inmediata, se recomienda usar WorkManager o JobScheduler. Si una aplicación realmente necesita un servicio en ejecución, la única forma es un Foreground Service con una notificación visible para el usuario. Iniciar un servicio sin notificación en segundo plano será ignorado por el sistema.

JobIntentService para compatibilidad con versiones anteriores

JobIntentService es una clase especializada que apareció en la biblioteca de soporte para funcionar en Android 5+. Combina el comportamiento de IntentService (hilo de trabajo automático, procesamiento secuencial) con la planificación mediante JobScheduler. En Android 8+, JobIntentService usa JobScheduler internamente, y en versiones anteriores, un Service normal. Esto permite manejar de manera uniforme las tareas en segundo plano sin verificaciones adicionales de la versión de Android.

kotlin
class UploadJobService : JobIntentService() {

    companion object {
        private const val JOB_ID = 1000

        fun enqueueWork(context: Context, work: Intent) {
            enqueueWork(
                context,
                UploadJobService::class.java,
                JOB_ID,
                work
            )
        }
    }

    override fun onHandleWork(intent: Intent) {
        val fileUri = intent.getStringExtra("file_uri")
        // Se ejecuta en un hilo de fondo
        uploadFile(fileUri)
    }
}

Gestión de memoria y fugas en Service

Uno de los problemas comunes al trabajar con Background Service son las fugas de memoria. Dado que un Service puede durar más que una Activity, las referencias a Activity dentro de Service (a través de listener, callback o broadcast) impiden la recolección de basura de los componentes de UI. Se recomienda usar WeakReference, ViewModel o LiveData para la comunicación Service-UI. En onDestroy, asegúrese de cancelar todas las suscripciones, detener hilos y cerrar cursores.

Service vs WorkManager: cuándo elegir cada uno

La elección entre Background Service y WorkManager depende del escenario. Service es adecuado para tareas que deben ejecutarse de inmediato y de forma continua: reproducción de música, grabación de audio, seguimiento GPS. WorkManager es mejor para tareas diferidas y garantizadas: sincronización, envío de análisis, carga de registros. WorkManager sobrevive a los reinicios del dispositivo, mientras que Service no. Service puede ser Foreground con notificación, mientras que WorkManager funciona silenciosamente en segundo plano. En la práctica, los desarrolladores combinan ambos enfoques: Foreground Service para tareas críticas para el usuario y WorkManager para mantenimiento en segundo plano.

Android 12 introdujo el indicador android:foregroundServiceType, que requiere especificar el tipo de servicio: dataSync, camera, connectedDevice, location, mediaPlayback y otros. La especificación incorrecta del tipo provoca una excepción al iniciar. Esta práctica hace que Background Service sea más transparente tanto para el usuario como para el sistema.

Ejemplo de registro de Service en AndroidManifest

El registro adecuado de Service en el manifiesto incluye el atributo exported (accesibilidad para aplicaciones externas), foregroundServiceType (tipo de servicio en segundo plano en Android 12+) y permiso. Para Bound Service, también es necesario declarar android:permission="android.permission.BIND_JOB_SERVICE" para JobIntentService. Sin el registro en el manifiesto, cualquier llamada a startService o bindService lanzará una excepción, por lo que verificar el manifiesto es el primer paso al diagnosticar problemas relacionados con Service.

Preguntas frecuentes

¿En qué hilo se ejecuta Service por defecto?

Service se ejecuta en el hilo principal (UI Thread) de la aplicación. Cualquier operación bloqueante dentro de onStartCommand o onHandleIntent debe moverse a un hilo separado o corrutina, de lo contrario el sistema lanzará un ANR después de 5 segundos.

¿En qué se diferencia IntentService de un Service normal?

IntentService es una subclase de Service que crea automáticamente un hilo de trabajo y procesa comandos secuencialmente. Después de completar la última tarea, IntentService se detiene solo. A partir de Android 8, IntentService se considera obsoleto en favor de JobIntentService o WorkManager.

¿Se puede iniciar un Service cuando la aplicación está en segundo plano en Android 12?

Iniciar un Started Service desde segundo plano en Android 12 está prohibido. La excepción es un Foreground Service con foregroundServiceType declarado en el manifiesto y una notificación válida. También se permite un inicio breve después de recibir un mensaje FCM de alta prioridad.

¿Cómo pasar datos de Service a Activity?

Existen tres métodos: BroadcastReceiver con broadcast local, el mecanismo Messenger mediante Handler, y LiveData/Flow en arquitectura MVVM con un ViewModel compartido. Para Bound Service, se usa IBinder con llamadas directas a métodos.

¿Qué sucede cuando se reinicia la aplicación si un Service estaba funcionando?

Si un Service se inició con el indicador START_STICKY, el sistema lo reiniciará después de que el proceso se elimine por falta de memoria. El indicador START_NOT_STICKY significa que el sistema no reiniciará el servicio. START_REDELIVER_INTENT es similar a START_STICKY pero entrega el último Intent.

Resumen

  • Background Service es un componente de Android para operaciones en segundo plano sin UI, que se ejecuta en el hilo principal.
  • Tres tipos — Started, Bound y Foreground — cubren diferentes escenarios, desde tareas únicas hasta trabajo persistente con notificaciones.
  • Ciclo de vida incluye onCreate, onStartCommand, onBind y onDestroy — es importante liberar recursos en onDestroy.
  • Foreground Service es el único tipo que funciona de manera confiable en Android 8+ sin riesgo de ser eliminado por el sistema.
  • WorkManager y JobScheduler son preferibles para tareas en segundo plano diferidas y garantizadas.
  • No uses Service para tareas que requieren una ejecución precisa en el tiempo — usa AlarmManager en su lugar.
  • Registra siempre Service en AndroidManifest.xml y especifica android:foregroundServiceType en Android 12+.

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.

Discutir el proyecto

Lea también