首页 > 解决方案 > 如何在 Android 上关闭所有需要的通知?

问题描述

我正在创建一个通过 Firebase Cloud Functions 发送和接收通知的聊天应用程序。假设我有 2 个朋友,每个朋友向我发送 5 条消息(5 条通知)。当我在我的聊天列表中打开一个聊天时,我希望该聊天的所有通知都被关闭,而其他通知则不。

目前我只能关闭 1 个通知。如果我收到多个通知,notificationManager.cancel(notificationId)则不起作用。我不想使用notificationManager.cancelAll(),因为我只想关闭一些通知。

override fun onMessageReceived(remoteMessage: RemoteMessage) {

    remoteMessage.notification.let { notification ->

        val type = remoteMessage.data[NOTIFICATION_TYPE]

        val notificationChannelId = getNotificationChannelId(type)
        val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

        val intent = Intent(this, HomeActivity::class.java)
        val notificationIntent = setIntent(remoteMessage.data)
        val stackBuilder: TaskStackBuilder = TaskStackBuilder.create(this)
        stackBuilder.addParentStack(HomeActivity::class.java)
        stackBuilder.addNextIntent(intent)
        stackBuilder.addNextIntent(notificationIntent)
        val pendingIntent: PendingIntent =
            stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)

        val notificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        val notificationBuilder = NotificationCompat.Builder(this, notificationChannelId)
            .setContentTitle(notification?.title ?: "")
            .setContentText(notification?.body ?: "")
            .setStyle(
                NotificationCompat.BigTextStyle()
                    .bigText(notification?.body ?: "")
            )
            .setSmallIcon(R.drawable.ic_stat)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setSound(soundUri)
            .setColor(ContextCompat.getColor(applicationContext, R.color.colorNotification))
            .setVibrate(vibrationPattern)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)

        notify(remoteMessage.data, notificationManager, notificationBuilder)

    }
}

private fun notify(
    data: Map<String, String>,
    notificationManager: NotificationManager,
    notificationBuilder: NotificationCompat.Builder
) {

    when (data[NOTIFICATION_TYPE]) {
        CHAT_MSG -> {
            if (data[NotificationUtils.CHAT_ID] != ChatActivity.currentChat) {
                notificationManager.notify(
                    CHAT_MSG_NOTIFICATION_ID,
                    notificationBuilder.build()
                )
            }
        }
        FRIEND_REQUEST -> {
            notificationManager.notify(
                FRIEND_REQUEST_NOTIFICATION_ID,
                notificationBuilder.build()
            )
        }
    }
}

开始():

fun dismissNotifications(notificationId: Int) {
    val notificationManager =
        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.cancel(notificationId)
}

标签: androidfirebase-cloud-messagingandroid-notifications

解决方案


我的想法是:
将所有通知 ID 保存在地图中,其中:
键是消息中的用户名/用户 ID。
值是通知 ID 列表

当您需要清除所有通知时,您只需要求您映射并清除该用户名/用户 ID 的所有通知 ID


推荐阅读