Progtwigr un trabajo en un momento específico con WorkManager

WorkManager es una biblioteca utilizada para poner en cola el trabajo que se garantiza que se ejecutará una vez que se cumplan sus restricciones.

Por lo tanto, después de pasar por la clase Restricciones , no he encontrado ninguna función para agregar restricción de tiempo en el trabajo. Por ejemplo, quiero comenzar un trabajo para realizar a las 8:00 a.m. (El trabajo puede ser cualquiera de dos tipos, OneTimeWorkRequest o PeriodicWorkRequest ) por la mañana. ¿Cómo puedo agregar restricciones para progtwigr este trabajo con WorkManager?

Lamentablemente, no se puede progtwigr un trabajo en un momento específico a partir de ahora. Si tiene una implementación crítica en el tiempo, debe usar AlarmManager para configurar la alarma que se puede disparar mientras está en Doze usando setAndAllowWhileIdle () o setExactAndAllowWhileIdle () .

Puede progtwigr un trabajo, con una demora inicial única o ejecutarlo periódicamente, utilizando WorkManager siguiente manera:

Crear clase de trabajador:

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

A continuación, programe OneTimeWorkRequest siguiente manera:

 OneTimeWorkRequest mywork= new OneTimeWorkRequest.Builder(MyWorker.class) .setInitialDelay(, )// Use this when you want to add initial delay or schedule initial work to `OneTimeWorkRequest` eg setInitialDelay(2, TimeUnit.HOURS) .build(); WorkManager.getInstance().enqueue(mywork); 

Puede configurar restricciones adicionales de la siguiente manera:

 // 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(); 

Luego crea una OneTimeWorkRequest que use esas restricciones

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

PeriodicWorkRequest se puede crear de la siguiente manera:

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

Esto crea una PeriodicWorkRequest para ejecutarse periódicamente una vez cada 12 horas.

Hasta ahora no es posible lograr tiempos exactos utilizando PeriodicWorkRequest .
Un desagradable problema sería utilizar OneTimeWorkRequest y, cuando se OneTimeWorkRequest , establecer otro OneTimeWorkRequest con un nuevo período calculado, y así sucesivamente.