Criar e gerenciar canais de notificação

A partir do Android 8.0 (nível da API 26), todas as notificações precisam ser atribuídas a um canal. Para cada canal, você pode definir o comportamento visual e auditivo aplicado a todas as notificações. Os usuários podem mudar essas configurações e decidir quais canais de notificação do app podem ser invasivos ou visíveis.

Assista o vídeo a seguir para conferir uma visão geral dos canais e outros recursos de notificação no Android 8.0.

As configurações do usuário para canais de notificação estão disponíveis para cada app nas configurações do sistema, conforme mostrado na figura 1.

Figura 1. Configurações de notificação do app Relógio e um dos canais dele.

Depois de criar um canal de notificação, não é possível mudar os comportamentos de notificação. O usuário tem controle total nesse momento. No entanto, ainda é possível mudar o nome e a descrição de um canal.

Crie um canal para cada tipo de notificação que você precisa enviar. Você também pode criar canais de notificação para refletir as escolhas feitas pelos usuários. Por exemplo, é possível configurar canais de notificação individuais para cada grupo de conversa criado por um usuário em um app de mensagens.

Ao segmentar o Android 8.0 (nível da API 26) ou versões mais recentes, você precisa implementar um ou mais canais de notificação. Se a targetSdkVersion estiver definida como 25 ou anterior, quando o app for executado no Android 8.0 (nível da API 26) ou versões mais recentes, ele vai se comportar da mesma maneira que em dispositivos com o Android 7.1 (nível da API 25) ou versões anteriores.

Criar um canal de notificação

Para criar um canal de notificação, siga estas etapas:

  1. Crie um NotificationChannel objeto com um ID de canal exclusivo, um nome visível para o usuário e um nível de importância.

  2. Opcionalmente, especifique a descrição que o usuário vê nas configurações do sistema com setDescription().

  3. Registre o canal de notificação transmitindo-o para createNotificationChannel().

O exemplo a seguir mostra como criar e registrar um canal de notificação:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create the NotificationChannel.
      val name = getString(R.string.channel_name)
      val descriptionText = getString(R.string.channel_description)
      val importance = NotificationManager.IMPORTANCE_DEFAULT
      val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
      mChannel.description = descriptionText
      // Register the channel with the system. You can't change the importance
      // or other notification behaviors after this.
      val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
      notificationManager.createNotificationChannel(mChannel)
  }

A recriação de um canal de notificação já existente com os valores originais dele não realiza nenhuma operação. Portanto, é seguro chamar esse código ao iniciar um app.

Por padrão, todas as notificações publicadas em um determinado canal usam os comportamentos visuais e auditivos definidos pelo nível de importância da NotificationManagerCompat class, such as IMPORTANCE_DEFAULT or IMPORTANCE_HIGH. Consulte a próxima seção para mais informações sobre os níveis de importância.

Se você quiser personalizar ainda mais os comportamentos de notificação padrão do seu canal, poderá chamar métodos como enableLights(), setLightColor(), e setVibrationPattern() no NotificationChannel. Lembre-se de que, depois de criar o canal, não é possível mudar essas configurações, e o usuário tem controle final sobre se esses comportamentos estão ativos.

Você também pode criar vários canais de notificação em uma única operação chamando createNotificationChannels().

Definir o nível de importância

A importância do canal afeta o nível de interrupção de todas as notificações publicadas. Especifique-o no NotificationChannel construtor, usando um dos cinco níveis de importância, variando de IMPORTANCE_NONE(0) a IMPORTANCE_HIGH(4).

Para oferecer compatibilidade com dispositivos com o Android 7.1 (nível da API 25) ou versão anterior, também é preciso chamar setPriority() para cada notificação, usando uma constante de prioridade da classe NotificationCompat.

As constantes de importância (NotificationManager.IMPORTANCE_*) e prioridade (NotificationCompat.PRIORITY_*) são mapeadas para as opções de importância visíveis ao usuário, conforme mostrado na tabela a seguir.

