Uso de la API JobScheduler en Android Lollipop

En este tutorial, aprenderás a usar el JobScheduler API disponible en Android Lollipop. los JobScheduler API permite a los desarrolladores crear trabajos que se ejecutan en segundo plano cuando se cumplen ciertas condiciones.

Introducción

Al trabajar con Android, habrá ocasiones en las que querrá ejecutar una tarea en un momento posterior o bajo ciertas condiciones, como cuando un dispositivo está conectado a una fuente de alimentación o conectado a una red Wi-Fi. Afortunadamente, con la API 21, conocida por la mayoría de las personas como Android Lollipop, Google ha proporcionado un nuevo componente conocido como JobScheduler API para manejar este mismo escenario.

los JobScheduler La API realiza una operación para su aplicación cuando se cumple un conjunto de condiciones predefinidas. A diferencia del AlarmManager clase, el tiempo no es exacto además, el JobScheduler La API puede realizar varios trabajos por lotes para ejecutar juntos. Esto permite que su aplicación realice la tarea dada mientras se considera la batería del dispositivo al costo del control de tiempo.

En este artículo, aprenderás más sobre el JobScheduler API y el Servicio de trabajo clase usándolos para ejecutar una tarea de fondo simple en una aplicación de Android. El código para este tutorial está disponible en GitHub..

1. Creando el Servicio de Trabajo

Para comenzar, querrá crear un nuevo proyecto de Android con una API mínima requerida de 21, ya que JobScheduler La API se agregó en la versión más reciente de Android y, en el momento de la escritura, no es compatible con versiones anteriores a través de una biblioteca de soporte.

Suponiendo que está utilizando Android Studio, después de haber presionado el botón finalizado para el nuevo proyecto, debe tener una aplicación básica "Hello World". El primer paso que tomará con este proyecto es crear una nueva clase de Java. Para mantener las cosas simples, llamémoslo. JobSchedulerService y extender el Servicio de trabajo clase, que requiere que se creen dos métodos onStartJob (JobParameters params) y onStopJob (JobParameters params).

public class JobSchedulerService extiende JobService @Override public boolean onStartJob (JobParameters params) return false;  @Override public boolean onStopJob (JobParameters params) return false; 

onStartJob (JobParameters params) es el método que debe usar cuando comienza su tarea, porque es lo que el sistema usa para desencadenar trabajos que ya se han programado. Como puede ver, el método devuelve un valor booleano. Si el valor de retorno es falso, el sistema asume que cualquier tarea que se haya ejecutado no tomó mucho tiempo y se realiza en el momento en que se devuelve el método. Si el valor de retorno es cierto, entonces el sistema asume que la tarea tomará algún tiempo y la carga recae sobre usted, el desarrollador, para avisar al sistema cuando se complete la tarea dada llamando al jobFinished (JobParameters params, boolean needsRescheduled).

onStopJob (JobParameters params) es utilizado por el sistema para cancelar tareas pendientes cuando se recibe una solicitud de cancelación. Es importante tener en cuenta que si onStartJob (JobParameters params) devoluciones falso, el sistema asume que no hay trabajos en ejecución cuando se recibe una solicitud de cancelación. En otras palabras, simplemente no llamará onStopJob (JobParameters params).

Una cosa a tener en cuenta es que el servicio de trabajo se ejecuta en el subproceso principal de su aplicación. Esto significa que tu Tiene que utilice otro hilo, un controlador o una tarea asíncrona para ejecutar tareas más largas para no bloquear el hilo principal. Debido a que las técnicas de multihilo están fuera del alcance de este tutorial, seamos sencillos e implementemos un controlador para ejecutar nuestra tarea en el JobSchedulerService clase.

private Handler mJobHandler = new Handler (new Handler.Callback () @Override public boolean handleMessage (Mensaje de mensaje) Toast.makeText (getApplicationContext (), "JobService task running", Toast.LENGTH_SHORT) .show (); jobFinished () JobParameters) msg.obj, false); return true;);

En el manejador, implementas el handleMessage (Mensaje msg) método que es parte de Entrenador de animales Instale y haga que ejecute la lógica de su tarea. En este caso, estamos manteniendo las cosas muy simples y publicamos un tostada mensaje de la aplicación, aunque aquí es donde pondría su lógica para cosas como la sincronización de datos.

Cuando la tarea está terminada, necesitas llamar jobFinished (JobParameters params, boolean needsRescheduled) para que el sistema sepa que ha terminado con esa tarea y que puede comenzar a poner en cola la próxima operación. Si no hace esto, sus trabajos solo se ejecutarán una vez y su aplicación no podrá realizar trabajos adicionales.

Los dos parámetros que jobFinished (JobParameters params, boolean needsRescheduled) las tomas son JobParameters que fueron pasados ​​a la Servicio de trabajo clase en el onStartJob (JobParameters params) Método y un valor booleano que le permite al sistema saber si debe reprogramar el trabajo basándose en los requisitos originales del trabajo. Es útil comprender este valor booleano, ya que es la forma en que maneja las situaciones en las que su tarea no puede completarse debido a otros problemas, como una llamada de red fallida.

Con el Entrenador de animales instancia creada, puede seguir adelante y comenzar a implementar el onStartJob (JobParameters params) y onStopJob (JobParameters params) Métodos para controlar tus tareas. Notarás que en el siguiente fragmento de código, el onStartJob (JobParameters params) método devuelve cierto. Esto es porque vas a usar un Entrenador de animales para controlar su operación, lo que significa que podría llevar más tiempo terminar que la onStartJob (JobParameters params) método. Volviendo cierto, le está informando a la aplicación que llamará al jobFinished (JobParameters params, boolean needsRescheduled) método. También notarás que el número 1 está siendo pasado a la Entrenador de animales ejemplo. Este es el identificador que usará para hacer referencia al trabajo.

