Implementación de servicios normales en Android

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

Resumen

¿Quieres aprender cómo funcionan los servicios en Android y cómo mantener tareas activas aún con la aplicación cerrada? En Android existen componentes clave que permiten ejecutar tareas en segundo plano denominados servicios. A continuación veremos cómo implementarlos paso a paso, desde los servicios simples hasta los foreground services.

¿Qué son los servicios en Android y para qué sirven?

Los servicios en Android realizan acciones sin necesidad de una interfaz gráfica. Existen dos tipos principales de servicios:

  • Servicios normales: ejecutan tareas en segundo plano sin garantizar persistencia cuando la aplicación es cerrada por el sistema operativo.
  • Foreground services: tienen prioridad alta y persisten aún con la aplicación cerrada, siempre y cuando muestren una notificación.

¿Cómo implementar un servicio normal en Android utilizando código?

Para iniciar, nos posicionamos en el proyecto TrackIt y realizamos los siguientes pasos:

  1. Creamos una nueva clase, por ejemplo, TrackItService, que extienda la clase Service.
  2. Añadimos anotación para facilitar inyección de dependencias: @AndroidEntryPoint.
  3. Implementamos onBind() y lo dejamos en retorno nulo (null).
  4. Añadimos un CoroutineScope a nuestro servicio:
private var serviceScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
  1. Sobreescribimos el método onStartCommand() y creamos internamente métodos como start() y stop() para iniciar y detener la tarea que queremos ejecutar en segundo plano.
  2. Creamos un objeto compañero con constantes que indiquen comandos como ACTION_START y ACTION_STOP.

¿Cómo controlar el estado del servicio y registrarlo en el manifiesto?

  • Usamos una variable interna tipo StateFlow para consultar fácilmente desde componentes externos si el servicio está activo:
private val _serviceActive = MutableStateFlow(false)
val serviceActive = _serviceActive.asStateFlow()
  • Registramos el servicio en AndroidManifest.xml:
<service android:name=".TrackItService"/>

¿Cómo interactuar con el servicio desde una Activity?

Utilizamos un Intent con un action desde nuestra actividad para iniciar o detener el servicio:

val intent = Intent(context, TrackItService::class.java).apply {
    action = TrackItService.ACTION_START
}
  • Implementamos desde composables, activities o efectos callbacks que envíen estos mensajes claramente según la interacción del usuario.

¿Cuál es la diferencia entre servicios normales y foreground services en la gestión del sistema?

Servicios normales no aseguran persistencia; el sistema operativo puede terminar la tarea si requiere liberar recursos. Por el contrario, foreground services sí aseguran persistencia mostrando una notificación visible para el usuario, aumentando así su prioridad en el sistema.

¿Te interesa conocer detalles adicionales sobre implementar foreground services para garantizar tareas permanentes? ¡Cuéntanos tus dudas en los comentarios!