4

出于兴趣和更好地理解错误场景:我有一个JobService. 在onStartJob我回来true通知JobManager有额外的工作。Android 文档提到我需要打电话jobFinished告知JobManager工作已经完成。

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

4

1 回答 1

5

如果我从不调用 jobFinished 会发生什么?

只要 JobService 正在(或认为正在)工作,它就会持有唤醒锁。在您返回的情况下,trueonStartJob()有责任在工作完成时通知系统。

通过调用jobFinished()您表明工作已完成,然后 JobService 知道它可以释放唤醒锁。如果你不调用jobFinished(),wakelock 不会被释放,并且会持续消耗 CPU。

Android 会在某个时候终止工作服务吗?

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

它会允许生成 JobService 的新实例吗?还是会阻止其他服务启动?可以共存的 JobService 是否存在最大数量?

  • 您无需手动创建/实例化 JobServices。
  • JobService 一次只能处理一项工作。

如果您schedule()为相同的 JobService具有相同 JobInfo id 的新作业,当前作业将停止并启动新作业。

int schedule (JobInfo job)

安排要执行的作业。将使用 JobInfo 中的新信息替换任何当前计划的具有相同 ID 的作业。如果具有给定 ID 的作业当前正在运行,它将被停止。


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

int enqueue (JobInfo job, work)

类似于 schedule(JobInfo),但允许您为新的或现有的工作排队。如果已经安排了具有相同 ID 的作业,它将被新的 JobInfo 替换,但任何先前排队的工作都将保留并在下次运行时分派。如果具有相同 ID 的作业已在运行,则新作业将为其排队。

为同一个 JobService 排队作业与使用schedule(). 如需完整参考,请参阅其文档

于 2017-09-08T10:07:51.697 回答