每次应用程序启动时,我都使用ExistingPeriodicWorkPolicy.KEEP排队定期工作,以便如果已经有计划,则不会排队其他工作。
假设在未来的应用程序更新中,我更改了工作的约束或周期性,但保留了原始的uniqueName
。这个更改会被忽略吗,因为PeriodicWorkRequest
使用相同的uniqueWorkName
?
还是说当应用程序更新时,所有应用程序的工作都将被取消,因此这不是问题?
在这里最好的方法是什么?
每次应用程序启动时,我都使用ExistingPeriodicWorkPolicy.KEEP排队定期工作,以便如果已经有计划,则不会排队其他工作。
假设在未来的应用程序更新中,我更改了工作的约束或周期性,但保留了原始的uniqueName
。这个更改会被忽略吗,因为PeriodicWorkRequest
使用相同的uniqueWorkName
?
还是说当应用程序更新时,所有应用程序的工作都将被取消,因此这不是问题?
在这里最好的方法是什么?
在更新应用程序时,计划中的工作将被保留。
如果您想修改workRequest
,唯一的选项是取消之前的请求并注册一个新请求。
我认为这不是WorkManager特定的问题,因为新的应用程序版本可能需要进行一次性操作(介绍新功能,迁移某些首选项,修改某些WorkManager工作等)。有一些有用的答案使用SharedPreferences在此问题中。
我会在应用程序处理升级的部分添加此WorkRequest更改。
uniqueWorkName
外,您还可以为WorkRequest
设置特定的Tag
。实际上,您可以保留uniqueWorkName
而不用担心它。WorkRequest
的约束条件时,您需要首先从队列中删除旧式的WorkRequest
,然后将新式的WorkRequest
添加到队列中。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);
}