Implementación de Servicios en Segundo Plano en Android

Clase 30 de 33Curso de Android: Integración de APIs nativas

Resumen

Android cuenta con diversos componentes principales, esenciales para desarrollar aplicaciones funcionales. Entre ellos destacan las actividades, encargadas de mostrar la interfaz al usuario mediante Compose AMOLED, y los servicios, que administran tareas en segundo plano, como el seguimiento de la ubicación del usuario.

¿Qué tipos de servicios existen en Android?

Existen dos categorías principales de servicios:

  • Servicios normales (normal services): Estos no tienen garantía de continuidad si el sistema operativo necesita liberar recursos; podrían detenerse si la aplicación es cerrada.
  • Servicios en primer plano (foreground services): Poseen un alto nivel de prioridad y garantizan su ejecución, siempre y cuando muestren una notificación persistente que indica su actividad al usuario.

¿Cómo crear un servicio normal en Android paso a paso?

Para implementar un servicio normal como el Tracking Service, es fundamental seguir estos pasos:

  1. Crear la clase del servicio: debe extender de la clase Service y llevar la anotación de Android Entry Point si se utiliza inyección de dependencias.

  2. Implementar métodos requeridos:

    • onBind(): establece vínculo entre actividades y servicios. Puede retornar nulo si no es necesario para nuestro caso.
    • onStartCommand(): determina cómo y cuándo se ejecuta el servicio.
  3. Gestionar la lógica del servicio:

  4. Definir variables internas (por ejemplo, isServiceActive) para garantizar que el servicio solo se ejecute una vez simultáneamente.
  5. Agregar funciones específicas como Start y Stop para iniciar y detener la tarea, manejando la cancelación de corrutinas adecuadamente.
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    when(intent?.action) {
        ACTION_START -> start()
        ACTION_STOP -> stop()
    }
    return START_STICKY
}
  1. Declarar el servicio en el manifiesto: esto permite que el sistema operativo pueda inicializarlo adecuadamente.
 android:name=".TrackingService" />
  1. Lanzar el servicio desde una actividad mediante intents:
Intent(context, TrackingService::class.java).apply {
    action = TrackingService.ACTION_START
}.also { context.startService(it) }

¿Qué sucede si se cierra la aplicación durante la ejecución del servicio normal?

Un servicio normal podría detenerse si la aplicación que lo conecta se cierra o el sistema operativo necesita recursos. Al hacer seguimiento a través de logs, se puede observar claramente cuándo el sistema operativo finaliza la ejecución del servicio.

Sin embargo, esta limitación es justamente lo que diferencia al servicio normal del foreground service, que asegura la continuidad incluso después del cierre de la aplicación, siempre y cuando se cumpla con ciertas condiciones, como mostrar continuamente una notificación persistente.

Aprender a usar estos servicios según tus necesidades te permitirá desarrollar aplicaciones robustas y eficientes.

Si tienes dudas o deseas profundizar en algún aspecto en particular, ¡te invitamos a compartir tu comentario!