#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 или нет, уведомление будет отклонено. Таким образом, проблема должна быть где-то в другом месте. А также я попробую ваше предложение и запишу результат. Спасибо ^^