避免从WorkManager中复制PeriodicWorkRequest

时间:2018-06-20 07:53:04

标签: android android-workmanager

在启动应用程序时,我想启动将永远运行的服务,但是当用户再次打开应用程序时,它将重复。

PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
        PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
        WorkManager.getInstance().enqueue(periodicWorkRequest);

1 个答案:

答案 0 :(得分:16)

您可以使用enqueueUniquePeriodicWork代替enqueue。根据文档:

  

此方法可让您排队一个唯一名称的   PeriodicWorkRequest,其中只有一个   特定名称可以一次处于活动状态。例如,您只能   希望激活一个同步操作。 如果有一个待处理,则可以   选择运行它还是将其替换为新作品。的   uniqueWorkName唯一标识此PeriodicWorkRequest。

您可以通过以下方式实现它:

PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
 PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
 WorkManager.getInstance().enqueueUniquePeriodicWork("Send Data",  ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);

注意:

ExistingPeriodicWorkPolicy.REPLACE确保如果有标记为uniqueWorkName的待处理工作被取消,并且新工作将运行。 ExistingPeriodicWorkPolicy.KEEP仅在没有标有uniqueWorkName的待处理工作时才运行新的PeriodicWorkRequest。