workmanager manager android android-workmanager

android - Programe un trabajo en un tiempo específico con WorkManager



worker manager android (3)

WorkManager es una biblioteca que se utiliza para poner en cola el trabajo que está garantizado para ejecutarse después de que se cumplan sus restricciones.

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


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

Puede programar un trabajo, con un retraso inicial único o ejecutarlo periódicamente, utilizando el 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.) } }

Luego programe OneTimeWorkRequest siguiente manera:

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

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 un OneTimeWorkRequest que usa 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 un PeriodicWorkRequest para ejecutarse periódicamente una vez cada 12 horas.


Hasta ahora no es posible alcanzar tiempos exactos usando PeriodicWorkRequest .
Una OneTimeWorkRequest fea sería utilizar OneTimeWorkRequest y cuando se dispare, establezca otra OneTimeWorkRequest con un nuevo período calculado, y así sucesivamente.


Puedes usar AndroidJob desde 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 )) } } }

y un creador de notificaciones

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

luego inicie en su clase de Aplicación

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

La dependencia de Gradle es

dependencies { implementation ''com.evernote:android-job:1.2.6'' // or this with workmnager implementation ''com.evernote:android-job:1.3.0-alpha08'' }