我认为存在三个问题。
1) 每次 enqueue myWork 到 WorkManager 实例时,您都会创建一个新的周期性工作。
试试看,MyWorker.class 的 doWork() 方法中的逻辑第一次运行一次,第二次运行两次。您很可能向工作管理器添加了 11 个作品,这就是您上次检查时它运行 11 次的原因。如果您创建新作品并将其添加到工作管理器中,则myWork 运行的次数会增加。
与 Job Scheduler 类似,您必须先检查 Work 是否存在,然后才能将其添加到 Work Manager。
示例代码:
final WorkManager workManager = WorkManager.getInstance();
final LiveData<List<WorkStatus>> statusesByTag = workManager
.getStatusesByTag(TAG_PERIODIC_WORK_REQUEST);
statusesByTag.observe(this, workStatuses -> {
if (workStatuses == null || workStatuses.size() == 0) {
Log.d(TAG, "Queuing the Periodic Work");
// Create a periodic request
final PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES)
.addTag(TAG_PERIODIC_WORK_REQUEST)
.build();
// Queue the work
workManager.enqueue(periodicWorkRequest);
} else {
Log.d(TAG, "Work Status Size: " + workStatuses.size());
for (int i = 0; i < workStatuses.size(); i++) {
Log.d(TAG, "Work Status Id: " + workStatuses.get(i).getId());
Log.d(TAG, "Work Status State: " + workStatuses.get(i).getState());
}
Log.d(TAG, "Periodic Work already exists");
}
});
在上面的示例中,我使用了一个唯一标签 TAG_PERIODIC_WORK_REQUEST 来识别我的周期性工作,并在创建它之前检查它是否存在。
2) 当应用被终止时,您的工作可能没有运行。
您要测试的品牌是什么?是小米吗?您是否在其他多个品牌上进行过测试并得到相同的结果?
是否处于打盹模式?当您设置 24 小时时间时,您如何验证工作没有运行?
工作管理器提供向后兼容性,但您仍然需要处理设备特定的逻辑。在小米设备上,类似于 Job Scheduler(或 Firebase Job Dispatcher 或 Alarm),当应用被杀死时,周期性工作停止。
3) 我只是觉得WorkManager 提供的PeriodicWorkRequest 有问题。
自上周开始以来,我一直在多台设备上对其进行测试。我在第一次启动应用程序时创建了一个作品,并且三天没有打开它。第一次运行一次,触发第二次同步时运行两次,在这之间,它增加到 13 次,下降到 1 次,4 次等等。
在另一个测试中,我在第一次安装期间使用以下代码创建了一个作品,并从第二次安装中删除了该代码。在这个测试过程中,即使工作成功完成,工作每次都运行,杀死后打开应用程序。
final PeriodicWorkRequest periodicWorkRequest =
new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES)
.addTag("periodic-work-request")
.build();
// Queue the work
WorkManager.getInstance().enqueue(periodicWorkRequest);
我明白,因为它仍处于 alpha 阶段。我认为您不应该在生产中使用它。