Android jobScheduler 不会停止 jobFinnished(params, false)

我正在尝试创建一个工作服务。以下是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) 放进了 startJob() 中,并注释掉了任务,试图在它启动后立即杀死它,但它只是继续触发。似乎 jobFinished() 触发了一些东西,因为 onDestroy() 被调用,我的服务被破坏了,但随后另一个作业以相同的 ID 进入并启动它。

我在清单中BIND_JOB_SERVICE,就像每个示例所示一样。

关于为什么jobFinished(params,false)似乎不会杀死集合Periodic(60000)的任何想法?


答案 1

您已指定定期(每 60 秒)运行一个作业,因此每隔 60~ 秒就会创建并执行一个新作业。 特定于作业,并且仅指示它已完成执行。您没有取消任何内容。jobFinished()

您(当前)接受的答案可用于取消计划的作业,但是如果您想要的只是在60秒内执行然后停止的作业,则应省略并改用。作业将在 60 秒内运行,之后不会再计划更多作业。setPeriodic()setOverrideDeadline(60000)


答案 2

好吧,我想出了如果其他人有这个问题。

jobFinished() 不会阻止您设置的定期时间继续。它只是告诉工作你已经完成了,释放唤醒锁,所以Android不必强行杀死工作。

我所要做的是在我的服务中重新创建工作调度程序并调用 cancelAll()。您显然也可以调用取消(job_id)。

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

推荐