通知显示后消失

13
我们的应用程序中有类似以下代码的内容。
    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用于类似通知的操作。这可能是原因吗?


你目前的安卓版本是8.0还是8.1? - Jitesh Mohite
8.1,但用户抱怨8.0。 - khusrav
你创建了一个_NotificationChannel_吗? - JJ86
是的,如果没有它,通知栏将不会显示。问题在于 - 它会显示,但过一段时间后就会从状态栏中移除。 - khusrav
有类似的问题 - 我在应用程序的其他地方调用了cancelAll。 - Arturs Vancans
@ArtursVancans 谢谢您的评论,但我们没有“cancelAll”,只有使用相同ID取消。这个错误已经有一段时间没有出现了。 - khusrav
4个回答

1
我们已经更新了支持库,并在构建器上尝试了以下方法,希望能有所帮助。
 builder.setTicker(tickerText)
        ...
        .setTimeoutAfter(-1)
        ...

将此参数设置为正值会延迟通知消失的时间(因此它确实起作用)。因此,我们尝试了一个负数,通知现在似乎仍然存在。
我找不到任何合理的文档来解释这个问题,因此这个答案不是100%正确的,但现在保留它供其他人尝试并查看是否有帮助。

0

在Android OREO中,禁用您的应用程序自动优化电池优化设置。通知将保持您想要的时间。


-1

我唯一不确定的是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.
         }

我认为唯一标识不会成为消失通知的问题。

谷歌已经为这些新变化创建了开源示例。请参考它以获取更多信息。

https://github.com/googlesamples/android-NotificationChannels


2
Android oreo现在使用Notification.Builder而不是NotificationCompat.Builder.的意思是什么?一直以来都有框架版本和支持版本。支持版本只是为了让你不必编写if-else这种废话代码。 - Eugen Pechanec

-1

.setAutoCancel(false)

也许对你有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接