Как 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 его на первый взгляд не видно.