#android #alarmmanager #android-jobscheduler #firebase-job-dispatcher
#Android #alarmmanager #android-jobscheduler #firebase-job-dispatcher
Вопрос:
Я разрабатываю приложение, в котором определенные задачи должны выполняться в фоновом режиме в определенное время.
Документы разработчика Android предлагают различные методы. Я знаю, что для этой цели можно использовать AlarmManager. Но, я думаю, использование AlarmManager в Android 6.0 в режиме ожидания приведет к неправильным триггерам.
Я наткнулся на библиотеки планирования заданий из документов разработчика
Поскольку мое приложение поддерживает версию ниже Android 5.0. Я подумал об использовании FirebaseJobDispatcher.
Могу ли я использовать FirebaseJobDispatcher для запуска конкретной задачи в определенное время.
Например: я хочу обновлять базу данных один раз в час с 9 утра до 6 вечера
Ответ №1:
Вы можете, но если ваше временное окно не такое строгое, нет никакой гарантии, что ваша задача начнет работать через несколько часов, потому что режим ожидания. Если вы хотите действительно строгое планирование — используйте AlarmManager.setAndAllowWhileIdle. И, насколько я знаю, FirebaseJobDispatcher еще не выпущен, и есть несколько нерешенных проблем. Перед его выпуском вы можете использовать GcmNetworkManager (из служб Google Play com.google.android.gms:play-services-gcm
) для этой цели. Ваш код для FirebaseJobDispatcher может выглядеть следующим образом:
final FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
if (isSyncEnabled) {
Job job = dispatcher.newJobBuilder()
.setService(SyncService.class)
.setTag(TAG)
.setConstraints(isSyncOnlyWiFi ? Constraint.ON_UNMETERED_NETWORK : Constraint.ON_ANY_NETWORK)
.setRecurring(true) // !!!
.setLifetime(Lifetime.FOREVER) //!!!
.setTrigger(Trigger.executionWindow(syncIntervalInSeconds, syncIntervalInSeconds TIME_WINDOW_IN_SECONDS))
.setReplaceCurrent(true)
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.build();
final int result = dispatcher.schedule(job);
if (result != FirebaseJobDispatcher.SCHEDULE_RESULT_SUCCESS) {
// pre handle error
}
Для GcmNetworkManager:
PeriodicTask task = new PeriodicTask.Builder()
.setService(SyncManagerService.class)
.setTag(TASK_TAG_SYNC_SERVICE)
.setUpdateCurrent(true)
.setPersisted(true)
.setPeriod(period)
.setFlex(flexInSeconds < period ? flexInSeconds : period)
.setRequiredNetwork(wifiOnly ? PeriodicTask.NETWORK_STATE_UNMETERED : PeriodicTask.NETWORK_STATE_CONNECTED)
.build();
GcmNetworkManager.getInstance(context).schedule(task);
Комментарии:
1. я думаю, что FJD выпущен 0.5.0 github.com/firebase/firebase-jobdispatcher-android/releases
2. Да, похоже, что FJD выпущен, спасибо. но все же, как по мне, не стабильно.
3. Как насчет сетевого менеджера GCM. Он стабилен? И можно ли его использовать ниже lollipop?
4. я понял. GCM Network Manager — это порт совместимости Android JobScheduler для приложений, поддерживающих версии Android до 5.0 (уровень API 21)