Как JobIntentService связан с JobService?
В случае 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
может не запускаться сразу задание)?
Ответы
Ответ 1
JobIntentService
по существу является заменой для IntentService
, предлагая подобную семантику таким образом, чтобы "играть хорошо" с новыми ограничениями на выполнение ОС Android O. Он реализован как запланированное задание на O +, но это отвлекло - ваше приложение не должно заботиться о том, чтобы это работа.
Никогда schedule()
задание, которое вы ожидаете использовать через класс поддержки JobIntentService
. JobIntentService
использует систему enqueue()
в планировщике заданий, и вы не можете смешивать и сопоставлять enqueue()
и schedule()
для одного и того же задания.
Ответ 2
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.
Ответ 3
На самом деле, JobIntentService было бы лучше, если бы его переименовали в JobedIntendService, с JobService его на первый взгляд не видно.