Запланируйте работу на определенное время с WorkManager - PullRequest
0 голосов
/ 16 мая 2018

WorkManager - это библиотека, используемая для постановки в очередь работы, которая гарантированно будет выполнена после выполнения ее ограничений.

Следовательно, после перехода через класс Ограничения , который у меня естьне нашел ни одной функции, чтобы добавить ограничение по времени на работу.Например, я хочу начать работу в 8:00 утра (работа может быть любого из двух типов OneTimeWorkRequest или PeriodicWorkRequest ) утром.Как добавить ограничение для планирования этой работы с WorkManager.

Ответы [ 6 ]

0 голосов
/ 22 мая 2019

PeriodicWorkRequests теперь поддерживает начальные задержки с версии 2.1.0-alpha02.Вы можете использовать метод setInitialDelay в PeriodicWorkRequest.Builder, чтобы установить начальную задержку. Ссылка здесь

Пример расписания на каждый день в 8:00 утра.здесь я использую библиотеку времени joda для операций времени.

final int SELF_REMINDER_HOUR = 8;

    if (DateTime.now().getHourOfDay() < SELF_REMINDER_HOUR) {
        delay = new Duration(DateTime.now() , DateTime.now().withTimeAtStartOfDay().plusHours(SELF_REMINDER_HOUR)).getStandardMinutes();
    } else {
        delay = new Duration(DateTime.now() , DateTime.now().withTimeAtStartOfDay().plusDays(1).plusHours(SELF_REMINDER_HOUR)).getStandardMinutes();
    }


    PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
        WorkerReminderPeriodic.class,
        24,
        TimeUnit.HOURS,
        PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
        TimeUnit.MILLISECONDS)
        .setInitialDelay(delay, TimeUnit.MINUTES)
        .addTag("send_reminder_periodic")
        .build();


    WorkManager.getInstance()
        .enqueueUniquePeriodicWork("send_reminder_periodic", ExistingPeriodicWorkPolicy.REPLACE, workRequest);
0 голосов
/ 18 мая 2019

Все ответы устарели, обновите до WorkManager 2.1.0-alpha02 (или выше) Метод setInitialDelay () раньше работал только для OneTimeWorkRequest, но теперь они также поддерживают PeriodicWorkRequest.

implementation "androidx.work:work-runtime:2.1.0-alpha02"

PeriodicWorkRequests теперь поддерживает начальные задержки. Вы можете использовать Метод setInitialDelay для PeriodicWorkRequest.Builder, чтобы установить начальная задержка

быстрый пример:

new PeriodicWorkRequest.Builder(MyWorker.class,
                            MY_REPEATS, TimeUnit.HOURS).setInitialDelay(THE_DELAY,TimeUnit.SECONDS);
0 голосов
/ 29 января 2019

Если вы хотите установить начальную задержку на PeriodicWorkRequest , я представил решение здесь:

Установите начальную задержку для диспетчера периодической работы в Android

0 голосов
/ 16 ноября 2018

Вы можете использовать AndroidJob из 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 ))
     }
   }
 }

и создатель уведомлений

  class NotificationJobCreator : JobCreator {

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

затем инициируйте в своем классе приложения

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

Зависимость gradle равна

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

        // or this with workmnager 
        implementation 'com.evernote:android-job:1.3.0-alpha08'
    }
0 голосов
/ 18 августа 2018

Пока что невозможно достичь точного времени, используя PeriodicWorkRequest.
Уродливый обходной путь будет использовать OneTimeWorkRequest, а когда он срабатывает, установите еще один OneTimeWorkRequest с новым вычисленным периодом, и такна.

0 голосов
/ 16 мая 2018

К сожалению, вы не можете запланировать работу в определенное время на данный момент. Если у вас есть критическая по времени реализация, вы должны использовать AlarmManager для установки будильника, который может срабатывать в режиме Doze, с помощью setAndAllowWhileIdle () или setExactAndAllowWhileIdle () .

Вы можете запланировать работу с единовременной начальной задержкой или выполнять ее периодически, используя WorkManager следующим образом:

Создать класс работника:

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

Затем график OneTimeWorkRequest выглядит следующим образом:

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

Затем создайте OneTimeWorkRequest, который использует эти ограничения

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

PeriodicWorkRequest может быть создан следующим образом:

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

При этом создается PeriodicWorkRequest для периодического запуска каждые 12 часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...