Android Job Scheduler – 安排Job立即执行一次

我正在尝试使用android作业调度程序来安排作业立即执行一次。

JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.cancel(1); PersistableBundle bundle = new PersistableBundle(); bundle.putInt(JobFlags.KEY_PERIODIC_SYNC_JOB, JobFlags.JOB_TYPE_INITIAL_FETCH); jobScheduler.schedule(new JobInfo.Builder(1, new ComponentName(context, SyncJobLollipop.class)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setExtras(bundle) .setMinimumLatency(10) .setOverrideDeadline(24 * 3600 * 1000) .build()); 

但它运行了大约3 4次。 这有什么不对?

这是工作类本身:

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public class SyncJobLollipop extends JobService implements JobFinishedListener { @Inject SyncJobBackend jobBackend; private JobParameters jobParameters; @Override public boolean onStartJob(JobParameters jobParameters) { ((MyApplication)getApplication()).getAppComponent().inject(this); this.jobParameters = jobParameters; PersistableBundle bundle = jobParameters.getExtras(); int type = bundle.getInt(JobFlags.KEY_PERIODIC_SYNC_JOB); jobBackend.onStartJob(type, this); return true; } @Override public boolean onStopJob(JobParameters jobParameters) { jobBackend.onStopJob(); return false; } @Override public void onJobFinished(boolean success) { jobFinished(jobParameters, !success); } } 

PS:我已经检查过我的callig job每次都是用假值完成的。

要只运行一次作业,您应该在后台worker中的onStartJob(...)中运行代码,并在调用onStopJob(...)时删除其回调。

 public class SyncJobLollipop extends JobService { final Handler workHandler = new Handler(); Runnable workRunnable; @Override public boolean onStartJob(JobParameters params) { workRunnable = new Runnable() { @Override public void run() { // do your work here, // such as jobBackend.onStartJob(type, this) boolean reschedule = false; jobFinished(params, reschedule); }}; workHandler.post(workRunnable); return true; } @Override public boolean onStopJob(JobParameters params) { workHandler.removeCallbacks(workRunnable); return false; } } 

要立即运行它,您应该将“最小延迟”和“覆盖截止时间”都设置为1。

 jobScheduler.schedule(new JobInfo.Builder(1, new ComponentName(context, SyncJobLollipop.class)) .setExtras(bundle) .setMinimumLatency(1) .setOverrideDeadline(1) .build()); 

请注意,操作系统的打盹模式可能会延迟JobScheduler任务,直到“维护期”或设备以某种其他方式唤醒。 但是,上面的代码只能在Doze模式下运行/外部,因此应该几乎没有延迟地安排作业。