Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Worker有时不';不要发送通知_Android_Kotlin_Notifications_Worker_Android Workmanager - Fatal编程技术网

Android Worker有时不';不要发送通知

Android Worker有时不';不要发送通知,android,kotlin,notifications,worker,android-workmanager,Android,Kotlin,Notifications,Worker,Android Workmanager,背景:我们创建了一个用于跟踪您工作时间的应用程序,您到达时按签入,离开时按签出。我们认为,如果用户可以设置登记或注销的提醒,那就太好了。由于我们需要有关用户当前签入状态的数据来显示正确的文本,我们不能只安排通知,我们需要先从在线数据库中获取数据,然后决定显示什么,因此我们需要一个WorkManager 有时,一个通知(签入时间)不显示,尽管有关于后台工作成功的日志消息,但另一个应在(签出时间)后显示 我正在使用三星Galaxy S9+和最新更新(Android 9) 我试着通过ADB检查计划的作

背景:我们创建了一个用于跟踪您工作时间的应用程序,您到达时按签入,离开时按签出。我们认为,如果用户可以设置登记或注销的提醒,那就太好了。由于我们需要有关用户当前签入状态的数据来显示正确的文本,我们不能只安排通知,我们需要先从在线数据库中获取数据,然后决定显示什么,因此我们需要一个WorkManager

有时,一个通知(签入时间)不显示,尽管有关于后台工作成功的日志消息,但另一个应在(签出时间)后显示

我正在使用三星Galaxy S9+和最新更新(Android 9)

我试着通过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)
我所期望的是通知会在预定时间的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())
        }
    }