2016-05-27 35 views
5

Sto cercando di creare un jobService. Ecco come appare onStartJob().JobScheduler Android non si fermerà con jobFinished (params, false)

@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; 
} 

Ecco il codice che dovrebbe iniziare il lavoro.

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

Non riesco a fermarlo. Continua a sparare ogni 1-5 minuti. Ho messo jobFinished (params, false) in onStartJob() e ho commentato l'operazione per provare ad eliminarlo subito dopo l'avvio, ma continua a sparare. Sembra che jobFinished() licenzi qualcosa, mentre onDestroy() viene chiamato e il mio servizio viene distrutto, ma poi un altro job arriva con lo stesso ID e avvia tutto il backup.

Ho BIND_JOB_SERVICE nel manifest come mostra ogni esempio.

Qualche idea sul perché jobFinished (params, false) non sembra uccidere setPeriodic (60000)?

risposta

5

Beh, ho capito se qualcun altro ha questo problema.

jobFinished() non interrompe l'intervallo di tempo impostato dall'utente per continuare. Semplicemente dice al lavoro che hai finito, di rilasciare il wakelock, così Android non deve uccidere il lavoro in modo forzato.

Quello che dovevo fare era ricreare il jobScheduler nel mio servizio e chiamare cancelAll(). Potresti anche chiamare apparentemente cancel (job_id).

+1

La risposta di Tom dovrebbe essere accettata. Stai creando un lavoro periodico e utilizzandolo come one-shot, il che non ha senso in quanto ci sono modi per farlo correttamente. Inoltre, si stanno annullando TUTTI i lavori che potrebbero essere programmati, non quello desiderato. –

8

È stato specificato che un lavoro viene eseguito periodicamente (ogni 60 secondi), quindi ogni 60 ~ secondi viene creato ed eseguito un nuovo lavoro. jobFinished() è specifico per un lavoro e indica semplicemente che è stato eseguito. Non hai cancellato nulla.

La risposta (attualmente) accettata funziona per annullare il lavoro pianificato, ma se tutto ciò che si desidera è un lavoro che viene eseguito entro 60 secondi e quindi si interrompe, è necessario utilizzare lo setPeriodic() e utilizzare setOverrideDeadline(60000). Il lavoro verrà eseguito entro 60 secondi e non sarà più programmato dopo di esso.