Je souhaite planifier une notification chaque fois que l'utilisateur ajoute une note dans la base de données pour une heure spécifique. Il y a plusieurs façons de le faire avec AlarmManager, BroadcastReceiver, etc. Comment peut-on le faire avec WorkManager?
WorkManager
ne convient pas pour un travail qui doit être accompli à un moment donné.
Vous devez utiliser AlarmManager
et plus particulièrement AlarmManagerCompat.setExactAndAllowWhileIdle () , pour obtenir un rappel à une heure précise.
Selon la documentation officielle d'Android sur worker manager: "Ces API vous permettent de créer une tâche et de la transmettre à WorkManager pour qu'elle s'exécute immédiatement ou à un moment approprié". Dans mon application, je définis un travail à activer 20 secondes après:
// Schedule the time
val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
WorkManager.getInstance().enqueue(request)
Comme ianhanniballake a déclaré
WorkManager n'est pas approprié pour un travail qui doit être effectué à un moment donné.
Mais cela peut être réglé dans un proche avenir de l'heure exacte, en fonction de l'état de l'optimisation de la batterie.
Une solution de contournement sera comme:
// Time to show notification at
LocalDateTime timeAt = LocalDate.now().atTime(20, 0);
LocalDateTime timeNow = LocalDateTime.now();
OneTimeWorkRequest.Builder workBuilder = new OneTimeWorkRequest.Builder(NotificationWorker.class);
// I just need to set an delay here
workBuilder.setInitialDelay(Duration.between(timeNow, timeAt));
// This is just to complete the example
WorkManager.getInstance().enqueueUniqueWork(UNIQUE_WORK_SHOW_NOTIFICATION,
ExistingWorkPolicy.REPLACE,
workBuilder.build());