12
votes

Android Jobscheduler ne s'arrêtera pas avec JobFineheished (paramètres, false)

Je suis en train de créer un service de travail. Voici ce que Onstartjob () ressemble à. XXX PRE>

Voici le code censé démarrer le travail. P>

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


0 commentaires

3 Réponses :


16
votes

Eh bien, je l'ai compris si quelqu'un d'autre a ce problème.

Employé () n'arrête pas le temps périodique que vous avez défini de continuer. Cela indique simplement au travail que vous avez terminé, de libérer le wakelock, alors Android n'a donc pas besoin de tuer le travail de force. P>

Ce que je devais faire était de recréer le Soychaderler dans mon service et appelez Cintinall (). Vous pouvez également appeler apparemment annuler (job_id). P>

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


2 commentaires

La réponse de Tom ci-dessous devrait être l'acceptée. Vous créez un travail périodique et utilisez-le comme un coup d'œil, ce qui n'a pas de sens car il existe des moyens de le faire correctement. En outre, vous annulez tous les emplois que vous aurez peut-être planifié, pas celui que vous avez souhaité.


Appelez définitivement Annuler (int) comme Collectiveall () sera, comme prévu, annulez tous les travaux planifiés associés à votre application (probablement pas ce que vous voudriez)



17
votes

Vous avez spécifié qu'un travail est exécuté périodiquement (toutes les 60 secondes), donc toutes les 60 secondes, un nouveau travail est créé et exécuté. Equikfinished () est spécifique à un travail et indique simplement qu'il est effectué en cours d'exécution. Vous n'avez rien annulé.

Votre réponse acceptée (actuellement) Fonctionne pour annuler votre travail planifié, mais si tout ce que vous voulez, c'est un travail qui exécute dans les 60 secondes, puis s'arrête, vous devriez utiliser setperioC () et utiliser SETOVERRITEDADELLINE (60000) à la place. Le travail fonctionnera dans les 60 secondes et plus ne sera plus prévu après cela.


1 commentaires

SETOVEROVERRITELLINE (3000) Mais il continue à répéter après une certaine période sur Oreo? Quelle pourrait être la raison..Je n'ai pas utilisé setperiodic ?



2
votes

J'utilisais plusieurs Jobservice, et d'arrêter un emploi spécifique, j'utilisé l'identifiant du travail pour annuler le travail.

    private static void startMyJob(final Context context, final int jobId) {
            ComponentName componentName = new ComponentName(context, MyJobService.class);
                JobInfo jobInfo = new JobInfo.Builder(jobId, componentName)
                        .setPersisted(true).setPeriodic(TWENTY_MINUTES).build();
                JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
                int resultCode = scheduler.schedule(jobInfo);
                if (JobScheduler.RESULT_SUCCESS != resultCode) {
                 Log.d(TAG, "Job failed to start");
                }
}


0 commentaires