web-dev-qa-db-fra.com

Comment planifier des notifications à l'aide de WorkManager?

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?

5
Ankur Gupta

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.

3
ianhanniballake

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)
2
Gerardo Suarez

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());
0
Rajarshi