出于兴趣,为了更好地理解错误场景:我有一个JobService。在onStartJob中,我返回true以通知JobManager还有其他工作。android文档提到我需要调用jobFinishedJobManager知道作业已经完成。
现在我想知道(并且可能有一个基于此的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

08-07 19:55