Ответ 1
Правильно.
Хеннинг и P4u144 поставили меня на правильный путь, чтобы ответить на этот вопрос более подробно.
Определить все зарегистрированные вакансии
Определите вашу задачу с помощью команды adb shell dumpsys jobscheduler
.
Это даст вам огромный выход в следующих категориях.
- настройки
- Зарегистрированные XX Вакансии
- связь
- сигнализация
- вхолостую
- аккумулятор
- AppIdle
- содержание
- История работы
- Очередь в ожидании
Категория, в которой вы, скорее всего, заинтересованы, это зарегистрированные XX вакансии. Это говорит вам, сколько заданий было запланировано на устройстве.
Например, ваше имя пакета - com.foo.bar.application
вы должны увидеть com.foo.bar.application
запись:
JOB #u0a93/17: eec3709 com.foo.bar.application/com.evernote.android.job.v21.PlatformJobService
u0a93 tag=*job*/com.foo.bar.application/com.evernote.android.job.v21.PlatformJobService
Source: uid=u0a93 user=0 pkg=com.foo.bar.application
JobInfo:
Service: com.foo.bar.application/com.evernote.android.job.v21.PlatformJobService
PERIODIC: interval=+15m0s0ms flex=+5m0s0ms
PERSISTED
Requires: charging=false deviceIdle=false
Network type: 2
Backoff: policy=1 initial=+30s0ms
Has early constraint
Has late constraint
Required constraints: TIMING_DELAY DEADLINE UNMETERED
Satisfied constraints: CONNECTIVITY NOT_ROAMING APP_NOT_IDLE DEVICE_NOT_DOZING
Unsatisfied constraints: TIMING_DELAY DEADLINE UNMETERED
Earliest run time: 07:23
Latest run time: 12:23
Ready: false (job=false pending=false active=false user=true)
Совет: используйте
adb shell dumpsys jobscheduler | grep com.foo.bar.application
adb shell dumpsys jobscheduler | grep com.foo.bar.application
для быстрой фильтрации списка.
Теперь вы можете легко определить, была ли ваша работа зарегистрирована по правильным критериям.
FireBaseJobdispatcher
Если вы используете FirebaseJobDispatcher
lib, вы можете использовать
adb shell dumpsys activity service GcmService | grep com.foo.bar.debug
com.foo.bar.debug:0 v853
u0|com.foo.bar.debug: 3
(scheduled) com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="com.foo.bar.debug.job.FetchArticlesJob" trigger=window{start=10800s,end=11700s,earliest=10448s,latest=11348s} requirements=[NET_UNMETERED,DEVICE_IDLE] attributes=[PERSISTED,RECURRING] scheduled=-351s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
(scheduled) com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="com.foo.bar.debug.job.FetchNotificationGroupsJob" trigger=window{start=86400s,end=129600s,earliest=86048s,latest=129248s} requirements=[NET_CONNECTED,CHARGING] attributes=[PERSISTED,RECURRING] scheduled=-351s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
(scheduled) com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="com.foo.bar.debug.job.RemoveUnusedRealmArticlesJob" trigger=window{start=577980s,end=608400s,earliest=521961s,latest=552381s} requirements=[NET_ANY] attributes=[PERSISTED,RECURRING] scheduled=-56018s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
(finished) [com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver:com.foo.bar.debug.job.UpdateNotificationGroupJob,u0]
(finished) [com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver:com.foo.bar.debug.job.UpdatePushTokenJob,u0]
(finished) [com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver:com.foo.bar.debug.job.FetchArticlesJob,u0]
чтобы проверить, был ли ваш сервис запланирован или запущен.
Заставь свою задачу бежать
При создании Job
вы получите JOB_ID
.
Используйте этот JOB_ID
для запуска задания.
Это можно сделать с помощью adb shell cmd jobscheduler run
(требуется Android 7.1 или выше).
Например, ваше имя пакета - com.foo.bar.application
а JOB_ID
- 1. Теперь вы можете запустить задачу через adb
adb shell cmd jobscheduler run -f com.foo.bar.application 1
Не забудьте -f
поскольку это заставляет задание выполняться, даже если установленные ограничения не выполняются.
Evernote Android Job Lib
Последнее, но не менее важное.
Используйте для этого замечательную библиотеку от Evernote.
Это позволяет легко JobScheduler
на более низких уровнях API, используя JobScheduler
, GcmNetworkManager
или AlarmManager
зависимости от уровня API.
Редактировать 24/08
Еще лучше использовать библиотеку диспетчера заданий Firebase.
Firebase JobDispatcher - это библиотека для планирования фоновых заданий в вашем приложении для Android. Он предоставляет JobScheduler-совместимый API, который работает на всех последних версиях Android (уровень API 9+), на которых установлены службы Google Play.
Я надеюсь, что это помогло.
Спасибо
Изменить 28/04/2019
И Evernote Android-Job, и Firebase JobDispatcher теперь находятся в режиме только обслуживания, и они оба предлагают использовать Jetpack WorkManager для таких задач.