背景:我们创建了一个用于跟踪您的工作时间的应用,您到达时按签入,当您到达时按签出你走。我们认为,如果用户可以设置提醒来签入或签出,那将是很好的。由于我们需要有关用户当前签入状态的数据以显示正确的文本,因此我们不能只是安排通知,我们需要首先从在线数据库中获取数据,然后决定要显示的内容,因此我们需要一个工作管理器。
尽管日志消息显示后台工作已成功完成,但有时仍未显示一个通知(签到时间),而应该显示另一则通知(签出时间)。
我正在使用具有最新更新(Android 9)的Samsung Galaxy S9 +。
我尝试通过ADB检查计划的作业。有时它们会以正确的延迟出现,并且一切都在其中,有时它们根本不存在,但是无论如何都会收到通知,因此并不是那么可靠。
在每种情况下,我都使用调试器进行了调度,并且一切都按照我的预期进行了设置:将新的班次添加到数组中,并填充了预期的数据,在正确的时间安排了工作。编辑后,旧作品会被UUID取消,然后创建新作品。删除后,工作将被取消,并且班次设置为空。
首先,我需要安排工作进行特定的轮班。 Shift
具有属性shiftFrom
,shiftTo
和那些时间的计划通知的UUID。为了安排工作人员,我有一个NotificationScheduler
类的scheduleWeekly
方法,在其中确定延迟,然后安排工作:
val sendNotificationRequest = PeriodicWorkRequestBuilder<NotificationsWorker>(7, TimeUnit.DAYS)
.setInputData(
workDataOf(
NotificationsWorker.TITLE_PARAM to title,
NotificationsWorker.CONTENT_PARAM to content,
NotificationsWorker.ACTION to action // this tells the worker wheter the user is supposed to check in or check out when it's triggered
)
)
.setInitialDelay(initialDelayMinutes, TimeUnit.MINUTES) // wanted time - current time converted to minutes
.build()
WorkManager.getInstance(context).enqueue(sendNotificationRequest)
被触发时,它将调用NotificationsWorker
。根据当前的签到状态以及用户应该签入还是签出,我决定在通知中显示哪些文本。另外,我创建的日志消息也会被记录-该工作确实是在正确的时间触发的。
然后我使用此方法发送通知:
private fun sendNotification(title: String, content: String) {
val notificationIntent = Intent(context, SplashActivity::class.java) // for when the notification is clicked
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
val intent = PendingIntent.getActivity(
context, 0,
notificationIntent, 0
)
val builder =
NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(package.appname.R.drawable.ic_app_icon)
.setContentTitle(title)
.setContentText(content)
.setContentIntent(intent)
.setAutoCancel(true)
.setStyle(NotificationCompat.BigTextStyle().bigText(content))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
with(NotificationManagerCompat.from(context)) {
notify(0, builder.build())
}
}
我期望的是通知从计划的时间起-10分钟到达,这基本上是发生的,但是有时它们根本没有到达,有时我会在非常奇怪的时候收到(例如,我有人说我应该在星期六22:12办理登机手续,但轮班安排在星期一至星期五8-16进行。)
此外,周六提到的通知以某种方式设法获取了有关我的登机状态的数据,但是我没有互联网连接,并且当前通知都没有接收到本地数据。