我可以使用 Firebase JobDispatcher 来触发特定时间的任务吗
Can i use Firebase JobDispatcher for triggering time specific tasks
我正在开发一个应用程序,其中某些任务要在特定时间在后台完成。
Android 开发者文档建议了多种方法。我知道 AlarmManager 可以用于此目的。但是,我认为,在 Doze 模式下使用 Android 6.0 中的 AlarmManager 会产生不正确的触发器。
中发现了 JobScheduling 库
因为我的应用程序支持 Android 5.0 以下的版本。我想到了使用 FireBaseJobDispatcher。
我可以使用 FirebaseJobDispatcher 在特定时间触发特定任务吗?
例如:我想从上午 9 点到下午 6 点每小时更新一次数据库
可以,但是如果你的时间window不是那么严格,不能保证你的任务在几个小时后开始工作,因为打瞌睡模式。如果你想要真正严格的调度 - 使用 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);
我正在开发一个应用程序,其中某些任务要在特定时间在后台完成。
Android 开发者文档建议了多种方法。我知道 AlarmManager 可以用于此目的。但是,我认为,在 Doze 模式下使用 Android 6.0 中的 AlarmManager 会产生不正确的触发器。
中发现了 JobScheduling 库因为我的应用程序支持 Android 5.0 以下的版本。我想到了使用 FireBaseJobDispatcher。
我可以使用 FirebaseJobDispatcher 在特定时间触发特定任务吗?
例如:我想从上午 9 点到下午 6 点每小时更新一次数据库
可以,但是如果你的时间window不是那么严格,不能保证你的任务在几个小时后开始工作,因为打瞌睡模式。如果你想要真正严格的调度 - 使用 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);