JobService 的 onStartJob 方法在作业被调度后立即执行

Posted

技术标签:

【中文标题】JobService 的 onStartJob 方法在作业被调度后立即执行【英文标题】:onStartJob method of JobService executes as soon as job is scheduled 【发布时间】:2019-06-19 07:43:42 【问题描述】:

android 应用上工作,我使用 FirebaseJobDispatcher 每 1 分钟运行一次作业。

问题

只要我运行应用程序,作业就会执行,然后每 1 分钟执行一次。

问题

为什么在安排作业时会立即调用onStartJob?为什么在执行前不等待 1 分钟?我做错了什么?

代码

public static void scheduleReminders(Context context) 

   Driver driver = new GooglePlayDriver(context);
   FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);

   Job job = dispatcher.newJobBuilder()
                    .setService(ReminderJobService.class)
                    .setTag(JOB_TAG)
                    .setConstraints(Constraint.ON_ANY_NETWORK)
                    .setLifetime(Lifetime.FOREVER)
                    .setRecurring(true)
                    .setReplaceCurrent(true)
                    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                    .setTrigger(Trigger.executionWindow(60, 65))
                    .build();

   dispatcher.mustSchedule(job);

scheduleReminders 函数从主活动的onCreate 方法调用。

【问题讨论】:

AFAICT,executionWindow() 只是一个提示。根据驱动程序,正在使用的底层引擎可能不支持所有可能的值。 【参考方案1】:

Trigger的源码包含:

  /**
   * Creates a new ExecutionWindow based on the provided time interval.
   *
   * @param windowStart The earliest time (in seconds) the job should be considered eligible to run.
   *     Calculated from when the job was scheduled (for new jobs) or last run (for recurring jobs).
   * @param windowEnd The latest time (in seconds) the job should be run in an ideal world.
   *     Calculated in the same way as @code windowStart.
   * @throws IllegalArgumentException if the provided parameters are too restrictive.
   */

由于您正在安排重复作业 (.setRecurring(true)),窗口开始时间将是自上次运行作业以来,如果您从一分钟开始重新安排作业,这可能会导致问题之前没有任何变化,尽管setReplaceCurrent(true) 应该可以避免这个问题。

更可能的原因(正如@CommonsWare 所说)是这些触发器并不完全准确,它们是在您希望操作系统安排您的工作时,而不是在实际发生时跑步。上面评论中的in an ideal world 短语是关键!

增加在正确时间执行的可能性的一种方法是增加操作系统的机会窗口,例如 50 和 100 秒而不是 60 和 65 秒。或者,如果您在确切的时间需要某些东西,也许报警是更好的方法。

【讨论】:

以上是关于JobService 的 onStartJob 方法在作业被调度后立即执行的主要内容,如果未能解决你的问题,请参考以下文章

Android JobScheduler onStartJob 多次调用

Android学习使用JobService

如何检查 JobService 是不是在 android 中运行?

如何将房间实例传递给 JobService?

Android JobService的使用及源码分析

JobService 不会在 android 9 中重新安排