Programación para móviles I
Propósito de aprendizaje de la asignatura:
El alumno desarrollará software mediante metodologías, entornos y lenguajes
de programación, hipermedia e interacción con el usuario, para satisfacer las
necesidades del mercado de aplicaciones de dispositivos móviles.
Unidad de aprendizaje II.
Diseño de aplicaciones de dispositivos móviles
Propósito esperado:
El alumno construirá maquetas de diseño de aplicaciones de dispositivos
móviles para satisfacer los requerimientos del proyecto de software.
Tema 01.
Introducción a los dispositivos móviles
Los Servicios en Android permiten ejecutar tareas en
segundo plano sin depender de la interfaz de usuario.
Es común usar Servicios para realizar tareas que requieren
ejecución prolongada, como:
• Descarga de archivos
• Reproducción de música
• Sincronización de datos
• Envío de notificaciones push
• Ubicación en tiempo real
Tipos de servicios
Servicios en Primer Plano (Foreground Services):
• Un servicio en primer plano realiza alguna operación que el usuario
puede detectar.
• Los servicios en primer plano deben mostrar una notificación.
• Los servicios en primer plano continúan ejecutándose incluso cuando el
usuario no interactúa con la app.
Servicios en Primer Plano (Foreground Services):
• Ejemplos de uso:
• Reproducción de música, al usuario se le informa mediante una
notificación de que se reproduce música, permitiendo interactuar con
el reproductor parando, pausando, avanzando, retrocediendo.
• Descarga de ficheros de gran tamaño, donde se muestra al usuario
el progreso de la descarga y también se permite la pausa o la
cancelación de la misma.
• Seguimiento del usuario mediante GPS e informándole que se están
capturando los datos.
Servicios en Segundo Plano (Background Services)
• Un servicio en segundo plano realiza una operación que el usuario no nota
directamente, es decir, no requieren interacción con el usuario.
• Se ejecutan sin mostrar una notificación.
• Se ejecuta solo cuando la aplicación se está ejecutando, por lo que se
cancelará cuando la aplicación termine.
• Evitar realizar tareas de larga duración ya que el sistema lo puede parar
cuando lo vea necesario.
• A partir de Android 8 (Oreo) están limitados por la batería y el sistema
operativo.
• A partir de la API 26 o versiones posteriores, el sistema impone restricciones
para ejecutar servicios en segundo plano cuando la app no está en primer
plano.
Servicios en Segundo Plano (Background Services)
• Como casos de uso pueden ser la sincronización de datos, copias de
seguridad automáticas y actualización de bases de datos.
• Una app podría usar un servicio para compactar su almacenamiento, por lo
general, sería un servicio en segundo plano.
Servicios vinculados (Bound Services):
• Un servicio vinculado ofrece una interfaz cliente-servidor que permite
que los componentes interactúen con el servicio, envíen solicitudes,
reciban resultados y, hasta, lo hagan en varios procesos con la
comunicación entre procesos (IPC).
• Un servicio vinculado se ejecuta solo mientras otro componente de la
aplicación está vinculado a él.
• Un bound service puede comunicarse directamente con el componente
al que está ligado, es decir, pueden compartir datos estructurados,
realizar operaciones en conjunto y gran variedad de interacciones
posibles donde un started service se ve limitado.
• Un servicio se vincula cuando un componente de la aplicación se vincula
a él llamando a bindService()
Ciclo de vida de los servicios en android
Implementación
1. Definir el servicio en el manifiesto
2. Crear la clase del servicio heredando de Service
3. Crear la notificación obligatoria
4. Iniciar y detener el servicio desde la UI en Jetpack Compose
Tipos de servicios
• mediaPlayback (reproducción de medios)
• dataSync (sincronización de datos)
• location (GPS)
• connectedDevice (dispositivos Bluetooth o USB)
• download (descargas)
<service
android:name=".MyForegroundService"
android:foregroundServiceType="mediaPlayback"
android:exported="false"
/>
onStartCommand
• START_NOT_STICKY: Indica que el servicio NO debe recrearse al
ser destruido sin importar que haya quedado un trabajo
pendiente.
• START_STICKY: Crea de nuevo el servicio después de haber sido
destruido por el sistema. En este caso llamará a
onStartCommand() referenciando un intent nulo.
• START_REDELIVER_INTENT: Crea de nuevo el servicio si el sistema
lo destruyó. A diferencia de START_STICKY, esta vez sí se retoma el
último intent que recibió el servicio.
Implementación
Arquitectura limpia
¿Dónde va el ForegroundService?
24
¿Dónde va el ForegroundService?
25
¿Dónde va el ForegroundService?
Flujo ideal para ejecutar un ForegroundService desde la UI
1. El usuario hace clic en un botón en la UI (Activity)
2. La UI llama a una función pública del ViewModel
3. El ViewModel solicita iniciar el ForegroundService (usando el Context)
4. El Service se encarga de:
• Llamar al caso de uso ubicado en domain/usecase/
• Ejecutar la lógica larga o de segundo plano (método onStartCommand)
5. El caso de uso usa el repositorio, fuente de datos, etc.
Flujo ideal para ejecutar un ForegroundService desde la UI
Manifest