66

我想安排每晚的数据库更新。所以我使用新的 Android WorkManager。我的理解是,一旦安排好,它将始终在后台独立于应用程序的生命周期运行。那正确吗?我的第一个测试表明只有在应用程序运行时才执行工作。

val locationWork = PeriodicWorkRequest.Builder(UpdateDatabaseWorker::class.java, 24, TimeUnit.HOURS)
                        .addTag("DATABASE_UPDATE_SERVICE")
                        .build()
WorkManager.getInstance().enqueue(locationWork)
4

3 回答 3

118

根据WorkManager bugtracker上报告的各种问题,他们的文档对于WorkManager在这种边缘情况下的确切行为并不完全准确。

在某些设备上,当应用程序从任务管理器中清除时,应用程序会被强制停止,因此该部分是预期的。...来源


不幸的是,某些设备会从最近的菜单中终止应用程序作为强制停止。股票 Android 不这样做。当一个应用程序被强制停止时,它无法执行作业、接收警报或广播等。所以不幸的是,我们无法解决它——问题出在操作系统上,没有解决方法。资源


我们遇到的唯一问题是一些中国原始设备制造商将刷卡从最近删除视为强制停止的情况。发生这种情况时,WorkManager 将在下次启动应用程序时重新安排所有待处理的作业。鉴于这是违反 CDD 的行为,WorkManager 没有太多可以做的,因为它有一个客户端库。资源


此外,如果设备制造商决定修改现有的 Android 以强制停止应用程序,WorkManager 将停止工作(JobScheduler、警报、广播接收器等也将停止工作)。没有办法解决这个问题。不幸的是,一些设备制造商会这样做,因此在这些情况下,WorkManager 将停止工作,直到下次启动应用程序。资源


OneTimeWorkRequest通过在具有股票 android 的 Pixel 2 XL 上对 a(无限制)进行密集测试,行为如下:

  • 任务管理器关闭:
    • 工作继续(稍等片刻)
  • 重启设备(工作运行):
    • 重启完成后工作继续
  • 应用信息“强制停止”:
    • 工作停止,只有在重新启动应用程序时才会继续
  • 重启设备(工作是“强制停止”):
    • 直到应用程序再次启动,工作才会继续

您可以在dontkillmyapp.com上找到不同 OEM 行为的完整列表。Android 团队似乎也承认了这个问题,并在他们的 Android Q 的 CTS 测试中添加了一个测试。来源

于 2018-10-02T09:20:20.660 回答
5

我的理解是,一旦安排好,它将始终在后台独立于应用程序的生命周期运行。那正确吗?

是的。基于文档

即使您的应用程序被强制退出或设备重新启动,该任务仍然可以保证运行。

WorkManager 根据设备 API 级别和应用程序状态等因素选择适当的方式来运行您的任务。如果 WorkManager 在应用程序运行时执行您的任务之一,WorkManager 可以在应用程序进程的新线程中运行您的任务。如果您的应用程序未运行,WorkManager 会根据设备 API 级别选择适当的方式来安排后台任务。

WorkManager 可能会使用 JobScheduler、Firebase JobDispatcher 或 AlarmManager,具体取决于 API 级别。在执行工作之前,它将遵守打盹并考虑所有其他约束。打盹模式可能会出现一些延迟,因为它可能会等待维护窗口。

笔记:

WorkManager 适用于需要保证即使应用程序退出系统也会运行它们的任务,例如将应用程序数据上传到服务器。它不适用于在应用程序进程消失时可以安全终止的进程内后台工作;对于这样的情况,我们建议使用 ThreadPools。

于 2018-06-04T13:51:33.213 回答
1

这就是文档所说的:

注意:WorkManager 适用于需要保证即使应用程序退出系统也会运行它们的任务,例如将应用程序数据上传到服务器。它不适用于在应用程序进程消失时可以安全终止的进程内后台工作;对于这样的情况,我们建议使用 ThreadPools。

但必须有一些条件。如果满足该条件,那么 WorkManager 将运行该任务(这很重要)。诸如“仅在设备充电和在线时”之类的条件

仔细阅读本文,WorkManager 会尝试按照您请求的时间间隔运行您的任务,但要遵守您施加的约束及其其他要求。

在这里,我找到了一个关于如何使用 WorkManager 来安排任务的好教程:https ://android.jlelse.eu/how-scheduling-work-with-new-android-jetpack-component-workmanager-852163f4825b

于 2018-06-04T13:53:54.240 回答