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

#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)