如果Service
和IntentService
主要差异是Service
在主要线程上运行,而IntentService
则没有,后者在工作完成后自行完成我们必须致电stopService()
或stopSelf()
来停止Service
。
这两个都可以简单地传递给startService()
。
JobService
和JobIntentService
呢?
我们采取以下代码段:
JobInfo job = new JobInfo.Builder(id, new ComponentName(context, ExampleJobService.class))
.build();
JobScheduler scheduler = (JobScheduler) context
.getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(job);
ExampleJobService.class
可以同时引用JobService
和JobIntentService
吗?
行为是否与Service
和IntentService
相同(除了JobScheduler
可能无法立即启动作业)?
答案 0 :(得分:8)
JobIntentService
本质上是IntentService
的替代品,以与Android O的新后台执行限制“玩得很好”的方式提供类似的语义。它被实现为O +上的预定作业,但这已被抽象出来 - 您的应用程序不需要关心它是一项工作。
永远schedule()
您希望通过JobIntentService
支持类直接使用JobIntentService
作业。 enqueue()
使用作业计划程序中的enqueue()
系统,您无法将schedule()
和std::unique
混合并匹配到同一作业。
答案 1 :(得分:8)
JobService用于安排JobScheduler的后台工作。以上ExampleJobService.class
的代码段可用于启动JobService。
在哪里,可以使用以下代码启动JobIntentService:
// JobIntentService for background task
Intent i = new Intent(context, ExampleJobIntentService.class);
ExampleJobIntentService.enqueueWork(context,i);
JobIntentService能够在Android Oreo设备之前和之后工作。
在Oreo版本的平台上运行时,JobIntentService将使用Context.startService。 在Android O或更高版本上运行时,工作将通过JobScheduler.enqueue作为作业分派。
答案 2 :(得分:0)
实际上,如果重命名为JobedIntendService,JobIntentService会更好,因为乍一看,JobService会让他们迷惑不解。