Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android start running JobScheduler at specific time

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.

like image 664
Dus Avatar asked Jul 11 '16 07:07

Dus


People also ask

How to schedule a task for particular time in Android?

When application is running and we want to schedule or run a task at a specific time then it is recommended to use Handler class in conjunction with Timer and Thread. Instead of using Alarm Manger, Job Scheduler etc. it is easier and much more efficient to use Handler.

What is JobScheduler explain how it works?

A job scheduler is a computer application for controlling unattended background program execution of jobs. This is commonly called batch scheduling, as execution of non-interactive jobs is often called batch processing, though traditional job and batch are distinguished and contrasted; see that page for details.

Which service is used to run scheduled jobs?

A Cron is a time-based job scheduler. It enables our application to schedule a job to run automatically at a certain time or date. A Job (also known as a Task) is any module that you wish to run.

How do I restart my JobScheduler?

Particular Job we cannot manually start but we can restart the Job scheduler if it fails and is not running in the Background. This can be done by clicking Override option which will disable the Job scheduler. Once disable click on Revert again then the Job scheduler will be enabled.


2 Answers

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.

like image 115
prerak Avatar answered Oct 26 '22 11:10

prerak


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.

like image 41
Omar Alnajjar Avatar answered Oct 26 '22 11:10

Omar Alnajjar