Search code examples
androidalarmmanagerandroid-jobschedulerfirebase-job-dispatcher

Android How schedule task for every night with JobDispatcher api?


i have to download json response from web server on every night,previously i have used AlarmManager for scheduling tasks but i think for this kind of situation JobDispatcher is great because it auto perform task if network available so i don't have to manage this kind of stuf.But i have found many examples of JobDispatcher and JobScheduler in all of them a simple job is scheduled or scheduled for some time delay but there is nothing relevant to my requirements, if anyone have idea of this please help or provide any link related to this, it will be very helpful.

UPDATE

1. How to make this to work every night,because currently it is only set alarm to midnight for once , how to make it repeted for every night at same time ?


Solution

  • This is how you need to schedule time-based jobs

    FirebaseJobDispatcher jobDispatcher = new FirebaseJobDispatcher(
                    new GooglePlayDriver(this));
    
    Calendar now = Calendar.getInstance();
    Calendar midNight = Calendar.getInstance();
    midNight.set(Calendar.HOUR, 12);
    midNight.set(Calendar.MINUTE, 0);
    midNight.set(Calendar.SECOND, 0);
    midNight.set(Calendar.MILLISECOND, 0);
    midNight.set(Calendar.AM_PM, Calendar.AM);
    
    long diff = now.getTimeInMillis() - midNight.getTimeInMillis();
    
    if (diff < 0) {
        midNight.add(Calendar.DAY_OF_MONTH, 1);
        diff = midNight.getTimeInMillis() - now.getTimeInMillis();
    }
    
    int startSeconds = (int) (diff / 1000); // tell the start seconds
    int endSencods = startSeconds + 300; // within Five minutes 
    
    Job networkJob = jobDispatcher.newJobBuilder()
            .setService(NetworkJob.class)
            .setTag(NetworkJob.ID_TAG)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(startSeconds, endSencods))
            .setLifetime(Lifetime.FOREVER)
            .setReplaceCurrent(true)
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .build();
    
    jobDispatcher.schedule(networkJob);