PeriodicWorkRequest有一个很好的Builder构造函数,您可以传递一个间隔时间让工作执行。您可以在
这里查看Builder和每个参数的详细信息。
因此,要将初始延迟设置为定期工作,您可以按照以下方式进行:
int hourOfTheDay = 10;
int repeatInterval = 1;
long flexTime = calculateFlex(hourOfTheDay, repeatInterval);
Constraints myConstraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.build();
PeriodicWorkRequest workRequest =
new PeriodicWorkRequest.Builder(MyNiceWorker.class,
repeatInterval, TimeUnit.DAYS,
flexTime, TimeUnit.MILLISECONDS)
.setConstraints(myConstraints)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork(YOUR_NICE_WORK_TAG,
ExistingPeriodicWorkPolicy.REPLACE,
workRequest);
这里是奇迹发生的地方:
private long calculateFlex(int hourOfTheDay, int periodInDays) {
// Initialize the calendar with today and the preferred time to run the job.
Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.HOUR_OF_DAY, hourOfTheDay);
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);
// Initialize a calendar with now.
Calendar cal2 = Calendar.getInstance();
if (cal2.getTimeInMillis() < cal1.getTimeInMillis()) {
// Add the worker periodicity.
cal2.setTimeInMillis(cal2.getTimeInMillis() + TimeUnit.DAYS.toMillis(periodInDays));
}
long delta = (cal2.getTimeInMillis() - cal1.getTimeInMillis());
return ((delta > PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS) ? delta
: PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS);
}
请注意,此时间不是精确时间。WorkManager可能会在该灵活窗口的任何时间触发您的作业,具体取决于您的约束条件、系统负载、其他预定作业等。
如果您想要精确定时,请切换到AlarmManager。
希望能对您有所帮助!
setInitialDelay
的工作方式很奇怪。当我设置了启动时间为15分钟和初始延迟为1分钟时,工作程序会在16分钟后开始运行。我原以为它会立即启动(就像OneTimeWorkRequest
一样),但实际上是在1分钟后启动的(而不是16分钟后)。之后的启动将每隔15分钟进行一次。 - proninyaroslavimplementation 'android.arch.work:work-runtime:1.0.1'
,但是这里没有setInitialDelay()。很抱歉,我正在使用稳定版的WorkManager
而不是alpha版。 - SmartAndroidian2.2.0-rc01
。它也在那里。 - Anjal Saneen