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''
}