如果我没有为JobService调用jobFinished会发生什么?

时间:2017-06-11 18:41:33

标签: android jobservice

出于兴趣并更好地理解错误情景:我有一个JobService。在onStartJob我返回true通知JobManager还有其他工作要做。 Android文档提到我需要调用jobFinishedJobManager知道作业已完成。

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

1 个答案:

答案 0 :(得分:4)

  

如果我从未打电话给jobFinished会怎么样?

JobService持有唤醒锁,只要它(或者认为是)正在做工作。在您从true返回onStartJob()的情况下,您负责在作业完成时通知系统。

通过调用jobFinished()表明工作已完成,然后JobService知道它可以释放唤醒锁。如果你没有打电话给jobFinished(),那么唤醒锁不会被释放,并且会不断耗尽CPU。

  

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

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

  

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

  • 您不手动创建/实例化JobServices。
  • JobService一次只能处理一个作业。

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

int schedule (JobInfo job)
     

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

如果enqueue()同一个JobService的新作业,它们将仅在当前作业完成后执行。如果您未能调用jobFinished(),队列中的下一个作业将无法运行。

int enqueue (JobInfo job, work)
     

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

为同一JobService排队作业的工作方式与使用schedule()计划作业的方式略有不同。有关完整参考,请参阅its docs