2016-07-11 33 views
5

Ich möchte einen JobScheduler zu einer bestimmten Zeit jeden Tag starten, und es nach 3 Stunden zu beenden.Android starten JobScheduler zu bestimmten Zeitpunkt

Ich habe den Teil der Auslösung des Jobs alle 20 min und für 3 Stunden, aber in der JobInfo.Builder-Klasse gibt es keine Option, den Job zu einer genauen Zeit zu starten.

Geht man über die JobInfo.Builder Klassenübersicht, gibt es dort nichts, was die Zeit für den Start eines JobSchedulers einstellt.

Offensichtlich möchte ich es nicht den ganzen Tag laufen lassen, und überprüfen Sie, dass die Zeit übereinstimmt, dies wird mehr Batterie als nötig entladen, und ist schlecht Programmieren.

Ich dachte daran, einen Alarm zu machen, um zu der Zeit zu laufen, die ich spezifiziere, und würde diesen Job auslösen, aber das scheint ein bisschen übertrieben zu sein.

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()); 

Wenn Sie eine andere Lösung für das Problem haben, neben AlarmManger, die diese Jobscheduler löst, wird sehr geschätzt werden.

Antwort

2

ich erreichte es in der folgenden Art und Weise (ohne AlarmManager), einen neuen Job erstellt (mit einer einzigartigen JOB_ID natürlich), und sagte den JobScheduler es in Zukunft mit setOverrideDeadline() für einige Zeit zu planen.

Hier ist ein Ausschnitt, die hilfreich sein könnten:

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(); 
    } 

Achten Sie auf die korrekte Zeitversatz, an dem Sie die Aufgabe planen möchten berechnen, und auch alle vorhandenen Job-IDs aus dem JobScheduler entfernen.

+0

Anstatt es täglich zu planen, möchte ich einen Job für bestimmte Tage planen (sagen wir einfach für Sonntag, Mittwoch, Samstag), Ist es möglich mit JobSchedular @prerak –

+1

Nicht sicher, der einzige Weg, wie ich denken kann, ist Sie töten bestehenden Job und einen zukünftigen mit dem Offset neu planen. Müssen Sie etwas Mathe darin einbeziehen: D – prerak