@Override public boolean onStartJob (JobParameters params) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, params)); devuelve verdadero  @Override public boolean onStopJob (JobParameters params) mJobHandler.removeMessages (1); falso retorno; 

Una vez que haya terminado con la parte de Java del JobSchedulerServiceclase, tienes que entrar en AndroidManifest.xml y agrega un nodo para el servicio, de modo que su aplicación tenga permiso para enlazar y usar esta clase como Servicio de trabajo.

2. Creando el Programador de Trabajos

Con JobSchedulerServiceclase terminada, podemos empezar a ver cómo interactuará su aplicación con el JobScheduler API. Lo primero que tendrá que hacer es crear un JobScheduler objeto, llamado mJobScheduler en el código de ejemplo, e inicialícelo obteniendo una instancia del servicio del sistema JOB_SCHEDULER_SERVICE. En la aplicación de ejemplo, esto se hace en el Actividad principalclase.

mJobScheduler = (JobScheduler) getSystemService (Context.JOB_SCHEDULER_SERVICE);

Cuando desee crear su tarea programada, puede utilizar el JobInfo.Builder para construir un JobInfo Objeto que se pasa a su servicio. Para crear un JobInfo objeto, JobInfo.Builder Acepta dos parámetros. El primero es el identificador del trabajo que ejecutará y el segundo es el nombre del componente del servicio que usará con el JobScheduler API.

JobInfo.Builder builder = new JobInfo.Builder (1, nuevo ComponentName (getPackageName (), JobSchedulerService.class.getName ()));

Este generador le permite configurar muchas opciones diferentes para controlar cuándo se ejecutará su trabajo. El siguiente fragmento de código muestra cómo puede configurar su tarea para que se ejecute periódicamente cada tres segundos.

builder.setPeriodic (3000);

Otros métodos incluyen:

  • setMinimumLatency (long minLatencyMillis): Esto hace que su trabajo no se inicie hasta que hayan transcurrido los milisegundos indicados. Esto es incompatible con setPeriodic (tiempo largo) y será hacer que se lance una excepción si ambos se usan.
  • setOverrideDeadline (long maxExecutionDelayMillis): Esto establecerá una fecha límite para su trabajo. Incluso si no se cumplen otros requisitos, su tarea comenzará aproximadamente cuando haya transcurrido el tiempo indicado. Me gusta setMinimumLatency (tiempo largo), esta función es mutuamente excluyente con setPeriodic (tiempo largo) y será hacer que se lance una excepción si ambos se usan.
  • setPersisted (boolean isPersisted): Esta función le dice al sistema si su tarea debe continuar existiendo después de que el dispositivo se haya reiniciado.
  • setRequiredNetworkType (int networkType): Esta función le dirá a su trabajo que solo se puede iniciar si el dispositivo está en un tipo específico de red. El valor predeterminado es JobInfo.NETWORK_TYPE_NONE, lo que significa que la tarea puede ejecutarse ya sea que haya conectividad de red o no. Los otros dos tipos disponibles son JobInfo.NETWORK_TYPE_ANY, que requiere algún tipo de conexión de red disponible para que el trabajo se ejecute, y JobInfo.NETWORK_TYPE_UNMETERED, lo que requiere que el dispositivo esté en una red no celular.
  • setRequiresCharging (boolean requireCharging): El uso de esta función le indicará a su aplicación que el trabajo no debe comenzar hasta que el dispositivo haya comenzado a cargarse.
  • setRequiresDeviceIdle (boolean requireDeviceIdle): Esto le dice a su trabajo que no comience a menos que el usuario no esté usando su dispositivo y no lo haya usado por algún tiempo.

Es importante tener en cuenta que setRequiredNetworkType (int networkType), setRequiresCharging (boolean requireCharging) y setRequiresDeviceIdle (boolean requireIdle) puede causar que su trabajo nunca comience a menos que setOverrideDeadline (tiempo largo) también está establecido, permitiendo que su trabajo se ejecute incluso si no se cumplen las condiciones. Una vez que se establezcan las condiciones preferidas, puede construir el JobInfo objetar y enviarlo a su JobScheduler objeto como se muestra a continuación.

if (mJobScheduler.schedule (builder.build ()) <= 0 )  //If something goes wrong 

Notarás que el programar La operación devuelve un entero. Si programar falla, devolverá un valor de cero o menos, correspondiente a un código de error. De lo contrario, devolverá el identificador de trabajo que definimos en el JobInfo.Builder.

Si su aplicación requiere que detenga una tarea específica o todas, puede hacerlo llamando al cancelar (int jobId) o cancelalo todo() sobre el JobScheduler objeto.

mJobScheduler.cancelAll ();

Ahora debería poder utilizar el JobScheduler API con sus propias aplicaciones para realizar trabajos por lotes y ejecutar operaciones en segundo plano.

Conclusión

En este artículo, has aprendido cómo implementar un Servicio de trabajo subclase que utiliza una Entrenador de animales objeto para ejecutar tareas en segundo plano para su aplicación. También has aprendido a usar el JobInfo.Builder para establecer los requisitos para cuando su servicio debe ejecutarse. Con estos, debería poder mejorar el funcionamiento de sus propias aplicaciones teniendo en cuenta el consumo de energía..