Nível de importância visível para o usuário Importância (Android 8.0 e posterior) Prioridade (Android 7.1 e versões anteriores)
Urgente
Emite um som e aparece como uma notificação de alerta.
IMPORTANCE_HIGH PRIORITY_HIGH ou PRIORITY_MAX
Alta
Emite um som.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Média
Não emite som.
IMPORTANCE_LOW PRIORITY_LOW
Baixa
Não emite som e não aparece na barra de status.
IMPORTANCE_MIN PRIORITY_MIN
Nenhuma
Não emite som e não aparece na barra de status ou na sombra.
IMPORTANCE_NONE N/A

Todas as notificações, independentemente da importância, aparecem em locais não interruptivos na IU do sistema, como na gaveta de notificações e sob a forma de um indicador no ícone na tela de início. No entanto, você pode modificar a aparência do indicador de notificação.

Depois de enviar o canal ao NotificationManager, não é possível mudar o nível de importância. No entanto, o usuário pode mudar as próprias preferências para os canais do app a qualquer momento.

Para ver mais informações sobre como escolher um nível adequado de prioridade, consulte "Priority levels" no Guia de criação de notificações.

Ler configurações do canal de notificação

Os usuários podem modificar as configurações dos canais de notificação, incluindo comportamentos como vibração e som de alerta. Se você quiser saber que configurações o usuário aplica aos seus canais de notificação, siga estas etapas:

  1. Receba o NotificationChannel objeto chamando getNotificationChannel() ou getNotificationChannels().

  2. Consulte configurações específicas do canal, como getVibrationPattern(), getSound() e getImportance().

Se você detectar uma configuração de canal que possa inibir o comportamento pretendido para o app, poderá sugerir que o usuário a mude e disponibilizar uma ação para abrir as configurações de canal, conforme mostrado na próxima seção.

Abrir as configurações do canal de notificação

Depois de criar um canal de notificação, não é possível mudar os comportamentos visuais e auditivos dele de maneira programática. Somente o usuário poderá mudar os comportamentos do canal nas configurações do sistema. Para que os usuários tenham acesso rápido a essas configurações de notificação, adicione um item à IU das configurações do app que abra essas configurações do sistema.

Você pode abrir as configurações do sistema para canais de notificação com um Intent que use a ACTION_CHANNEL_NOTIFICATION_SETTINGS ação.

Por exemplo, o exemplo de código a seguir demonstra como você pode redirecionar um usuário para as configurações de um canal de notificação:

  val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
      putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
      putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
  }
  startActivity(intent)

Observe que o intent requer dois extras que especifiquem o nome do pacote do app (conhecido também como ID do aplicativo) e o canal a ser editado.

Excluir um canal de notificação

Você pode excluir canais de notificação chamando deleteNotificationChannel(). O exemplo de código a seguir demonstra como concluir esse processo.

  // The id of the channel.
  val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  val id: String = "my_channel_01"
  notificationManager.deleteNotificationChannel(id)

Criar um grupo de canais de notificação

Se você quiser organizar ainda mais a aparência dos seus canais na IU das configurações, crie grupos de canais. Essa opção é interessante quando o app é compatível com várias contas de usuário, porque permite criar um grupo de canais de notificação para cada conta. Os grupos de canais ajudam os usuários a diferenciar e controlar vários canais de notificação que tenham nomes idênticos.

Figura 2. Configurações do canal de notificação com grupos para contas pessoais e profissionais.

Por exemplo, um app de rede social pode ser compatível com contas pessoais e profissionais. Nesse cenário, cada conta pode exigir vários canais de notificação com funções e nomes idênticos, da seguinte maneira:

  • Uma conta pessoal com dois canais:

    • Novos comentários

    • Recomendações de publicação

  • Uma conta empresarial com dois canais:

    • Novos comentários

    • Recomendações de publicação

A organização dos canais de notificação em grupos para cada conta permite que os usuários os distingam.

Cada grupo de canais de notificação exige um ID exclusivo dentro do pacote, além de um nome visível para o usuário. O snippet a seguir mostra como criar um grupo de canais de notificação.

  // The id of the group.
  val groupId = "my_group_01"
  // The user-visible name of the group.
  val groupName = getString(R.string.group_name)
  val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
  <b>notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))</b>

Depois de criar um novo grupo, você pode chamar setGroup() para associar um novo objeto NotificationChannel a ele.

Depois de enviar o canal ao gerenciador de notificações, não é possível mudar a associação entre o canal de notificação e o grupo.