我想创建一个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()中并注释掉任务,试图在它启动后立即将其杀死,但它只是继续射击。似乎jobFinished()触发了一些东西,因为调用了onDestroy()并且我的服务被破坏了,但是另一个作业带有相同的ID,并将它们全部备份。
我在清单中有BIND_JOB_SERVICE,就像每个示例所示。
关于为什么jobFinished(params,false)似乎没有杀死setPeriodic(60000)的任何想法?
答案 0 :(得分:14)
您已指定定期运行作业(每60秒),因此每60秒创建并执行一项新作业。 jobFinished()
特定于作业,只是表明它已完成执行。你没有取消任何东西。
您(当前)接受的答案适用于取消预定作业,但如果您想要的是在60秒内执行然后停止的作业,则应忽略setPeriodic()
并改为使用setOverrideDeadline(60000)
。该作业将在60秒内运行,之后不再安排。
答案 1 :(得分:11)
好吧,如果有其他人有这个问题我就知道了。
jobFinished()不会停止您从继续设置的周期时间。它只是告诉工作你完成了,释放唤醒锁,所以Android不必强行杀掉这份工作。
我必须做的是在我的服务中重新创建jobScheduler并调用cancelAll()。你也可以显然叫取消(job_id)。
jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE );
jobScheduler.cancelAll();
答案 2 :(得分:0)
我使用了多个JobService,并且要停止一个特定的Job,我使用job的ID取消了该工作。
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static void stopMyJob(Context context, int jobId) {
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.cancel(jobId);
}
首先,我使用以下功能检查当前作业是否处于活动状态
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static boolean isJobActive(Context context, int jobId) {
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
boolean hasBeenScheduled = false;
for (JobInfo jobInfo : scheduler.getAllPendingJobs()) {
if (jobInfo.getId() == jobId) {
hasBeenScheduled = true;
break;
}
}
return hasBeenScheduled;
}
在开始工作时,我将id传递给jobInfo为:
JobInfo jobInfo = new JobInfo.Builder(jobId, componentName);
我以前通过调用函数jobid
来停止工作的stopMyJob(context, jobID)
。
在大多数情况下,重要的是停止当前作业并从头开始重新启动该作业(如果已经运行),因为泰国人将上述两个功能都用作:
if (isJobActive(activity, ANNOUNCEMENT_JOB_ID)) {
Log.d(TAG, "Job will cancel as already exist");
stopMessagingJob(activity, ANNOUNCEMENT_JOB_ID);
}
startMyJob(activity, ANNOUNCEMENT_JOB_ID);
我的startMyJob(context, jobId)
如下:
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");
}
}