web-dev-qa-db-fra.com

Planifier un travail à une heure précise avec WorkManager

WorkManager est une bibliothèque utilisée pour mettre en file d'attente un travail dont l'exécution est garantie une fois ses contraintes remplies.

Par conséquent, après être passé par la Constraints class, je n’ai trouvé aucune fonction permettant d’ajouter une contrainte de temps sur le travail. Par exemple, je souhaite commencer un travail à 8h00 (le travail peut être de deux types OneTimeWorkRequest ou PeriodicWorkRequest ) le matin Comment puis-je ajouter une contrainte pour planifier ce travail avec WorkManager.

25
CodeCameo

Malheureusement, vous ne pouvez pas planifier un travail à une heure précise à partir de maintenant. Si vous avez une mise en œuvre critique, utilisez AlarmManager pour définir une alarme pouvant se déclencher à Doze en utilisant setAndAllowWhileIdle () ou setExactAndAllowWhileIdle () .

Vous pouvez planifier un travail avec un délai initial unique ou l'exécuter périodiquement à l'aide de la variable WorkManager comme suit:

Create Worker class:

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.)
    }
}

Puis 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 configurer 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();

Puis créez un OneTimeWorkRequest qui utilise ces contraintes

OneTimeWorkRequest mywork=
                new OneTimeWorkRequest.Builder(MyWorker.class)
     .setConstraints(myConstraints)
     .build();
WorkManager.getInstance().enqueue(mywork);

PeriodicWorkRequest peut être créé comme suit:

 PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 12, TimeUnit.HOURS)
                                   .build();
  WorkManager.getInstance().enqueue(periodicWork);

Cela crée un PeriodicWorkRequest à exécuter périodiquement une fois toutes les 12 heures.

24
Sagar

Jusqu'à présent, il n'est pas possible d'obtenir des temps exacts avec PeriodicWorkRequest.
Une solution laide utiliserait une OneTimeWorkRequest et lorsqu’elle se déclenche, définissez une autre OneTimeWorkRequest avec une nouvelle période calculée, et ainsi de suite.

5
UpsideDownTree

Vous pouvez utiliser AndroidJob de evernote 

class NotificationJob : DailyJob() {

override fun onRunDailyJob(params: Params): DailyJobResult {
       //your job       
       return DailyJobResult.SUCCESS

}

companion object {
    val TAG = "NotificationJob"
    fun scheduleJob() {
        //scheduled between 9-10 am

        DailyJob.schedule(JobRequest.Builder(TAG), 
            TimeUnit.HOURS.toMillis(9),TimeUnit.HOURS.toMillis(10 ))
     }
   }
 }

et un créateur de notification

  class NotificationJobCreator : JobCreator {

        override fun create(tag: String): Job? {
           return when (tag) {
              NotificationJob.TAG ->
                NotificationJob()
              else ->
                null
           }
       }
  }

puis initier dans votre classe d'application

    JobManager.create(this).addJobCreator(NotificationJobCreator())

La dépendance à l'échelle est 

    dependencies {
        implementation 'com.evernote:Android-job:1.2.6'

        // or this with workmnager 
        implementation 'com.evernote:Android-job:1.3.0-alpha08'
    }
1
Uzair

Si vous souhaitez définir un délai initial sur PeriodicWorkRequest, j'ai présenté la solution ici:

Définition du délai initial sur un gestionnaire de travaux périodiques sous Android

0
Rafael Chagas