Android Work Manager - Work Manager 会 100% 确保后台执行完成吗?

Android Work Manager - Does Work Manager will 100% ensure the background execution to be Completed?

根据我从文档中阅读的内容 https://developer.android.com/topic/libraries/architecture/workmanager

表示:

The task is still guaranteed to run, even if your app is force-quit or the device is rebooted.

也就是说,不管怎样,在后台的执行都会100%执行到完成?

举个例子:

应用程序具有执行工作管理器实现的按钮,可将数据上传到在线数据库,但它需要互联网连接 才能上传数据。因此,我的应用程序目前 处于离线模式 并且我单击按钮。

我的不确定性:

工作管理器 运行 进程是否会在后台运行,并且 继续重试进程 即使没有 Internet 连接?并且只完成并停止进程直到有互联网连接并完成数据上传?

Will the Work Manager run the process at background, and keep retrying the process even when there is no Internet Connection? and only complete and stop the process until there is an Internet Connection and complete the data upload?

它不会隐式地尝试连续执行工作,只有在成功时才停止。这将取决于 doWork() 或您的 Worker 返回的结果。如果它 returns RETRY,那么将使用 WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, long, TimeUnit) 中指定的退避重试工作。

但是,如果您需要在有互​​联网连接时执行某些操作,那么您可以指定适当的约束条件。对于网络连接,您可以按如下方式设置约束:

Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();

 OneTimeWorkRequest mywork=
            new OneTimeWorkRequest.Builder(MyWorker.class)
 .setConstraints(myConstraints)
 .build();
 WorkManager.getInstance().enqueue(mywork);

WorkManager 将确保您的工作仅在有互联网连接时执行。

Will the Work Manager run the process at background, and keep retrying the process even when there is no Internet Connection? and only complete and stop the process until there is an Internet Connection and complete the data upload?

因为您已指定工作管理器需要网络连接。

val constraints = Constraints.Builder()
                            .setRequiredNetworkType(NetworkType.CONNECTED).build()

val workRequest = OneTimeWorkRequest.Builder(RequestWorker::class.java)
                            .setConstraints(constraints)
                            .build()

直到有网络连接才会触发工作请求,将其视为 WorkManager 监听 NetworkState 的变化,一旦网络连接,它就会开始处理您的workRequest(doWork).

我还必须补充一点,当你的 phone 处于飞行模式并且你的 phone 重新启动时有待处理的 工作请求 ,我目前没有认为工作请求保证会像您预期的那样立即开始处理,即使 NetWork 状态为 CONNECTED。