如果我不为 JobService 调用 jobFinished 会怎样?

What happens if I don't call jobFinished for a JobService?

出于兴趣和更好地理解错误场景:我有一个 JobService。在 onStartJob 我 return true 通知 JobManager 还有额外的工作。 Android 文档提到我需要调用 jobFinishedJobManager 知道作业已完成。

现在我想知道(并且可能有基于此的错误):如果我从不调用 jobFinished 会发生什么? Android 会在某个时候终止作业服务吗?它会允许产生新的 JobService 实例吗?或者它会阻止其他服务启动吗?是否有可以共存的最大数量的 JobService?

What will happen if I never call jobFinished?

只要 JobService 正在(或认为正在)工作,它就会持有唤醒锁。在您 return true 来自 onStartJob() 的情况下,您负责在作业完成时通知系统。

通过调用 jobFinished() 表示工作已完成,然后 JobService 知道它可以释放唤醒锁。如果您不调用 jobFinished(),则不会释放唤醒锁并将继续消耗 CPU。

Will Android kill the job service at some point?

JobService 是 Service 的子类,所以是的。在某些情况下,OS 会终止服务(例如内存不足)。

Will it allow for new instances of the JobService to be spawned? Or will it prevent additional services to start? Is there a maximum number of JobServices that can coexist?

  • 您没有手动 create/instantiate JobServices。
  • JobService 一次只能处理一个作业。

如果您 schedule() 为同一个 JobService 使用相同的 JobInfo id 的新作业,当前作业将被停止并开始新作业。

int schedule (JobInfo job)

Schedule a job to be executed. Will replace any currently scheduled job with the same ID with the new information in the JobInfo. If a job with the given ID is currently running, it will be stopped.


如果您 enqueue() 为同一 JobService 创建新作业,它们将仅在当前作业完成后执行。如果调用失败jobFinished(),队列中的下一个作业将不会运行。

int enqueue (JobInfo job, work)

Similar to schedule(JobInfo), but allows you to enqueue work for a new or existing job. If a job with the same ID is already scheduled, it will be replaced with the new JobInfo, but any previously enqueued work will remain and be dispatched the next time it runs. If a job with the same ID is already running, the new work will be enqueued for it.

为同一个 JobService 排队作业与使用 schedule() 调度作业略有不同。有关完整参考,请参阅 its docs