2016-05-27 10 views
5

Ich versuche einen JobService zu erstellen. So sieht onStartJob() aus.Android jobScheduler wird nicht mit jobFinished (params, false) aufhören

@Override 
public boolean onStartJob(JobParameters params) { 
    Log.d(TAG, "onStartJob"); 
    Log.d(TAG, "Params= " + params.getJobId()); 
    param = params; 
    jobFinished(params, false); 
    //startAsync(); 
    return true; 
} 


@Override 
public boolean onStopJob(JobParameters params) { 
    Log.d(TAG, "onStopJob"); 
    return false; 
} 

Hier ist der Code, der den Job starten soll.

public void startJobScheduler(){ 
    Log.d(TAG, "inside startJobScheduler"); 
    Activity activity = this.cordova.getActivity(); 
    Context context = activity.getApplicationContext(); 


    mJobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE); 
    JobInfo.Builder job = new JobInfo.Builder(111, new ComponentName(context, JobSchedulerService.class)); 

    job.setPeriodic(60000); 
    Log.d(TAG, "before mJobScheduler.schedule(job.build())"); 
    if(mJobScheduler.schedule(job.build()) <= 0) { 
     Log.d(TAG, "job schedule failed"); 
    } 
    Log.d(TAG, "333"); 
} 

Ich kann es nicht stoppen. Es feuert nur alle 1-5 Minuten. Ich habe jobFinished (params, false) in onStartJob() eingegeben und die Aufgabe auskommentiert, um zu versuchen, sie sofort nach dem Start zu beenden, aber sie feuert weiter. Es scheint, dass jobFinished() etwas auslöst, da onDestroy() aufgerufen wird und mein Dienst zerstört wird, aber dann kommt ein anderer Job mit derselben ID und startet alles wieder.

Ich habe BIND_JOB_SERVICE im Manifest wie jedes Beispiel zeigt.

Irgendwelche Ideen auf warum jobFinished (params, false) scheint nicht das setPeriodic (60000) zu töten?

Antwort

5

Nun, ich habe es herausgefunden, wenn jemand anderes dieses Problem hat.

jobFinished() stoppt nicht die periodische Zeit, die Sie setzen, um fortzufahren. Es sagt nur den Job, dass Sie fertig sind, um den Wakelock freizugeben, damit Android den Job nicht mit Gewalt beenden muss.

Was ich tun musste, war, den jobScheduler in meinem Dienst neu zu erstellen und cancelAll() aufzurufen. Du könntest auch anscheinend cancel (job_id) aufrufen.

jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE); 
jobScheduler.cancelAll(); 
+1

Tom's Antwort sollte die akzeptierte sein. Sie erstellen einen periodischen Job und verwenden ihn als One-Shot, was keinen Sinn ergibt, da es Möglichkeiten gibt, es richtig zu machen. Sie stornieren auch ALLE Jobs, die Sie möglicherweise geplant haben, nicht die, die Sie wollten. –

8

Sie haben festgelegt, dass ein Job regelmäßig ausgeführt wird (alle 60 Sekunden), so alle 60 ~ Sekunden ein neuer Auftrag erstellt und ausgeführt. jobFinished() ist spezifisch für einen Job und zeigt einfach an, dass es ausgeführt wird. Sie haben nichts storniert.

Ihre (derzeit) akzeptierte Antwort funktioniert zum Abbrechen Ihres geplanten Jobs. Wenn Sie jedoch nur einen Job ausführen möchten, der innerhalb von 60 Sekunden ausgeführt wird, sollten Sie setPeriodic() weglassen und stattdessen setOverrideDeadline(60000) verwenden. Der Job wird innerhalb von 60 Sekunden ausgeführt und danach werden keine weiteren Termine geplant.

Verwandte Themen