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

fjc*_*fjc 4 android jobservice

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

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

Tim*_*Tim 5

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

只要 JobService 正在(或认为正在)工作,它就会持有一个唤醒锁。在返回的场景trueonStartJob()你负责,当任务完成通知系统。

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

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

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

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

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

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

int schedule (JobInfo job)
Run Code Online (Sandbox Code Playgroud)

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


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

int enqueue (JobInfo job, work)
Run Code Online (Sandbox Code Playgroud)

与 schedule(JobInfo) 类似,但允许您为新的或现有的工作排入队列。如果已经调度了具有相同 ID 的作业,它将被新的 JobInfo 替换,但任何先前排队的工作将保留并在下次运行时被调度。如果具有相同 ID 的作业已在运行,则新作业将排队等候。

为同一个 JobService 排队作业的工作方式与使用schedule(). 有关完整参考,请参阅其文档