19

我想在每次用户在数据库中添加特定时间的注释时安排通知。虽然使用 AlarmManager、BroadcastReceiver 等有多种方法可以做到这一点。如何使用 WorkManager 做到这一点?

4

5 回答 5

15

WorkManager不适用于需要在特定时间进行的工作。

您应该使用AlarmManager,特别是AlarmManagerCompat.setExactAndAllowWhileIdle()来在特定时间获取回调。

于 2018-05-13T00:39:05.213 回答
6

您可以在 workmanager 的帮助下显示通知。Workmanger 可用于调度单次发生的任务或周期性发生的任务,我们也可以在特定时间安排任务。

OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();

'delayedTime' -> 计算触发通知的时间

更多实施细节请点击这里。要阅读有关工作经理的更多信息,请单击此处

于 2019-04-16T10:45:14.920 回答
2

根据关于工作管理器的 Android 官方文档:“这些 API 让您可以创建一个任务并将其交给 WorkManager 以立即或在适当的时间运行”。在我的应用程序中,我将工作设置为在 20 秒后激活:

 // Schedule the time
 val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
    WorkManager.getInstance().enqueue(request)
于 2018-05-23T21:56:54.763 回答
1

正如ianhanniballake所说

WorkManager 不适用于需要在特定时间发生的工作。

但这可以设置在不久的将来的确切时间,具体取决于电池优化的状态。

解决方法如下:

// Time to show notification at
LocalDateTime timeAt = LocalDate.now().atTime(20, 0);
LocalDateTime timeNow = LocalDateTime.now();

OneTimeWorkRequest.Builder workBuilder = new OneTimeWorkRequest.Builder(NotificationWorker.class);
// I just need to set an delay here
workBuilder.setInitialDelay(Duration.between(timeNow, timeAt));

// This is just to complete the example
WorkManager.getInstance().enqueueUniqueWork(UNIQUE_WORK_SHOW_NOTIFICATION,
                                    ExistingWorkPolicy.REPLACE,
                                    workBuilder.build());
于 2019-02-19T13:33:20.053 回答
0

当您想在特定时间触发通知时,使用工作管理器执行此类任务不是一个好习惯,因为工作管理器适用于管理周期性或延迟功能的延迟和异步任务。您仍然可以使用此方法执行此操作,即不是一个好习惯,

你可以得到这样的日历值,

val timePicker = your timepicker here
val calendar: Calendar = Calendar.getInstance()
val nowMillis = calendar.timeInMillis

然后您可以为特定任务设置您的工人,如下所示,

calendar.set(calendar.get(Calendar.YEAR),
         calendar.get(Calendar.MONTH),
         calendar.get(Calendar.DAY_OF_MONTH),
         timePicker.hour,
         timePicker.minute)
val difference = calendar.timeInMillis - nowMillis
val alarmRequest = OneTimeWorkRequest
            .Builder(AlarmWorker::class.java)
            .setInitialDelay(difference, TimeUnit.MILLISECONDS).build()
WorkManager.getInstance(this).enqueue(alarmRequest)
于 2021-11-15T06:47:31.490 回答