多个OneTimeWorkRequests,延迟为链

时间:2018-06-07 20:23:36

标签: android android-jetpack android-workmanager

我正在制作应用医学提醒,应该根据数据库中保存的日期和小时来提醒医学消费。 提醒应以通知的形式进行。 让我们假设我有一种药应该被消耗两次(例如在下午9:50和晚上9:55进行快速测试)。通过按钮单击触发通知。

我的问题 - 只会显示第一个通知而其他通知不会显示。

这是我的代码:

public void makeNotifications(Date now, String[] medicineNames, Date[] 
takingTime) {

    WorkContinuation continuation = null;

    for (int i = 1; i < medicineNames.length + 1; i++) {

        Data.Builder dataBuilder = new Data.Builder()
                .putString(MEDICINE_NAME_KEY, medicineNames[i - 1])
                .putLong(MEDICINE_TAKING_TIME_KEY, takingTime[i - 1].getTime());
        OneTimeWorkRequest.Builder requestBuilder =
                new OneTimeWorkRequest.Builder(NotificationWorker.class)
                        .setInputData(dataBuilder.build());

        if (i == 1) {
            long diff = Math.abs(takingTime[i - 1].getTime() - now.getTime());
            requestBuilder.setInitialDelay(diff, TimeUnit.MILLISECONDS);
            continuation = mWorkManager.beginUniqueWork(
                    MEDICINE_NOTIFICATION_KEY,
                    ExistingWorkPolicy.KEEP,
                    requestBuilder.build());
        } else {
            long diff = Math.abs(takingTime[i - 1].getTime() - now.getTime());
            requestBuilder.setInitialDelay(diff, TimeUnit.MILLISECONDS);
            continuation.then(requestBuilder.build());
        }
    }
    continuation.enqueue();
} 

您有任何建议/解释/解决方案吗?

1 个答案:

答案 0 :(得分:0)

WorkManager不是用例的最佳解决方案,因为您需要在特定时间上完成一些琐碎的工作。 WorkManager将遵守打ze模式的条件,如果设备处于打ze模式,则不会发布您的通知。

我建议您改用AlarmManager。使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()的AlarmManager

基于documentation

  

标准AlarmManager警报(包括setExact()和setWindow())   推迟到下一个维护窗口。

     
      
  • 如果您需要设置在打ze睡时触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
  •   
  • 通过setAlarmClock()设置的警报继续正常触发-在这些警报触发之前,系统立即退出Doze。
  •