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.
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);
// 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 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.
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.
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'
}
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