我想使用android JobScheduler
来安排一个或多个工作。问题是工作ID。我怎样才能每次都选择不同的工作?如果我使用相同的ID安排新工作,则删除旧作业。我需要类似enqueuWork
的东西,但你需要Api等级26,我的最低api等级是21.我怎么能这样做?每项工作都与同一工作有关,例如:发送邮件。这只是一项工作,但它可以有几个实例。
答案 0 :(得分:2)
您可以使用JobScheduler
的{{1}}方法查找可用的getAllPendingJobs()
。它将返回所有计划的挂起作业,同时它们正在等待/正在运行。完成/完成后,jobID
会从此列表中删除作业。
Obs。: Android文档描述: “检索
JobSchedulerService
中待处理的此程序包的所有作业。”
我测试了这个方法(在JobScheduler
M和N上),它还返回正在运行的作业。作业完成后已删除。在 Android源代码中,getAllPendingJobs()
使用Android
(存储所有预定作业)来返回作业列表。当作业为Stopped时,它将从mJobs
中删除,并且不会在mJobs
中返回。
答案 1 :(得分:1)
不确定JobScheduler是否具有该选项,但如果您能够为其他组件更改它,我建议您:FireBase JobDispatcher
它有以下选项:.setReplaceCurrent(false)
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job myJob = dispatcher.newJobBuilder()
// the JobService that will be called
.setService(MyJobService.class)
// uniquely identifies the job
.setTag("my-unique-tag")
// one-off job
.setRecurring(false)
// don't persist past a device reboot
.setLifetime(Lifetime.UNTIL_NEXT_BOOT)
// start between 0 and 60 seconds from now
.setTrigger(Trigger.executionWindow(0, 60))
// don't overwrite an existing job with the same tag
.setReplaceCurrent(false)
// retry with exponential backoff
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
// constraints that need to be satisfied for the job to run
.setConstraints(
// only run on an unmetered network
Constraint.ON_UNMETERED_NETWORK,
// only run when the device is charging
Constraint.DEVICE_CHARGING
)
.setExtras(myExtrasBundle)
.build();
dispatcher.mustSchedule(myJob);
我必须使用它并且效果很好