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 for 3 hours, but in JobInfo.Builder class there's no option for starting the job at an exact time.
Going over the JobInfo.Builder class overview, there's nothing there that sets the time for starting a JobScheduler.
Obviously, i don't want to run it for the whole day, and check that the time matches, this will drain more battery than needed, and is bad programing.
I was thinking of making an alarm to run at the time i specify and would trigger this job, but this seems to be a bit overkill.
JobInfo.Builder builder = new JobInfo.Builder(NIGHT_SYNC_JOB_ID,
new ComponentName(context, NightSyncDataJobService.class));
//Job starts at 11pm, and ends at 2am. Running every 20 minutes.
builder.setPersisted(true); //Job scheduled to work after reboot
builder.setPeriodic(Consts.ONE_MINUTE * 20);
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
If you have any other solution to the issue, beside AlarmManger that triggers this JobScheduler, will be much appreciated.
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
.