如果应用程序更新,WorkManager 的队列是否会被清除?

Will WorkManager's queue be cleared in case of an app update?

在每次应用程序启动时,我都会使用 ExistingPeriodicWorkPolicy.KEEP 将定期工作排入队列,这样如果已经有一个计划,就不会再有额外的工作排入队列。

假设在未来的应用程序更新中,我更改了工作的约束或周期,但保持原来的 uniqueName。 由于 PeriodicWorkRequest 使用相同的 uniqueWorkName,此更改是否会被忽略?

或者这不会成为问题,因为应用程序更新时,应用程序的所有工作都被取消了吗?

最好的方法是什么?

WorkManager | Android Developer 所述,除了 uniqueWorkName 之外,您还可以将特定的 Tag 设置为 WorkRequest。事实上,您可以保留 uniqueWorkName 而不必担心它。

当您需要更改 WorkRequest 的约束时,您需要首先从队列中删除 old-fashioned WorkRequest,然后将 new-fashioned 添加到队列中.

这是一段代码

PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(FooWorker.class)
    .addTag("m_TAG_Version_1")
    .build();
workManager
    .enqueueUniquePeriodicWork("uniqueWorkName", ExistingPeriodicWorkPolicy.KEEP, request);

然后以后

if(isWorkUpdated)
{
    workManager.cancelAllWorkByTag("m_TAG_Version_1");
    PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(FooWorker.class)
        .addTag("m_TAG_Version_2")
        .build();
    workManager
        .enqueueUniquePeriodicWork("uniqueWorkName", ExistingPeriodicWorkPolicy.KEEP, request);
}

当您更新您的应用程序时,计划的工作将得到维护。

如果要修改 workRequest 唯一的选择是取消之前的请求并注册一个新的。

我不认为这是 WorkManager 的特定问题,因为新的应用程序版本可能只需要执行一次操作(加入新功能、迁移某些首选项、修改某些 WorkManager 工作等)。在 this question.

中使用 SharedPreferences 有一些有用的答案

我会在您的应用程序中处理升级的部分添加此 WorkRequest 更改。