避免WorkManager立即运行?

4

我在我的主活动中有一个WorkManager:

   private void startwork() {
        PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(AlarmReceiver.class, 16, TimeUnit.MINUTES)
                .setConstraints(Constraints.NONE)
                .build();
        WorkManager.getInstance(MainActivity.this)
                .enqueueUniquePeriodicWork("workname", ExistingPeriodicWorkPolicy.REPLACE, work);
    }

我希望每隔16分钟播放一次警报。

问题在于,每次用户启动应用程序时,它都会立即显示一个警报,我希望在用户打开应用程序后的16分钟后才显示警报。

public Result doWork() {
notify();
}

有什么办法能避免用户每次打开应用都弹出此警报?我只想将它重新安排在16分钟后。

2个回答

3

您应该使用setInitialDelay,如果您在应用运行时使用ExistingPeriodicWorkPolicy.REPLACE,它将替换您之前的工作器,请改用ExistingPeriodicWorkPolicy.KEEP

        PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(AlarmReceiver.class, 16, TimeUnit.MINUTES)
                .setInitialDelay(16, TimeUnit.MINUTES)
                .build();
        WorkManager.getInstance(MainActivity.this)
                .enqueueUniquePeriodicWork("workname", ExistingPeriodicWorkPolicy.KEEP, work);

我添加了setInitialDelay并删除了setContraints,但每次打开MainActivity时,仍然会收到来自worker的警报...有什么想法是错的吗?我保留了REPLACE而不是KEEP,因为我希望每次用户打开主活动时都能重新安排工作人员... - RGS
通知显示之前调用了哪些函数?是 startwork() -> doWork() -> 显示通知吗?如果在调用 startwork() 之前调用了 doWork(),可能仍然存在一个流浪的 WorkRequest;尝试删除应用程序。 - Michiel
startwork() 在 MainActivity 的 protected void onCreate 中。而我有一个 public class AlarmReceiver extends Worker { 类... - RGS
嗯,我已经使用这个约束条件进行了测试,但它并没有像你说的那样立即执行,因为策略是REPLACE。 - Công Hải
1
给OP的提示,不要忘记将初始延迟设置为15分钟以上,如果是15分钟或更短时间,它会立即触发。我曾经遇到过这种情况。将其设置为16分钟或更长时间后,延迟效果才如预期。 - Robby Lebotha

3

构建器有一个函数setInitialDelay,请按如下方式调用。默认约束已经是Constraints.NONE,因此再次设置不会产生任何结果。

private void startwork() {
    PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(AlarmReceiver.class, 16, TimeUnit.MINUTES)
            .setInitialDelay(16, TimeUnit.MINUTES)
            .build();

    WorkManager.getInstance(MainActivity.this)
            .enqueueUniquePeriodicWork("workname", ExistingPeriodicWorkPolicy.REPLACE, work);
}

作为一个担心的潜在用户,你真的想每16分钟发送一次通知吗?

16分钟仅用于测试,用户将在应用程序设置中选择它。我添加了setInitialDelay并删除了setContraints,但每次打开MainActivity时,我仍然会收到来自worker的警报...有什么想法是错的吗? - RGS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接