我们的应用程序中的代码类似于以下内容
val pendingIntent = PendingIntent.getActivity(ctx, id.toInt(), intent, PendingIntent.FLAG_CANCEL_CURRENT)
val builder = NotificationCompat.Builder(ctx, Channel.TEST_CHANNEL.channelId)
builder.setTicker(tickerText)
.setContentTitle(contentTitle)
.setContentText(contentText)
.setVibrate(vibrate)
.setSmallIcon(icon)
.setAutoCancel(true)
.setLights(-0xff0100, 300, 1000)
.setSound(uri)
.setContentIntent(pendingIntent)
.setStyle(NotificationCompat.BigTextStyle().bigText(contentText))
.addAction(R.drawable.ic_notification, ctx.getString(R.string.notification), piAction)
val notification = builder.build()
val nf = ctx.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
nf.notify(NOTIFICATION_TAG, id.toInt(), notification)
}
从最近开始,我们注意到某些运行Android 8+的设备上的通知在显示后开始短暂消失,没有用户的互动。将auto-cancel
设置为false
会有所帮助,但用户体验会降低。
id
是数据库中的唯一项ID。这可能是值得注意的重要事项 - 从技术上讲,我们可以通过用户显示,删除/取消此类id
的通知,以及稍后再次使用具有相同ID的类似通知的时间。这可能是原因吗?
答案 0 :(得分:1)
我们已经更新了支持库,并在构建器上尝试了以下方法以获得好运:
builder.setTicker(tickerText)
...
.setTimeoutAfter(-1)
...
将此参数设置为正值会延迟通知消失这段时间(因此确实会影响)。因此我们尝试了一个负数,通知现在似乎就在那里。
我无法找到任何合理的文档来解释这一点,所以这个答案不是100%,而是暂时保留在这里让其他人试着看看它是否有助于他们。
答案 1 :(得分:0)
我发现不确定的是 NotificationCompat.Builder
Android oreo现在使用 Notification.Builder 而不是 NotificationCompat.Builder 。
你可能需要检查Android版本:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//Use Notification.Builder
} else {
// Use NotificationCompat.Builder.
}
我不认为唯一ID会成为消失通知的问题。
Google已针对此新变化创建了开源示例。请参阅它以获取更多信息。
https://github.com/googlesamples/android-NotificationChannels
答案 2 :(得分:0)
从android OREO中的电池优化设置中禁用自动优化应用程序。通知会一直保留,只要您愿意
答案 3 :(得分:-1)
.setAutoCancel(假)
可能适合你。