出于兴趣并更好地理解错误情景:我有一个JobService
。在onStartJob
我返回true
通知JobManager
还有其他工作要做。 Android文档提到我需要调用jobFinished
让JobManager
知道作业已完成。
现在我想知道(并且可能有一个基于此的错误):如果我从不打电话给jobFinished
会怎样? Android会在某个时候杀死工作服务吗?它是否允许生成JobService的新实例?或者它会阻止其他服务启动?是否有最大数量的JobServices可以共存?
答案 0 :(得分:4)
如果我从未打电话给jobFinished会怎么样?
JobService持有唤醒锁,只要它(或者认为是)正在做工作。在您从true
返回onStartJob()
的情况下,您负责在作业完成时通知系统。
通过调用jobFinished()
表明工作已完成,然后JobService知道它可以释放唤醒锁。如果你没有打电话给jobFinished()
,那么唤醒锁不会被释放,并且会不断耗尽CPU。
Android会在某个时候终止工作服务吗?
JobService是Service的子类,所以是的。在某些情况下,操作系统会终止服务(例如内存不足)。
是否允许生成JobService的新实例?或者它会阻止其他服务启动?是否可以共存最大数量的JobServices?
如果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。