0

我正在开发一个应用程序,其中某些任务在特定时间在后台完成。

Android 开发者文档建议了各种方法。我知道 AlarmManager 可以用于此目的。但是,我认为,在打盹模式下使用 Android 6.0 中的 AlarmManager 会产生不正确的触发器。

我从开发人员文档中遇到了 JobScheduling 库

由于我的应用程序支持低于 Android 5.0 的版本。我想到了使用 FireBaseJobDispatcher。

我可以使用 FirebaseJobDispatcher 在特定时间触发特定任务吗?

例如:我想从上午 9 点到下午 6 点每小时更新一次数据库

4

1 回答 1

1

你可以,但如果你的时间窗口不是那么严格,则不能保证你的任务在几个小时后开始工作,因为打盹模式。如果您想要真正严格的调度 - 使用 AlarmManager.setAndAllowWhileIdle。而且,据我所知,FirebaseJobDispatcher 尚未发布,还有一些未解决的问题。com.google.android.gms:play-services-gcm在它发布之前,您可以为此目的使用 GCMNetworkManager(来自 Google Play Services )。您的 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);
于 2016-10-07T05:23:03.270 回答