出于兴趣,为了更好地理解错误场景:我有一个JobService
。在onStartJob
中,我返回true
以通知JobManager
还有其他工作。android文档提到我需要调用jobFinished
让JobManager
知道作业已经完成。
现在我想知道(并且可能有一个基于此的bug):如果我从不调用jobFinished
,会发生什么?android会在某个时候终止job服务吗?它是否允许生成jobservice的新实例?还是会阻止其他服务启动?是否有可以共存的最大jobservices数量?
最佳答案
如果我再也不给jobfinished打电话会怎么样?
jobservice在工作期间(或认为工作期间)保持唤醒锁。在从true
返回onStartJob()
的情况下,您负责在作业完成时通知系统。
通过调用jobFinished()
表示工作已完成,然后jobservice知道它可以释放wakelock。如果不调用jobFinished()
,则wakelock不会释放,并将继续耗尽cpu。
android会在某个时候终止job服务吗?
jobservice是服务的一个子类,所以是的。在某些情况下,操作系统会终止服务(例如内存不足)。
它是否允许生成jobservice的新实例?还是会阻止其他服务启动?是否有可以共存的最大jobservices数量?
您不会手动创建/实例化JobServices。
JobService一次只能处理一个作业。
如果您使用相同的jobService和jobinfo id为新作业schedule()
,则当前作业将停止,新作业将启动。
int schedule (JobInfo job)
安排要执行的作业。将用jobinfo中的新信息替换任何具有相同id的当前计划作业。如果具有给定ID的作业当前正在运行,则该作业将被停止。
如果同一jobservice的新作业
enqueue()
,则它们将仅在当前作业完成后执行。如果未能调用jobFinished()
,则队列中的下一个作业将不会运行。int enqueue (JobInfo job, work)
与schedule(jobinfo)类似,但允许您将新作业或现有作业排队。如果已计划具有相同ID的作业,则该作业将替换为新的作业信息,但任何先前排队的作业将保留下来,并在下次运行时被分派。如果具有相同ID的作业已在运行,则新作业将排队等待。
为同一作业服务排队作业的工作方式与使用
schedule()
调度作业的工作方式稍有不同。有关完整的参考,请参见its docs。