Android Worker有时不';不要发送通知
背景:我们创建了一个用于跟踪您工作时间的应用程序,您到达时按签入,离开时按签出。我们认为,如果用户可以设置登记或注销的提醒,那就太好了。由于我们需要有关用户当前签入状态的数据来显示正确的文本,我们不能只安排通知,我们需要先从在线数据库中获取数据,然后决定显示什么,因此我们需要一个WorkManager 有时,一个通知(签入时间)不显示,尽管有关于后台工作成功的日志消息,但另一个应在(签出时间)后显示 我正在使用三星Galaxy S9+和最新更新(Android 9) 我试着通过ADB检查计划的作业。有时它们在那里,有正确的延迟和一切,有时它们根本不在那里,但通知无论如何都会到达,所以这并不是那么可靠 在我所涉及的每一个案例中,我都使用调试器进行了调度,并且一切都按照我的预期进行了设置:新的班次被添加到数组中并填充了预期的数据,工作被安排在正确的时间。编辑时,UUID将取消旧工作,并创建新工作。删除时,工作被取消,班次设置为空 首先,我需要为特定的班次安排工作Android Worker有时不';不要发送通知,android,kotlin,notifications,worker,android-workmanager,Android,Kotlin,Notifications,Worker,Android Workmanager,背景:我们创建了一个用于跟踪您工作时间的应用程序,您到达时按签入,离开时按签出。我们认为,如果用户可以设置登记或注销的提醒,那就太好了。由于我们需要有关用户当前签入状态的数据来显示正确的文本,我们不能只安排通知,我们需要先从在线数据库中获取数据,然后决定显示什么,因此我们需要一个WorkManager 有时,一个通知(签入时间)不显示,尽管有关于后台工作成功的日志消息,但另一个应在(签出时间)后显示 我正在使用三星Galaxy S9+和最新更新(Android 9) 我试着通过ADB检查计划的作
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)
我所期望的是通知会在预定时间的10分钟内到达,大多数情况下都是这样,但有时通知根本没有到达,有时我会在非常奇怪的时间收到通知(例如,有人说我应该在周六22:12报到,但轮班安排在8-16,周一到周五)
此外,周六提到的通知设法获取了我在该州办理登机手续的数据,但我没有互联网连接,目前通知没有收到任何本地数据。我看到的唯一一件事是一个固定的通知ID-如果只显示一个通知,那也没问题,否则,即使工作进程运行正常,这也可能是丢失通知的原因。我是否正确理解您,您的工作人员的
doWork
函数在正确的时间被调用(通过日志检查),并且您确实在该函数中创建了通知,但这些通知显示不可靠?是的,doWork
在正确的时间被调用。我试着使用初始测试期间提出的方法,没有任何区别,但是我会试着把它放回去,看看它是如何工作的。你能告诉我你在测试哪些设备吗?我经历过中国ROM设备不支持后台任务,无论是通过workmanager还是服务。更新:使用AtomicInteger作为通知ID并没有解决问题。我只使用三星Galaxy S9+,因为它是我唯一拥有的设备。似乎在实际设备中存在问题。模拟器没有问题
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())
}
}