Google propose plusieurs solutions pour la planification des tâches/tâches, telles que JobScheduler
et GcmTaskService
. Chacun a ses avantages et ses inconvénients.
Google a récemment présenté une nouvelle bibliothèque appelée "Firebase JobDispatcher".
Malheureusement, il y a très peu de choses à lire sur cette nouvelle API. En fait, il est vraiment difficile de trouver quelque chose à ce sujet.
La seule chose que j'ai trouvée est leur vidéo d'annonce et n échantillon . Mais même leur, il n’ya pas grand chose à savoir sur cette API.
En regardant les questions précédentes, les enquêtes et les comparaisons que j'avais avec les autres API ( ici , par exemple), j'aimerais vous demander comment fonctionne la nouvelle API et savoir quoi prendre en compte lors de son utilisation:
Un travail peut-il avoir des paramètres qui restent et qui peuvent même être modifiés si nécessaire? Ils disent dans l'exemple " Un ensemble facultatif de suppléments fournis par l'utilisateur. La valeur par défaut est un ensemble vide. " Est-ce cela? Peut-il être modifié par le travail lors de son exécution?
Les travaux peuvent-ils être reprogrammés facilement? Il est dit " un booléen indiquant si le travail doit être répété ". Comment peut-il être choisi quand re-programmer? J'ai essayé l'échantillon et choisi "Récurrent", mais il ne semble pas fonctionner à nouveau, une seule fois.
Peut-il être protégé par rapport aux travaux de la bibliothèque (à cause d'identifiants uniques)?
A-t-il besoin de plus de prudence lors de la mise à jour de l'application (à l'instar des API précédentes)? Les travaux peuvent-ils toujours être planifiés après une mise à jour de l'application? En testant sur l’échantillon, il semble que les emplois ont complètement disparu après une mise à jour de l’application. Peut-il être évité?
At-il besoin de RECEIVE_BOOT_COMPLETED
au cas où je souhaite que le travail soit toujours planifié même lorsque le périphérique est redémarré? L'échantillon semble l'avoir.
Est-il possible d’obtenir une liste de tous les travaux planifiés et de leurs informations (y compris les paramètres), et d’annuler/de tout ou même de les modifier?
Un travail sera-t-il supprimé lors de l'opération d'effacement des données de l'application?
Est-il possible de dire au travail qu'il est préférable qu'il se déroule dans un intervalle de temps (exemple: entre 7h00 et 8h00 du matin)? Il est mentionné " ExecutionWindowTrigger-qui spécifie une fenêtre temporelle dans laquelle le travail doit être exécuté ". Est-ce que c'est ça? Qu'est-ce qui se passe quand il manque cette fenêtre?
La méthode onStartJob
dans JobService
class renvoie un booléen dont la description est " s'il reste du travail à faire. " Qu'est-ce que ça veut dire? Que signifie le paramètre needsReschedule
de la méthode jobFinished
? Sont-ils liés les uns aux autres?
Y a-t-il des restrictions que je devrais connaître? Par exemple, des valeurs minimales et maximales pour chacune des fonctions?
En fait, Firebase Android JobDispatcher est une couche d’abstraction autour des moteurs de planification d’emploi sous Android. Et pour l’instant, ils ne disposent que d’un pilote pour GCM Network Manager. Cela signifie qu’il se comporte de la même manière que - Le gestionnaire de réseau GCM se comporte Nous espérons que d'autres pilotes seront implémentés à l'avenir.
1. Un travail peut-il avoir des paramètres qui restent et qui peuvent même être modifiés si nécessaire? Ils disent dans l'exemple "Un ensemble facultatif de suppléments fournis par l'utilisateur. La valeur par défaut est un ensemble vide." . Est-ce ceci? Peut-il être modifié par le travail lors de son exécution?
Job.Builder
A la méthode setExtras
avec un paquet arbitraire auquel on peut accéder ultérieurement via jobParameters.getExtras()
. Vous ne pouvez pas modifier le paquet (jobParameters
ne contient que des accesseurs). Vous pouvez replanifier votre travail avec l'indicateur setReplaceCurrent(true)
et spécifier un nouvel ensemble.2. Les travaux peuvent-ils être reprogrammés facilement? On dit "un booléen indiquant si le travail doit être répété". Comment peut-il être choisi quand re-programmer? J'ai essayé l'échantillon et choisi "Récurrent", mais il ne semble pas fonctionner à nouveau, mais une seule fois.
setRecurring(true)
, setTrigger(Trigger.executionWindow(10, 20))
Cela se déclenche dès que la date limite de début de la fenêtre est atteinte et les conducteurs sont encouragés à exécuter le Job avant la fin de la fenêtre, si possible.
3. Peut-il être protégé par rapport aux travaux de la bibliothèque (à cause d'identifiants uniques)?
Les étiquettes de travail doivent être uniques dans votre application. Les autres applications sur le téléphone ont leurs propres "points finaux" (nom du package/nom du service). Pour voir tous les travaux planifiés/terminés pour GooglePlayDriver
, veuillez utiliser
adb Shell dumpsys activity service GcmService
4. A-t-il besoin d'attention supplémentaire lors de la mise à jour de l'application (comme les API précédentes l'ont fait) Les travaux peuvent-ils toujours être planifiés après une mise à jour de l'application? En testant sur l’échantillon, il semble que les emplois ont complètement disparu après une mise à jour de l’application. Peut-il être évité?
GooglePlayDriver
ne replanifie pas les tâches après la mise à jour des services Google Play ou de l'application. Voici un numéro ouvert pour cela. Donc pour l'instant c'est votre responsabilité.5. Est-ce que RECEIVE_BOOT_COMPLETED est nécessaire si je veux que le travail soit toujours planifié même lorsque le périphérique est redémarré? L'échantillon semble l'avoir.
setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT)
Bien sûr, si vous voulez créer votre propre pilote, vous devrez vous occuper vous-même de la vie.6. Est-il possible d’obtenir une liste de tous les travaux planifiés et de leurs informations (y compris les paramètres), et d’annuler certains d'entre eux et même de les modifier?
7. Un travail sera-t-il supprimé lors de l'opération d'effacement des données de l'application?
8. Est-il possible de dire au travail qu'il est préférable qu'il se déroule dans un intervalle de temps (exemple: entre 7h00 et 8h00 du matin)? Il est mentionné "ExecutionWindowTrigger-qui spécifie une fenêtre temporelle dans laquelle le Job doit être exécuté". Est-ce que c'est ça? Que se passe-t-il quand il manque cette fenêtre?
executionWindow(0, 60*60)
. Le travail sera exécuté entre 7h00 et 8h00.windowStart - La première heure (en secondes) à laquelle le travail doit être considéré comme pouvant être exécuté. Calculé à partir de la date de planification du travail (pour les nouveaux travaux) ou de la dernière exécution (pour les travaux récurrents).
En outre, ExecutionWindowTrigger spécifie l'heure approximative. Ce n'est pas garanti que cela fonctionnerait à la fenêtre donnée. S'il manque la fenêtre, le travail sera exécuté ultérieurement.
9. La méthode "onStartJob" de la classe "JobService" renvoie un booléen dont la description est "s'il reste du travail." . Qu'est-ce que ça veut dire? Que signifie le paramètre "needsReschedule" de la méthode "jobFinished"? Sont-ils liés les uns aux autres?
onStartJob
renvoie false, cela signifie que vous avez terminé votre travail. Pas besoin d'invoquer jobFinished
. Le RESULT_SUCCESS
Est envoyé automatiquement.si onStartJob
renvoie true, cela signifie que vous avez démarré un fil et que vous attendez les résultats. En règle générale, vous devez appeler jobFinished
pour indiquer aux services de Google Play si le travail doit être replanifié ou non. Si oui, le travail sera replanifié en fonction de RetryStrategy
.
10. Y a-t-il des restrictions que je devrais connaître? Par exemple, des valeurs minimales et maximales pour chacune des fonctions?
onStartJob
devrait décharger le travail sur un autre thread d'exécution dès que possible. Ils fournissent un SimpleJobService
à titre d'exemple de ce que l'on attend de vous.JobScheduler
. Aussi nécessaire de gérer la situation lorsque les services de Google Play ne sont pas disponibles, nous devrions probablement implémenter Driver
basé sur AlarmManager
.