Как изменить значок уведомления

Начиная с Android 8.0 (уровень API 26), значки уведомлений (также известные как точки уведомлений) появляются на значке приложения, если в связанном приложении есть активное уведомление. Чтобы посмотреть уведомления и ярлыки приложения, пользователю нужно нажать на значок приложения и удерживать его (см. рисунок 1).

Эти значки уведомлений по умолчанию появляются в приложениях, которые их поддерживают. Однако в некоторых случаях вы можете не захотеть, чтобы значок уведомления появлялся, или захотите точно контролировать, какие уведомления там появляются.

Рисунок 1. Значки уведомлений и меню, которое открывается при нажатии и удержании.

Отключить значки

Если значки не подходят для ваших уведомлений, вы можете отключить их для отдельных каналов, вызвав метод setShowBadge(false) для объекта NotificationChannel.

Например, вы можете отключить значки уведомлений в следующих ситуациях:

  • Текущие уведомления. Большинство текущих уведомлений, например об обработке изображений, элементах управления воспроизведением медиаконтента или инструкциях по навигации, не подходят для значков.
  • Напоминания Календаря: не помечать мероприятия, происходящие в текущее время.
  • Часы или будильники. Не используйте значки для уведомлений, связанных с текущими будильниками.

В следующем образце кода показано, как скрыть значки для канала уведомлений:

Kotlin

val id = "my_channel_01"
val name = getString(R.string.channel_name)
val descriptionText = getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_LOW
val mChannel = NotificationChannel(id, name, importance).apply {
    description = descriptionText
    setShowBadge(false)
}
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)

Java

String id = "my_channel_01";
CharSequence name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
mChannel.setDescription(description);
mChannel.setShowBadge(false);

NotificationManager notificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(mChannel);

Как настроить количество уведомлений

По умолчанию каждое уведомление увеличивает число, отображаемое в меню, которое открывается при нажатии и удержании (см. рис. 1). Однако вы можете переопределить это число для своего приложения. Например, это может быть полезно, если вы используете только одно уведомление для нескольких новых сообщений, но хотите, чтобы счетчик показывал общее количество новых сообщений.

Чтобы задать собственное число, вызовите метод setNumber() для уведомления, как показано ниже.

Kotlin

var notification = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
        .setContentTitle("New Messages")
        .setContentText("You've received 3 new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setNumber(messageCount)
        .build()

Java

Notification notification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
        .setContentTitle("New Messages")
        .setContentText("You've received 3 new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setNumber(messageCount)
        .build();

Как изменить значок меню, которое открывается при нажатии и удержании уведомления

В меню, которое открывается при нажатии и удержании, показывается большой или маленький значок, связанный с уведомлением (если доступен). По умолчанию система показывает большой значок, но вы можете вызвать метод Notification.Builder.setBadgeIconType() и передать константу BADGE_ICON_SMALL, чтобы показывался маленький значок.

Kotlin

var notification = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
        .setContentTitle("New Messages")
        .setContentText("You've received 3 new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL)
        .build()

Java

Notification notification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
        .setContentTitle("New Messages")
        .setContentText("You've received 3 new messages.")
        .setSmallIcon(R.drawable.ic_notify_status)
        .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL)
        .build();

Как скрыть повторяющийся ярлык

Если уведомление, созданное приложением, дублирует ярлык приложения, вы можете временно скрыть ярлык, пока уведомление активно, вызвав метод setShortcutId().

Дополнительные примеры кода, в котором используются уведомления, можно найти в примере приложения SociaLite.