Android jobScheduler 不会随着 jobFinished(params, false) 停止
Android jobScheduler won't stop with jobFinished(params, false)
我正在尝试创建一个 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) 的任何想法?
好吧,如果其他人遇到这个问题,我已经知道了。
jobFinished() 不会停止您设置的周期性时间继续。它只是告诉工作你已经完成,释放唤醒锁,所以 Android 不必强行终止工作。
我必须做的是在我的服务中重新创建 jobScheduler 并调用 cancelAll()。您显然也可以调用 cancel(job_id).
jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE );
jobScheduler.cancelAll();
您已指定作业 运行 定期(每 60 秒),因此每 60~ 秒就会创建并执行一个新作业。 jobFinished()
特定于作业,仅表示它已完成执行。你没有取消任何东西。
您(当前)接受的答案适用于取消您预定的作业,但如果您想要的只是一个在 60 秒内执行然后停止的作业,您应该省略 setPeriodic()
并使用 setOverrideDeadline(60000)
反而。该作业将在 60 秒内 运行,之后将不再安排。
我正在使用多个 JobService,为了停止一个特定的 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");
}
}
我正在尝试创建一个 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) 的任何想法?
好吧,如果其他人遇到这个问题,我已经知道了。
jobFinished() 不会停止您设置的周期性时间继续。它只是告诉工作你已经完成,释放唤醒锁,所以 Android 不必强行终止工作。
我必须做的是在我的服务中重新创建 jobScheduler 并调用 cancelAll()。您显然也可以调用 cancel(job_id).
jobScheduler = (JobScheduler)this.getSystemService(Context.JOB_SCHEDULER_SERVICE );
jobScheduler.cancelAll();
您已指定作业 运行 定期(每 60 秒),因此每 60~ 秒就会创建并执行一个新作业。 jobFinished()
特定于作业,仅表示它已完成执行。你没有取消任何东西。
您(当前)接受的答案适用于取消您预定的作业,但如果您想要的只是一个在 60 秒内执行然后停止的作业,您应该省略 setPeriodic()
并使用 setOverrideDeadline(60000)
反而。该作业将在 60 秒内 运行,之后将不再安排。
我正在使用多个 JobService,为了停止一个特定的 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");
}
}