【问题标题】:Avoid WorkManager to run immediately?避免 WorkManager 立即运行?
【发布时间】:2020-07-05 09:37:59
【问题描述】:

我的 mainactivity 中有一个 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 分钟。

【问题讨论】:

    标签: java android android-workmanager


    【解决方案1】:

    builder 有一个函数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 我仍然收到来自工作人员的警报......有什么想法有什么问题吗?
    【解决方案2】:

    您应该使用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 我仍然收到来自工作人员的警报...任何想法有什么问题吗?我离开了替换而不是保留,因为我想在每次用户打开主要活动时重新安排工作人员......
    • 在通知出现之前调用了哪些函数?是startwork() -> doWork() -> 显示通知吗?如果在startwork() 之前调用了doWork(),那么可能还有一个流氓WorkRequest;尝试删除该应用。
    • startwork() 在 MainActivity 的 protected void onCreate 内。我有public class AlarmReceiver extends Worker { 类...
    • 嗯,我已经用这个约束进行了测试,但它并没有像你说的那样立即执行,政策也是 REPLACE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多