I want to start a JobScheduler at a specific time everyday, and finish it after 3 hours.
I have the part of triggering the job every 20 min, and fo
adding setMinimumLatency on jobInfo with the deference of the current time and the target time solves this issue.
JobInfo jobInfo = new JobInfo.Builder(1, componentName)
.setPersisted(true)
.setBackoffCriteria(6000, JobInfo.BACKOFF_POLICY_LINEAR)
.setMinimumLatency(1000 * 60)
.build();
for the example above the scheduler will work after 60 secs.
I achieved it in the following way (without AlarmManager
), created a new Job (with a unique JOB_ID
obviously), and told the JobScheduler
to schedule it for sometime in the future using setOverrideDeadline()
.
Here's a snippet which might be helpful:
private JobInfo getJobInfoForFutureTask(Context context,
long timeTillFutureJob) {
ComponentName serviceComponent = new ComponentName(context, SchedulerService.class);
return new JobInfo.Builder(FUTURE_JOB_ID, serviceComponent)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
.setOverrideDeadline(timeTillFutureJob)
.setRequiresDeviceIdle(false)
.setRequiresCharging(false)
.setPersisted(true)
.build();
}
Make sure to calculate the correct time offset at which you want to schedule the task and also remove any existing Job IDs from the JobScheduler
.