我已经实现了一些后台任务并使用这个Guide https://developer.android.com/guide/background。
有一次我需要使用协程工作者 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/coroutineworker。我发现这些指南非常好,但每次我需要后台处理的新要求时,我都会开始新的研究来满足我的需要。所以我的问题是,使用现代 Android 解决以下用例的正确方法是什么。另请注意,不同的手机品牌会挑衅地杀死后台任务(有些品牌对后台处理更严厉)。什么时候需要使用持久通知,什么时候不需要,以及什么时候使用报警管理器 https://developer.android.com/reference/android/app/AlarmManager。请为每项写出最佳实施方式以及如果持续通知 https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running必需的。
用例:
1.下载大文件(500mb)
A。每天一次,在准确的时间
b 每天一次,当操作系统可以随时
2.下载小文件(5k)
A。每天一次,在准确的时间
b 每天一次,当操作系统可以随时
3.设置准确的时间闹钟
4. 与服务器同步数据库(大数据约5分钟运行时间)
A。每 15 分钟一班(最短时间 https://developer.android.com/reference/androidx/work/PeriodicWorkRequest?)
b.一天一次
5. 与服务器同步DB(小数据运行时间小于1秒)
A。每 5 分钟一班
b.每15分钟一班
C。一天一次
根据这个参考 https://developer.android.com/topic/libraries/architecture/workmanagerWorkManager 中,您可以通过它安排三种类型的持久工作,
-
即时:必须立即开始并很快完成的任务。可能会加急。
-
长跑:可能运行较长时间(可能超过 10 分钟)的任务。
-
可延期:稍后启动并可以定期运行的计划任务。
这意味着您的大多数用例都可以通过使用 WorkManager 来实现,除了您需要“每 5 分钟”和“在准确时间设置警报”运行的两种情况之外。
推荐自here https://developer.android.com/topic/libraries/architecture/workmanager#other-APIs如果您想在准确的时间设置闹钟,则不应使用 WorkManager,而应使用 AlarmManager,它甚至会在指定时间从打瞌睡模式唤醒设备。
Checkout all possible executions that work manager provides:
(Courtesy of WorkManager guide https://developer.android.com/topic/libraries/architecture/workmanager#types)
因此,以下是您可以根据您的用例使用的所有可能方法:
-
下载大文件(500mb)
a. 每天一次,在准确的时间
Answer:您可以在此处使用从给定开始时间起每 24 小时安排一次的定期工作,因为它是长时间运行的操作,您可以将其设置为加急/前台来跟踪正在进行的进度。尽管请记住,下载需要有效的互联网连接,并且在指定的时间间隔内,如果不可用,则将安排延迟/稍后执行。
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. 每天一次,操作系统可以随时
Answer:这是最好的例子,您可以使用PeriodicWork不确定地执行某些任务。在这里您可以将其设置为可推迟,因为不需要在特定时间执行它。
PeriodicWorkRequestBuilder<LongRunningWorker>(1, TimeUnit.DAYS)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
-
下载小文件(5k)
a. 每天一次,在准确的时间
Answer:它可以是安排在 24 小时内立即执行(加急工作)的定期工作,因为下载小文件不会花费很长时间。
PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
// Additional configuration
.build()
b. 每天一次,操作系统可以随时
Answer:它可以是可延迟执行的定期工作,可以安排在 24 小时。
PeriodicWorkRequestBuilder<ShortSpanWorker>(1, TimeUnit.DAYS)
// Additional configuration
.build()
-
在准确的时间设置闹钟
Answer:要设置闹钟在准确的时间执行,您应该使用 AlarmManager。 WorkManager 无法实现此用例,因为它不会中断 Doze 模式(设备的深度睡眠)。
-
与服务器同步数据库(大数据约5分钟运行时间)
a. 每 15 分钟一次(最短时间?)
Answer:这可以是定期工作计划,每 15 分钟作为前台工作,因为它是长时间运行的。
PeriodicWorkRequestBuilder<SyncToServerWorker>(15, TimeUnit.MINUTES)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
b. 一天一次
Answer:这可以是每 24 小时的定期工作计划,作为前台工作,因为它是长期运行的。
PeriodicWorkRequestBuilder<SyncToServerWorker>(1, TimeUnit.DAYS)
// Additional configuration
.build()
//Calling setForeground() from doWork() will show ongoing notification
-
与服务器同步数据库(小数据运行时间小于1秒)
a. 每 5 分钟一班
Answer:此用例无法实现,因为 WorkManager 定期工作的最短时间范围为 15 分钟。因此,建议通过前台服务/警报管理器组合手动管理此定期工作。
b. 每15分钟一班
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. 一天一次
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()
创建长时间运行的worker参考:https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)