Utilisation de l'API JobScheduler sur Android Lollipop

Dans ce tutoriel, vous apprendrez à utiliser le JobScheduler API disponible dans Android Lollipop. le JobScheduler L'API permet aux développeurs de créer des tâches qui s'exécutent en arrière-plan lorsque certaines conditions sont remplies.

introduction

Lorsque vous travaillez avec Android, vous souhaiterez parfois exécuter une tâche ultérieurement ou dans certaines conditions, par exemple lorsqu'un périphérique est branché sur une source d'alimentation ou sur un réseau Wi-Fi. Heureusement, avec API 21, connu sous le nom de Android Lollipop par la plupart des gens, Google a fourni un nouveau composant appelé JobScheduler API pour gérer ce scénario même.

le JobScheduler L'API effectue une opération pour votre application lorsqu'un ensemble de conditions prédéfinies est rempli. Contrairement à la AlarmManager classe, le timing n'est pas exact. De plus, le JobScheduler L'API est capable de mettre en lots divers travaux à exécuter ensemble. Cela permet à votre application d'effectuer la tâche donnée tout en tenant compte de la batterie de l'appareil au détriment du contrôle de la synchronisation..

Dans cet article, vous en apprendrez plus sur le JobScheduler API et le JobService classe en les utilisant pour exécuter une tâche d’arrière-plan simple dans une application Android. Le code de ce tutoriel est disponible sur GitHub.

1. Création du service de travail

Pour commencer, vous allez créer un nouveau projet Android avec une API minimale requise de 21, car le JobScheduler L'API a été ajoutée à la version la plus récente d'Android et, au moment de la rédaction de ce document, n'est pas rétrocompatible avec une bibliothèque de support..

En supposant que vous utilisiez Android Studio, une fois que vous avez cliqué sur le bouton terminé pour le nouveau projet, vous devriez avoir une application "Hello World" dépouillée. La première étape de ce projet consiste à créer une nouvelle classe Java. Pour garder les choses simples, nommons-le JobSchedulerService et étendre le JobService classe, qui nécessite la création de deux méthodes onStartJob (paramètres JobParameters) et onStopJob (paramètres JobParameters).

Classe publique JobSchedulerService étend JobService @Override public boolean onStartJob (paramètres JobParameters) return false;  @Override public boolean onStopJob (paramètres JobParameters) return false; 

onStartJob (paramètres JobParameters) est la méthode que vous devez utiliser lorsque vous démarrez votre tâche, car c’est ce que le système utilise pour déclencher des travaux déjà planifiés. Comme vous pouvez le constater, la méthode retourne une valeur booléenne. Si la valeur de retour est faux, le système suppose que la tâche exécutée n'a pas pris beaucoup de temps et est terminée au moment du retour de la méthode. Si la valeur de retour est vrai, alors le système suppose que la tâche va prendre un certain temps et que le développeur a la charge de dire au système à quel moment la tâche est terminée en appelant jobFinished (paramètres JobParameters, besoins booléens programmés).

onStopJob (paramètres JobParameters) est utilisé par le système pour annuler les tâches en attente lorsqu'une demande d'annulation est reçue. Il est important de noter que si onStartJob (paramètres JobParameters) résultats faux, le système suppose qu'aucune tâche n'est en cours d'exécution lorsqu'une demande d'annulation est reçue. En d'autres termes, il ne sera tout simplement pas appeler onStopJob (paramètres JobParameters).

Une chose à noter est que le service de travail s'exécute sur le thread principal de votre application. Cela signifie que vous devoir utilisez un autre thread, un gestionnaire ou une tâche asynchrone pour exécuter des tâches plus longues sans bloquer le thread principal. Comme les techniques de multithreading sortent du cadre de ce didacticiel, restons simples et implémentons un gestionnaire pour exécuter notre tâche dans le processus. JobSchedulerService classe.

private Handler mJobHandler = new Handler (new Handler.Callback () @Override public boolean handleMessage (Message msg) Toast.makeText (getApplicationContext (), "tâche JobService en cours d'exécution", Toast.LENGTH_SHORT) .show (); jobFinished () JobParameters) msg.obj, false); return true;);

Dans le gestionnaire, vous implémentez le handleMessage (Message msg) méthode qui fait partie de Gestionnaire exemple et le faire exécuter la logique de votre tâche. Dans ce cas, nous gardons les choses très simples et postons un Pain grillé message de l'application, bien que ce soit là que vous mettriez votre logique pour des choses comme la synchronisation des données.

Lorsque la tâche est terminée, vous devez appeler jobFinished (paramètres JobParameters, besoins booléens programmés) pour que le système sache que vous avez terminé cette tâche et qu'il peut commencer à faire la queue pour la prochaine opération. Si vous ne le faites pas, vos travaux ne seront exécutés qu'une seule fois et votre application ne sera pas autorisée à effectuer des travaux supplémentaires..

Les deux paramètres qui jobFinished (paramètres JobParameters, besoins booléens programmés) prend sont les JobParameters qui ont été transmis à la JobService classe dans le onStartJob (paramètres JobParameters) méthode et une valeur booléenne qui permet au système de savoir s'il doit replanifier le travail en fonction de ses exigences d'origine. Cette valeur booléenne est utile à comprendre, car c’est la façon dont vous gérez les situations dans lesquelles votre tâche est impossible à terminer en raison d’autres problèmes, tels qu’un appel réseau ayant échoué..

