如何使用相同的ID安排更多工作

时间:2017-08-04 13:37:41

标签: android android-jobscheduler

我想使用android JobScheduler来安排一个或多个工作。问题是工作ID。我怎样才能每次都选择不同的工作?如果我使用相同的ID安排新工作,则删除旧作业。我需要类似enqueuWork的东西,但你需要Api等级26,我的最低api等级是21.我怎么能这样做?每项工作都与同一工作有关,例如:发送邮件。这只是一项工作,但它可以有几个实例。

2 个答案:

答案 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);

我必须使用它并且效果很好