如何使用 WorkManager 安排通知?
How to schedule notifications using WorkManager?
我想在用户每次在特定时间在数据库中添加注释时安排通知。虽然有多种方法可以使用 AlarmManager、BroadcastReceiver 等来完成。如何使用 WorkManager 来完成?
WorkManager
不适合需要在特定时间进行的工作。
您应该使用 AlarmManager
,特别是 AlarmManagerCompat.setExactAndAllowWhileIdle(),以便在特定时间获得回调。
根据 Android 关于 worker manager 的官方文档:"These APIs let you create a task and hand it off to WorkManager to run immediately or at an appropriate time"。在我的应用程序中,我设置了一个作品在 20 秒后激活:
// Schedule the time
val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
WorkManager.getInstance().enqueue(request)
如所述
WorkManager isn't appropriate for work that needs to happen at a particular time.
不过这个可以设置在近期的确切时间,具体取决于电池优化状态。
解决方法如下:
// 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());
您可以在 workmanager 的帮助下显示通知。 Workmanger 可用于调度单次出现的任务或周期性出现的任务,我们也可以在特定时间安排任务。
OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();
'delayedTime' -> 计算触发通知的时间
更多实施细节click here。
阅读更多关于 workmanager click here
当您想在特定时间触发通知时,使用工作管理器执行此类任务不是一个好习惯,因为工作管理器用于管理周期性或延迟的延迟和异步任务functionality.Still您可以使用此方法执行此操作不是一个好的做法,
您可以像这样获取日历值,
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)
我想在用户每次在特定时间在数据库中添加注释时安排通知。虽然有多种方法可以使用 AlarmManager、BroadcastReceiver 等来完成。如何使用 WorkManager 来完成?
WorkManager
不适合需要在特定时间进行的工作。
您应该使用 AlarmManager
,特别是 AlarmManagerCompat.setExactAndAllowWhileIdle(),以便在特定时间获得回调。
根据 Android 关于 worker manager 的官方文档:"These APIs let you create a task and hand it off to WorkManager to run immediately or at an appropriate time"。在我的应用程序中,我设置了一个作品在 20 秒后激活:
// Schedule the time
val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
WorkManager.getInstance().enqueue(request)
如
WorkManager isn't appropriate for work that needs to happen at a particular time.
不过这个可以设置在近期的确切时间,具体取决于电池优化状态。
解决方法如下:
// 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());
您可以在 workmanager 的帮助下显示通知。 Workmanger 可用于调度单次出现的任务或周期性出现的任务,我们也可以在特定时间安排任务。
OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();
'delayedTime' -> 计算触发通知的时间
更多实施细节click here。 阅读更多关于 workmanager click here
当您想在特定时间触发通知时,使用工作管理器执行此类任务不是一个好习惯,因为工作管理器用于管理周期性或延迟的延迟和异步任务functionality.Still您可以使用此方法执行此操作不是一个好的做法,
您可以像这样获取日历值,
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)