Hola, les saluda Miguel y aquí les traigo un post.
Índice
Algunas tareas simplemente no deberían aplazarse
Cuando tenga que ejecutar tareas de ejecución prolongada mientras su aplicación está en segundo plano, encontrará restricciones para la ejecución en segundo plano que se introdujeron con Android 8.0.
Estas restricciones incentivan el comportamiento del desarrollador que mejora la experiencia del usuario de toda la plataforma.
Para facilitar la adaptación de diferentes casos de uso, también mejoramos la experiencia del desarrollador al trabajar con restricciones en segundo plano agregando funcionalidad a WorkManager.
Le recomendamos que utilice WorkManager para ejecutar tareas inmediatas de larga ejecución.
Siga y conozca los beneficios de usar WorkManager para la ejecución inmediata de tareas de larga ejecución y cómo configurar todo.
Introducción a la API
Comenzando con WorkManager versión 2.3.0, cada trabajador tiene acceso a métodos para ejecutar tareas en un servicio en primer plano. La clase base Trabajador, ListenableWorker
, proporciona una nueva función setForegroundAsync()
.
Esta publicación usa CoroutineWorker
con fines de demostración. En CoroutineWorker, setForegroundAsync()
está envuelto en una suspensión setForeground()
función.
doWork
función que permite ejecutar código desde el hilo principal. Pero todo el contenido de esta publicación también es aplicable a las funciones correspondientes para otras clases de trabajadores.Cuando usa setForeground (Async)
, la tarea programada se ejecutará en un servicio de primer plano, inmediatamente, una vez que se cumplan las restricciones. Como beneficio adicional, WorkManager se encarga de gestionar el ciclo de vida del servicio por usted.
Y el límite de tiempo de diez minutos para el trabajo en segundo plano no se aplicará al trabajo que está realizando en un trabajador que se ejecuta en un servicio en primer plano.
Empiece con la ejecución inmediata
Echemos un vistazo a cómo hacer que un trabajador existente ejecute trabajo en un servicio de primer plano.
Nuestro punto de partida es muy simplificado función doWork()
. El código se ejecuta de forma asincrónica y dependiendo de si tiene éxito o no, el correspondiente Result
es regresado.
/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */ override suspend fun doWork(): Result { try { // code to be executed return Result.success() } catch (throwable: Throwable) { // clean up and log return Result.failure() } }
En doWork()
también le dirá a WorkManager que la tarea debe ejecutarse inmediatamente y en un servicio de primer plano.
Para hacer esto, debe crear un ForegroundInfo
objeto y proporcionarlo a setForeground()
. ForegroundInfo toma un ID de notificación así como el Notification
que se mostrarán como parámetros.
Esta información se utiliza para configurar y ejecutar el servicio de primer plano una vez que se cumplen las restricciones.
Configurar ForegroundInfo
Configurar correctamente ForegroundInfo
es tan fácil como 1
, 2
, 3
:
- Crear una notificación.
- Crea un canal de notificación.
- Proporcionar la notificación a
ForegroundInfo
.
En el siguiente código, createForegroundInfo()
llamadas createNotification()
, que a su vez completa la notificación y crea el canal correspondiente.
/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */ /** * Create ForegroundInfo required to run a Worker in a foreground service. */ private fun createForegroundInfo(): ForegroundInfo { // Use a different id for each Notification. val notificationId = 1 return ForegroundInfo(notificationId, createNotification()) } /** * Create the notification and required channel (O+) for running work * in a foreground service. */ private fun createNotification(): Notification { // This PendingIntent can be used to cancel the Worker. val intent = WorkManager.getInstance(context).createCancelPendingIntent(id) val builder = Builder(context, channelId) .setContentTitle(title) .setTicker(title) .setSmallIcon(R.drawable.baseline_gradient) .setOngoing(true) .addAction(drawable.ic_delete, cancel, intent) if (VERSION.SDK_INT >= VERSION_CODES.O) { createNotificationChannel(channelId, name).also { builder.setChannelId(it.id) } } return builder.build() } /** * Create the required notification channel for O+ devices. */ @TargetApi(VERSION_CODES.O) private fun createNotificationChannel( channelId: String, name: String ): NotificationChannel { return NotificationChannel( channelId, name, NotificationManager.IMPORTANCE_LOW ).also { channel -> notificationManager.createNotificationChannel(channel) } }
Ejecutar trabajo en un servicio de primer plano
Ahora juntemos las cosas. Como ya tenemos una implementada función doWork()
, podemos llamar setForeground()
y pase la información requerida llamando createForegroundInfo()
.
/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */ override suspend fun doWork(): Result { try { setForeground(createForegroundInfo()) // code to be executed return Result.success(workDataOf(KEY_RESULT to result)) } catch (throwable: Throwable) { // clean up and log return Result.failure() } }
⚠️⚠️⚠️
LlamadasetForeground()
antes de que comience su tarea de larga duración. De lo contrario, su trabajador será tratado como un servicio que no es de primer plano hastasetForeground()
se ha llamado, lo que puede dar lugar a resultados no deseados, como la cancelación del trabajo.
⚠️⚠️⚠️
Próximos pasos
Ahora que sabe cuándo y cómo utilizar los trabajadores de larga duración, puede comenzar a implementarlos en su aplicación.
👩💻👨🏽💻 Para ver esto ejecutándose en un ejemplo, consulte el Ejemplo de WorkManager en GitHub. El código para ejecutar el trabajo en un servicio en primer plano se puede encontrar BaseFilterWorker clase y este compromiso.
🔖 Para obtener una guía detallada sobre los trabajadores de larga duración y los servicios de primer plano, eche un vistazo a la guía avanzada de WorkManager para trabajadores de larga duración.
🦮 Asegúrese de revisar la actualización Guía para el procesamiento en segundo plano y lee el Corutinas de Kotlin en Android para aprender más sobre el tema.
📚 Para obtener más información sobre WorkManager, Lyla y Pietro crearon una serie de blogs para guiarlo desde los conceptos básicos hasta las funciones avanzadas de WorkManager.
🐛 Informe cualquier problema que encuentre en el IssueTracker de Google. Esto nos ayudará a priorizar las funciones y las correcciones de errores a medida que aparezcan.
📝 Hágame saber cómo le funciona la ejecución de tareas inmediatas en un comentario.
Gracias por leer este post.
Añadir comentario