Могу ли я использовать Firebase JobDispatcher для запуска конкретных задач по времени?

Я разрабатываю приложение, в котором определенные задачи выполняются в фоновом режиме в определенное время.

Документы для разработчиков Android предлагают различные методы. Я знаю, что для этой цели можно использовать AlarmManager. Но, думаю, использование AlarmManager в Android 6.0 в режиме Doze будет давать неправильные триггеры.

Я наткнулся на библиотеки JobScheduling из документов для разработчиков.

Поскольку мое приложение поддерживает версию ниже Android 5.0. Я думал об использовании FireBaseJobDispatcher.

Могу ли я использовать FirebaseJobDispatcher для запуска определенной задачи в определенное время.

Например: я хочу обновлять БД один раз в час с 9:00 до 18:00.


person John    schedule 07.10.2016    source источник


Ответы (1)


Можно, но если ваше временное окно не такое строгое, нет гарантии, что ваша задача начнет работать через несколько часов, т.к. режим Doze. Если вы хотите действительно строгое планирование - используйте AlarmManager.setAndAllowWhileIdle. И, как я знаю, FirebaseJobDispatcher еще не выпущен, и есть несколько нерешенных проблем. До его выпуска вы можете использовать GCMNetworkManager (из Google Play Services 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);
person Roman_D    schedule 07.10.2016
comment
я думаю, что FJD выпущен 0.5.0 github.com/firebase/firebase-jobdispatcher-android/ релизы - person John; 07.10.2016
comment
Да, похоже FJD выпустили, спасибо. но все равно не стабильно, как по мне. - person Roman_D; 07.10.2016
comment
А как насчет сетевого менеджера GCM. Это стабильно? И можно ли его использовать ниже леденца на палочке? - person John; 07.10.2016
comment
Я понял . GCM Network Manager — это порт совместимости Android JobScheduler для приложений, поддерживающих версии Android до 5.0 (уровень API 21). - person John; 07.10.2016