Avec le Gestionnaire par exemple, vous pouvez aller de l'avant et commencer à mettre en œuvre le onStartJob (paramètres JobParameters) et onStopJob (paramètres JobParameters) méthodes pour contrôler vos tâches. Vous remarquerez que dans l'extrait de code suivant, le onStartJob (paramètres JobParameters) retours de méthode vrai. C’est parce que vous allez utiliser un Gestionnaire exemple pour contrôler votre opération, ce qui signifie que cela pourrait prendre plus de temps que le onStartJob (paramètres JobParameters) méthode. En retournant vrai, vous laissez l'application savoir que vous appelez manuellement le jobFinished (paramètres JobParameters, besoins booléens programmés) méthode. Vous remarquerez également que le nombre 1 est passé au Gestionnaire exemple. C'est l'identifiant que vous allez utiliser pour référencer le travail.

@Override public boolean onStartJob (paramètres JobParameters) mJobHandler.sendMessage (Message.obtain (mJobHandler, 1, paramètres)); retourne vrai;  @Override public boolean onStopJob (paramètres JobParameters) mJobHandler.removeMessages (1); retourne faux; 

Une fois que vous avez terminé avec la partie Java du JobSchedulerServiceclasse, vous devez aller dans AndroidManifest.xml et ajouter un noeud pour le service afin que votre application ait la permission de se lier et d'utiliser cette classe en tant que JobService.

2. Création du planificateur de travaux

Avec JobSchedulerServiceclasse terminée, nous pouvons commencer à examiner comment votre application interagira avec le JobScheduler API. La première chose à faire est de créer un JobScheduler objet, appelé mJobScheduler dans l'exemple de code et initialisez-le en obtenant une instance du service système JOB_SCHEDULER_SERVICE. Dans l'exemple d'application, cela se fait dans le Activité principaleclasse.

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

Lorsque vous voulez créer votre tâche planifiée, vous pouvez utiliser le JobInfo.Builder construire un JobInfo objet qui est passé à votre service. Créer un JobInfo objet, JobInfo.Builder accepte deux paramètres. Le premier est l'identifiant du travail que vous allez exécuter et le second est le nom du composant du service que vous utiliserez avec le JobScheduler API.

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

Ce générateur vous permet de définir de nombreuses options différentes pour contrôler le moment d'exécution de votre travail. L'extrait de code suivant montre comment configurer votre tâche pour qu'elle s'exécute périodiquement toutes les trois secondes..

constructeur.setPeriodic (3000);

D'autres méthodes incluent:

  • setMinimumLatency (long minLatencyMillis): Votre travail ne sera lancé que lorsque le nombre de millisecondes indiqué sera écoulé. Ceci est incompatible avec setPeriodic (long time) et volonté provoquer une exception si elles sont toutes deux utilisées.
  • setOverrideDeadline (long maxExecutionDelayMillis): Cela fixera une date limite pour votre travail. Même si d'autres conditions ne sont pas remplies, votre tâche démarrera environ une fois le délai indiqué écoulé. Comme setMinimumLatency (long time), cette fonction est mutuellement exclusive avec setPeriodic (long time) et volonté provoquer une exception si elles sont toutes deux utilisées.
  • setPersisted (boolean isPersisted): Cette fonction indique au système si votre tâche doit continuer d'exister après le redémarrage du périphérique..
  • setRequiredNetworkType (int networkType): Cette fonction indique à votre travail qu'il ne peut démarrer que si le périphérique est sur un type de réseau spécifique. La valeur par défaut est JobInfo.NETWORK_TYPE_NONE, ce qui signifie que la tâche peut être exécutée, qu’il y ait ou non une connectivité réseau. Les deux autres types disponibles sont JobInfo.NETWORK_TYPE_ANY, qui nécessite un certain type de connexion réseau disponible pour l'exécution du travail, et JobInfo.NETWORK_TYPE_UNMETERED, ce qui nécessite que l'appareil soit sur un réseau non cellulaire.
  • setRequiresCharging (boolean requireCharging): L’utilisation de cette fonction indique à votre application que le travail ne doit pas commencer tant que le périphérique n’a pas commencé à charger..
  • setRequiresDeviceIdle (booléen requireDeviceIdle): Ceci indique à votre travail de ne pas démarrer sauf si l'utilisateur n'utilise pas son appareil et ne l'a pas utilisé depuis un certain temps.

Il est important de noter que setRequiredNetworkType (int networkType), setRequiresCharging (boolean requireCharging) et setRequiresDeviceIdle (boolean requireIdle) peut faire en sorte que votre travail ne commence jamais à moins que setOverrideDeadline (long time) est également défini, permettant à votre travail de s'exécuter même si les conditions ne sont pas remplies. Une fois les conditions préférées spécifiées, vous pouvez créer le JobInfo objet et l'envoyer à votre JobScheduler objet comme indiqué ci-dessous.

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

Vous remarquerez que le programme l'opération renvoie un entier. Si programme échoue, il retournera une valeur de zéro ou moins, correspondant à un code d'erreur. Sinon, l'identifiant du travail que nous avons défini dans le JobInfo.Builder.

Si votre application nécessite que vous arrêtiez un travail spécifique ou tous les travaux, vous pouvez le faire en appelant annuler (int jobId) ou Tout annuler() sur le JobScheduler objet.

mJobScheduler.cancelAll ();

Vous devriez maintenant pouvoir utiliser le JobScheduler API avec vos propres applications pour le traitement par lots et l'exécution d'opérations en arrière-plan.

Conclusion

Dans cet article, vous avez appris comment implémenter une JobService sous-classe qui utilise un Gestionnaire objet pour exécuter des tâches en arrière-plan pour votre application. Vous avez également appris à utiliser le JobInfo.Builder définir les exigences pour le moment où votre service doit être exécuté. En les utilisant, vous devriez pouvoir améliorer le fonctionnement de vos propres applications tout en tenant compte de la consommation électrique..