Android start running JobScheduler at specific time
Asked Answered
R

2

17

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.

Roentgen answered 11/7, 2016 at 7:27 Comment(0)
P
8

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.

Prot answered 5/4, 2017 at 21:57 Comment(3)
Instead of scheduling it daily i want to schedule a job for specific days (lets just say for sunday,wednesday, saturday) ,Is it possible using JobSchedular @ProtIntercom
Not sure, the only way I can think is you kill the existing job and reschedule a future one with the offset. Need to involve some math in it :DProt
how do you schedule this job periodically ? like the Op wants every 20 minutes ? As per documentation " it doesn't make sense setting this property on a periodic job, doing so will throw an IllegalArgumentException when build() is called."Suzansuzann
Z
1

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.

Zingg answered 31/7, 2018 at 20:20 Comment(1)
It still dont allow you to set the job periodically for the same reason as @Suzansuzann mentionedEndospore

© 2022 - 2024 — McMap. All rights reserved.