Запустите JobService на переднем плане на Android

Я использую com.firebase.jobdispatcher.JobService для синхронизации данных, я начинаю его с планирования Job с помощью FirebaseJobDispatcher.

Проблема: мне не нравится задержка перед запуском при первом запуске приложения.

Есть ли способ запустить службу на Android O в качестве службы переднего плана (с уведомлением) при первом использовании? (вместо того, чтобы планировать это как работу)

Я попытался:

ContextCompat.startForegroundService(context, intent);

но это не вызывает onCreate JobService.


person Frank    schedule 18.10.2017    source источник


Ответы (2)


Вывод: пользуйтесь двумя сервисами.

com.firebase.jobdispatcher.JobService нельзя запустить на переднем плане.

Обычный Service не может быть запущен как запланированный Job.

Я создал два класса обслуживания, которые запускают один и тот же поток синхронизации: фиксированный.

person Frank    schedule 05.01.2018

Я бы посоветовал вам использовать новый JobIntentService, представленный в Oreo, вместо FirebaseJobDispatcher. Затем вы можете запустить фоновую службу на переднем плане вашего приложения (фоновые службы, созданные в фоновом режиме, теперь не разрешены бесплатно, у вас есть только 5 секунд, чтобы что-то сделать, прежде чем вы должны показать уведомление). С JobIntentService у вас нет этих ограничений.

Вам также не нужно показывать уведомление о синхронизации, если вы этого не хотите. Но если вам действительно нужно это сделать, сделайте это в методе onHandleWork() в JobIntentService.

В этой статье довольно хорошо объясняются новые ограничения фонового выполнения в Oreo:

https://medium.com/til-kotlin/jobintentservice-for-background-processing-on-android-o-39535460e060

JobIntentService действительно прост в использовании и решает любые проблемы, с которыми вы можете столкнуться из-за новых фоновых ограничений. Также очень легко преобразовать обычный IntentService, который использовался в pre-Oreo, в JobIntentService. Поскольку он находится в библиотеке поддержки, он перенесен на предыдущие версии. В Oreo и выше он позволяет ОС решать, когда планировать задания (вам не нужно работать напрямую с JobDispatcher), а до Oreo будет запущен обычный IntentService. Служба запускается и обрабатывает работу, вызывая статический вспомогательный метод enqueueWork().

Подробнее см. здесь:

https://developer.android.com/reference/android/support/v4/app/JobIntentService.html

person LaurieScheepers    schedule 18.10.2017
comment
Да, забыл упомянуть: JobIntentService автоматически обрабатывает блокировку пробуждения за вас. - person LaurieScheepers; 18.10.2017
comment
Спасибо за развернутый ответ. Я читал эти статьи, но где именно вы видите, что на Android O JobIntentService может запускаться как обычная служба, а не по расписанию и запускаться на X секунд позже? Вот о чем мой вопрос. Я не хочу планировать задачу. - person Frank; 18.10.2017
comment
Ах, хорошо, тогда я не уверен. Для наших намерений и целей нормально, что служба запускается, когда ОС решает ее запустить. В вашем случае использования, я думаю, вам придется показать уведомление о синхронизации, так как это может быть долгий процесс. - person LaurieScheepers; 18.10.2017
comment
Да, это то, что я хотел бы, но не во всех ситуациях. Мне нужен один сервис, который можно планировать и использовать на переднем плане. Кажется, это невозможно. - person Frank; 18.10.2017