12

jobService を作成しようとしています。onStartJob() は次のようになります。

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

これは、ジョブを開始することになっているコードです。

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

私はそれを止めることができません。1〜5分ごとに発砲し続けます。jobFinished(params, false) を onStartJob() に入れ、タスクをコメントアウトして、開始直後に強制終了しようとしましたが、起動し続けます。onDestroy() が呼び出されてサービスが破棄されると、jobFinished() が何かを起動するようですが、同じ ID を持つ別のジョブが入ってきて、すべてバックアップを開始します。

すべての例が示すように、マニフェストに BIND_JOB_SERVICE があります。

jobFinished(params, false) が setPeriodic(60000) を強制終了していないように見える理由についてのアイデアはありますか?

4

3 に答える 3

17

ジョブが定期的に (60 秒ごとに) 実行されるように指定したため、60~ 秒ごとに新しいジョブが作成されて実行されます。 jobFinished()ジョブに固有であり、単に実行が完了したことを示します。何もキャンセルしていません。

(現在)受け入れられている回答は、スケジュールされたジョブをキャンセルするために機能しますが、60秒以内に実行してから停止するジョブだけが必要な場合は、省略して代わりにsetPeriodic()使用する必要がありますsetOverrideDeadline(60000). ジョブは 60 秒以内に実行され、それ以降はスケジュールされません。

于 2016-06-29T01:26:18.710 に答える
16

他の誰かがこの問題を抱えているかどうかはわかりました。

jobFinished() は、設定した定期的な時間の継続を停止しません。ウェイクロックを解放するためにジョブが終了したことを伝えるだけなので、Android は強制的にジョブを強制終了する必要はありません。

私がしなければならなかったことは、自分のサービスで jobScheduler を再作成し、cancelAll() を呼び出すことでした。cancel(job_id) を呼び出すこともできるようです。

jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE );
jobScheduler.cancelAll();
于 2016-05-27T20:56:14.450 に答える