Android 如何使用WorkManager安排通知?

Android 如何使用WorkManager安排通知?,android,android-jetpack,android-workmanager,Android,Android Jetpack,Android Workmanager,我希望在用户每次在数据库中添加注释的特定时间安排通知。虽然使用AlarmManager、BroadcastReceiver等有多种方法,但如何使用WorkManager?WorkManager不适用于需要在特定时间进行的工作 您应该使用AlarmManager,特别是在特定时间获取回调。根据Android关于worker manager的官方文档:“这些API允许您创建任务并将其交给WorkManager,以便立即或在适当的时间运行”。在我的应用程序中,我将工作设置为在20秒后激活: // S

我希望在用户每次在数据库中添加注释的特定时间安排通知。虽然使用AlarmManager、BroadcastReceiver等有多种方法,但如何使用WorkManager?WorkManager不适用于需要在特定时间进行的工作


您应该使用
AlarmManager
,特别是在特定时间获取回调。

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

 // Schedule the time
 val request= OneTimeWorkRequestBuilder<YourWork>().setInitialDelay(20, TimeUnit.SECONDS).build()
    WorkManager.getInstance().enqueue(request)
//安排时间
val request=OneTimeWorkRequestBuilder().setInitialDelay(20,TimeUnit.SECONDS).build()
WorkManager.getInstance().enqueue(请求)
如上所述

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());

您可以在workmanager的帮助下显示通知。Workmanger可以用于调度单次事件任务或周期事件任务,也可以在特定时间调度任务

OneTimeWorkRequest request= new OneTimeWorkRequest.Builder(CustomWorkerClass.class)
.setInitialDelay(delayedTime, TimeUnit.MILLISECONDS)
.addTag("TAG")
.build();
“delayedTime”->计算触发通知的时间

有关更多实施细节,请参阅。
阅读更多有关workmanager的信息

是否因为此限制?对于每个警报,我们都有一个WorkManager的唯一标记。然而,有时,我们会遇到由WorkManager引起的无法解释的异常--`java.lang.IllegalStateException:应用程序可能不会安排超过100个不同的作业`@shuwyuantee--这是一个,已经标记为alpha03已修复的异常。但是,你仍然不应该在未来的不同时间安排数百个不同的作业。“但是,你仍然不应该在未来的不同时间安排数百个不同的作业。”->谢谢。我可以知道这样建议的原因吗?我们不愿意使用AlarmManager的原因是,它没有“标记”概念。取消已安排的警报相当困难。(不同的挂起意图和不同的附加项被视为相同的)相反,WorkManager有标记概念。因此,我们可以很方便地取消一个已经安排好的警报。@ShuwnYuanTee-一种常见的策略是只安排一个警报(下一个),并让它在触发时安排下一个警报。如果你知道警报会依次触发,绝对没有理由让系统跟踪大量警报。谢谢你的建议。然而,这种策略确实有缺点。错过一个警报(我认为这是很常见的,因为打瞌睡的功能),将导致子序列警报没有计划。是的,应用程序打开时,警报被触发。这并不意味着当警报被触发时,应用程序会出现在前台,这意味着应用程序会被打开以运行工作人员的代码,然后关闭。Android应用程序的生命周期是OnCreate、EnterForeground、enterBackground和onTerminate。在这种情况下,应用程序在onCreate和onTerminate之间跳跃。