Malheureusement, il n'est pas possible pour l'instant de programmer un travail à une heure précise. Si vous avez une mise en œuvre critique en termes de temps, vous devriez utiliser AlarmManager pour définir une alarme qui peut se déclencher pendant la mise en veille en utilisant la fonction setAndAllowWhileIdle() o setExactAndAllowWhileIdle() .
Vous pouvez planifier un travail, avec un délai initial unique, ou l'exécuter périodiquement, en utilisant l'outil de planification de l'exécution. WorkManager
comme suit :
Créer la classe Worker :
public class MyWorker extends Worker {
@Override
public Worker.WorkerResult doWork() {
// Do the work here
// Indicate success or failure with your return value:
return WorkerResult.SUCCESS;
// (Returning RETRY tells WorkManager to try this task again
// later; FAILURE says not to try again.)
}
}
Ensuite, programmez OneTimeWorkRequest
comme suit :
OneTimeWorkRequest mywork=
new OneTimeWorkRequest.Builder(MyWorker.class)
.setInitialDelay(<duration>, <TimeUnit>)// Use this when you want to add initial delay or schedule initial work to `OneTimeWorkRequest` e.g. setInitialDelay(2, TimeUnit.HOURS)
.build();
WorkManager.getInstance().enqueue(mywork);
Vous pouvez définir des contraintes supplémentaires comme suit :
// Create a Constraints that defines when the task should run
Constraints myConstraints = new Constraints.Builder()
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
// Many other constraints are available, see the
// Constraints.Builder reference
.build();
Créez ensuite une demande de travail à temps partiel qui utilise ces contraintes.
OneTimeWorkRequest mywork=
new OneTimeWorkRequest.Builder(MyWorker.class)
.setConstraints(myConstraints)
.build();
WorkManager.getInstance().enqueue(mywork);
La demande de travail périodique peut être créée comme suit :
PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 12, TimeUnit.HOURS)
.build();
WorkManager.getInstance().enqueue(periodicWork);
Cela crée une demande de travail périodique (PeriodicWorkRequest) à exécuter périodiquement une fois toutes les 12 heures.
4 votes
OneTimeWorkRequest.Builder#setInitialDelay ?
0 votes
Je pense que cela peut être un bon moyen de contourner le problème. Pour cela, je dois calculer la différence de temps entre l'heure actuelle et l'heure à laquelle je veux que le travail commence. Mais puis-je définir l'heure de début de façon explicite ?
0 votes
Quel est le problème du calcul ?
timeInFutureInSeconds - timeNowInSeconds
?0 votes
@pskink mais comme la question le demandait comment peut-on spécifier que le travail doit être fait tous les jours à 8h le délai initial est comme spécifié le délai "initial". comment le workmanager sait-il la prochaine fois que nous devons l'exécuter.
0 votes
Comme il s'agit d'une tâche périodique, le gestionnaire de tâches déclenchera la tâche au moment où elle a été déclenchée pour la première fois.
0 votes
WorkManager est spécifiquement conçu pour ne pas supporter les cas d'utilisation de l'heure exacte. Google s'est éloigné de ce support, si vous en avez besoin, ils veulent que vous utilisiez les notifications push. Ils veulent que tout ce qui est programmé à partir du client soit inexact pour soutenir la longévité de la batterie de l'utilisateur.