Предотвращение удаления уведомлений из панели уведомлений [Android]

#android #kotlin #android-notifications

#Android #kotlin #android-уведомления

Вопрос:

Прежде всего, мне жаль, если есть тема по этому вопросу, но я не нашел точного решения. Проблема в том, что я устанавливаю уведомление, но когда я закрываю приложение, уведомление автоматически удаляется системой. Вы можете подумать, что это имеет отношение к текущему атрибуту, но, насколько я знаю, требуется взаимодействие с пользователем. В моем случае уведомления исчезают сами по себе.

Вот код:

 class NotificationHelper {
private val CHANNEL_ID: String = "Default Channel ID"
private var context: Context
private var notificationManager: NotificationManager
private var notificationBuilder: NotificationCompat.Builder

constructor(context: Context) {
    this.context = context
    this.notificationManager =
        this.context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    // NotificationChannel is required on Oreo and newer
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        this.notificationManager.createNotificationChannel(
            NotificationChannel(
                CHANNEL_ID,
                this.context.getString(R.string.channel_name),
                NotificationManager.IMPORTANCE_HIGH
            )
        )
    }

    notificationBuilder = NotificationCompat.Builder(this.context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_set_notification_black)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE)
        .setNotificationSilent()
        .setPriority(NotificationCompat.PRIORITY_MAX)
        .setContentIntent(
            PendingIntent.getActivity(
                this.context, 0, Intent(
                    this.context,
                    MainActivity::class.java
                ), 0
            )
        )
}

fun setNotification(notification: Notification) {
    val deleteIntent = Intent(context, BootOrUpdateBroadcastReceiver::class.java)
    deleteIntent.action = GlobalInfo.ACTION_NOTIFICATION_DELETE
    deleteIntent.putExtra(GlobalInfo.NotificationEntry.COLUMN_ID, notification.id)

    val notificationToBeShown: android.app.Notification = this.notificationBuilder
        .setContentTitle(notification.title)
        .setContentText(notification.content)
        .setStyle(NotificationCompat.BigTextStyle().bigText(notification.content))
        .setAutoCancel(notification.removeByClick)
        .setOngoing(!notification.removeBySwipeAway)
        .setDeleteIntent(
            PendingIntent.getBroadcast(
                context,
                0,
                deleteIntent,
                PendingIntent.FLAG_CANCEL_CURRENT
            )
        )
        .build()

    with(NotificationManagerCompat.from(this.context)) {
        // notificationId is a unique int for each notification that you must define
        notify(notification.id, notificationToBeShown)
    }

}

fun clearNotification(notificationId: Int) {
    this.notificationManager.cancel(notificationId)
}

fun clearAllNotifications() {
    this.notificationManager.cancelAll()
}

}
  

Кроме того, я думал использовать липкий сервис, но для меня это не имеет смысла. Службы также уничтожаются при закрытии приложения. Должен быть другой способ.

Заранее спасибо 🙂

Комментарии:

1. You might think it is relevant to onGoing attribute but as far as I know it is required user interaction Можете ли вы это объяснить? Текущее уведомление будет отклонено при закрытии приложения, и нет, служба переднего плана не уничтожается при закрытии приложения

2. Я имею в виду, что я не пытаюсь отклонить уведомление от имени пользователя, проведя пальцем или щелкнув по нему. Это выполняется устройством Android, когда я закрываю приложение. Итак, это не имеет отношения к текущему атрибуту. Я просто хочу, чтобы это уведомление всегда оставалось там. Кроме того, вы предлагаете мне использовать службу переднего плана?

3. Как тогда не имеет значения onGoing атрибут? Я не понимаю вашей логики. Текущее уведомление будет автоматически отклонено (устройством Android, как вы говорите) при закрытии приложения, независимо от того, что вы пытаетесь. Вы использовали атрибут в своем коде.

4. Да, вы можете использовать службу переднего плана, если your app needs to perform a task that is noticeable by the user even when they're not directly interacting with the app это указано в документации.

5. Вы говорите то же самое. Независимо от того, является ли текущий атрибут true или нет, уведомление будет отклонено. Таким образом, проблема должна быть где-то в другом месте. А также я попробую ваше предложение и запишу результат. Спасибо ^^