根据WorkManager的this reference,您可以通过它安排三种类型的持续性工作,
- Immediate:必须立即开始并尽快完成的任务.可以加急.
- Long Running:可能运行时间更长,可能超过10分钟的任务.
- Deferrable:稍后开始并可以定期运行的计划任务.
这意味着您的大多数用例都可以通过使用WorkManager来实现,但有两种情况需要"每5分钟"运行一次;"在准确时间设置alert ".
建议从here开始,如果您想在准确的时间设置alert ,则不应使用WorkManager,而应使用AlarmManager,它将在指定的时间甚至从打盹模式唤醒设备.
Checkout all possible executions that work manager provides:
(Courtesy of WorkManager guide)
因此,根据您的用例,您可以使用以下所有可能的方法:
Downloading large file (500mb)
a、 Once a day on exact time个
Answer:您可以在此处使用PeriodicWork,从给定的开始时间开始,每24小时计划一次,因为这是一项长期运行的操作,您可以使其快速/前台跟踪正在进行的进度.虽然请记住,下载需要活动的internet连接,如果不可用,则会按指定的时间间隔进行,然后将其计划为延迟/稍后执行.
PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
b、 Once a day when the OS can, in any time个
Answer:这是您可以使用PeriodicWork不确定地执行某些任务的最佳示例.在这里,您可以将其延迟,因为它不需要在特定时间执行.
PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
Downloading small file (5k)
a、 Once a day on exact time个
Answer:它可以是周期性的工作,并立即执行(加急工作),计划24小时,因为下载小文件不会花费很长时间.
PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
// Additional configuration
.build()
b、 Once a day when the OS can, in any time个
Answer:它可以是具有延迟执行的周期性工作,可以安排在24小时内.
PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
// Additional configuration
.build()
Setting alarm at exact time
Answer:要设置在准确时间执行的报警,应使用AlarmManager.WorkManager无法使用此用例,因为它不会中断打盹模式(设备的深度睡眠).
Sync DB with server (large data about 5min runtime)
a、 Every 15 min (Minimal time?)个
Answer:这可以是每隔15分钟安排的周期性工作,因为它是长期运行的前台工作.
PeriodicWorkRequestBuilder<SyncToServerWorker>(15, TimeUnit.MINUTES)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
b、 Once a Day个
Answer:这可以是每隔24小时安排的周期性工作,因为它是长期运行的前台工作.
PeriodicWorkRequestBuilder<SyncToServerWorker>(1, TimeUnit.DAYS)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
Sync DB with server (small data less than 1sec runtime)
a、 Every 5 min个
Answer:由于WorkManager的定期工作的最小时间框架为15分钟,因此无法实现此用例.因此,建议通过前台服务/报警管理器组合手动管理此定期工作.
b、 Every 15 min个
Answer:这可以通过每15分钟安排一次的周期性工作来实现,根据需要的紧急/放松程度,可以加快或推迟.
PeriodicWorkRequestBuilder<SyncDataWorker>(15, TimeUnit.MINUTES)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Decide whether to make it expedited or deferrable here conditionally
// Additional configuration
.build()
c、 Once a Day个
Answer:这是每24小时安排一次周期性工作的例子,根据需要的紧急/放松程度,可以加快或推迟.
PeriodicWorkRequestBuilder<SyncDataWorker>(1, TimeUnit.DAYS)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // Decide whether to make it expedited or deferrable here conditionally
// Additional configuration
.build()
创建长期工作人员的参考:https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running
希望这有帮助!