Job Scheduler en Xamarin

Ricardo Josue Perez Altamirano
5 min readDec 18, 2019

--

Ha pasado, queremos realizar tareas background con xamarin Android o xamarin Forms y nos topamos con la siente pregunta ¿Cómo hacerlo?, este post es parte del Adviento de Xamarin , y bueno, empezamos.

A partir de la versión Android 5.0 Lollipop (API 21) presenta una API de planificador de trabajos a través de la clase JobScheduler. Esta API permite realizar trabajos por lotes cuando el dispositivo tiene más recursos disponibles, especificando la forma de trabajar, por ejemplo se pueden ejecutar operaciones solo si hay internet o solo si se está conectado el cargador. En general, esta API se puede utilizar para programar todo lo que no sea crítico para el usuario.

Unas ventajas son:

· Admite la programación por lotes de trabajos. El sistema Android puede combinar trabajos para reducir el consumo de batería. JobManager facilita el manejo de las cargas, ya que maneja automáticamente la falta de confiabilidad de la red. También sobrevive a los reinicios de la aplicación.

· Tareas que deben realizarse una vez que el dispositivo se conecta a una fuente de alimentación

· Tareas que requieren acceso a la red o una conexión Wi-Fi.

· Tarea que no es crítica o que el usuario enfrenta

· Tareas que deberían ejecutarse regularmente como lotes donde el tiempo no es crítico

Como implementarlo

Generar una clase que herede de la clase JobService.

Decorar esta subclase con el atributo [Service] y establezca el parámetro Name en una cadena compuesta por el nombre del paquete y el nombre de la clase.

Colocar la propiedad Permiso en ServiceAttribute en la cadena android.permission.BIND_JOB_SERVICE.

Implementar el método OnStartJob, agregando el código para realizar el trabajo. Android invocará este método en el hilo principal de la aplicación para ejecutar el trabajo. El trabajo que llevará más tiempo que unos pocos milisegundos se debe realizar en un hilo para evitar bloquear la aplicación.

Cuando se realiza el trabajo, JobService debe llamar al método JobFinished. Este método es cómo JobService le dice al JobScheduler que el trabajo está hecho. Si no llama a JobFinished, JobService presentará demandas innecesarias en el dispositivo, lo que acortará la vida útil de la batería, es importante recordar el llamado de este método.

Es una buena idea anular también el método OnStopJob. Android llama a este método cuando se cierra el trabajo antes de que finalice y proporciona al JobService la oportunidad de deshacerse de los recursos de manera adecuada. Este método debe devolver verdadero si es necesario reprogramar el trabajo, o falso si no es deseable volver a ejecutar el trabajo.

Lo voy a ejemplificar con un servicio que muestra la hora usado Xamarin Forms implementándolo en el proyecto de Android.

Paso 1:

Crear a clase y que herede de JobService:

Paso 2:

Implementar el método

La recomendación es que la ejecución sea con un hilo secundario y así poder dividir la carga de trabajo en hilos:

Fig A.

Fig B.

Fig. A

OnStartJob es llamado por el sistema Android cuando comienza su trabajo.

Si la tarea es corta y simple, se puede implementar la lógica directamente en onStartJob () y retornar false cuando haya terminado.

Pero para tareas complicadas, como la red, realice un subproceso en segundo plano y devuelva verdadero, dejando que el sistema sepa que todavía tiene un subproceso en ejecución y que debería retener su wakelock por un tiempo más.

Fig. B.

OnStopJob solo se llama si el trabajo se canceló antes de finalizar (en el ejemplo, se requiere que el dispositivo se esté cargando y se desconecte o no haya wifi disponible). Si el trabajo falla por algún motivo, se devuelve true desde onStopJob para reiniciar el trabajo.

Paso 3:

Invocar la ejecución

Fig. C

Fig. D

Fig. E

Fig. F

Fig C, D, E. en este ejemplo con Xamarin Forms se usara el proyecto Android para que en cuanto inicia nuestra app se ejecute el Job, para esto generamos una variable de tipo JosScheduler y devolvemos el identificador del servicio. Tomamos la clase Java correspondiente a nuestra clase en C# y usando el resultado creamos el componente de la aplicación para pasarlo el builder del Job.

Fig. E,F dependiendo de la versión de Android que corra el dispositivo es la manera en la cual se ejecuta el Job ya que cambia en Android 5 , 7 y 8, sin embargo las características de la construcción son similares ahora explico cada una:

· SetRequiredNetworkType: especifica que es necesario tener red (en este caso cualquier tipo de red ) para ejecutar el Job.

· SetPersisted: especifica que aunque se apague el celular podrá ejecutarse al arrancar el SO del mismo.

· SetPeriodic: Si tienes trabajo que debe hacerse regularmente, puede configurar un trabajo periódico. Esta es una gran alternativa a una alarma repetitiva para la mayoría de los desarrolladores. Debido a que lo resuelve todo una vez, lo programa y el trabajo se ejecutará una vez en cada período especificado.

· SetBackoffCriteria: Puedes especificar tu propia política de retroceso / re-intento. Esto predeterminado es una política exponencial, pero si estableces la propia y luego devuelve verdadero para re-programar un trabajo (con onStopJob (), por ejemplo), el sistema empleará tu política especificada sobre la predeterminada.

Luego de esto podremos hacer el build y el Schedule , cachar el resultado y realizar una acción dependiendo el resultado.

Paso 4:

Ejecución

Les agradezco su atención y si tienen dudas déjenlas en los comentarios y aquí nos ayudamos, este post es parte del primer calendario de adviento de xamarin en español https://www.luisbeltran.mx/2019/11/06/primer-calendario-de-adviento-de-xamarin-en-espanol/

Pueden seguirme en twitter

Fuente:

https://docs.microsoft.com/en-us/xamarin/android/platform/android-job-scheduler

https://developer.android.com/reference/android/app/job/JobScheduler

gracias y un saludo a todos.

--

--