Implementación de servicios normales en Android
Clase 30 de 33 • Curso 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:
- Creamos una nueva clase, por ejemplo,
TrackItService
, que extienda la claseService
. - Añadimos anotación para facilitar inyección de dependencias:
@AndroidEntryPoint
. - Implementamos
onBind()
y lo dejamos en retorno nulo (null
). - Añadimos un
CoroutineScope
a nuestro servicio:
private var serviceScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
- Sobreescribimos el método
onStartCommand()
y creamos internamente métodos comostart()
ystop()
para iniciar y detener la tarea que queremos ejecutar en segundo plano. - Creamos un objeto compañero con constantes que indiquen comandos como
ACTION_START
yACTION_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!