Criar e gerenciar canais de notificação

A partir do Android 8.0 (API de nível 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. Em seguida, os usuários podem mudar essas configurações e decidir quais canais de notificação do app devem ser invasivos ou visíveis.

Assista o vídeo abaixo para ver uma visão geral dos canais e outros novos recursos de notificação no Android 8.0.

Para ver uma amostra de código que usa notificações, incluindo os recursos do Android 8.0, consulte o Exemplo de notificações do Android (em inglês).

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 para o app Relógio e um dos canais dele.

Depois de criar um canal de notificação, não será possível mudar os comportamentos relacionados, uma vez que o usuário terá controle total nesse ponto. Apesar disso, você ainda poderá mudar o nome e a descrição do 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 do seu app. Por exemplo, você pode configurar canais de notificação separados para cada grupo de conversas criado por um usuário em um app de mensagens.

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

Criar um canal de notificação

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

  1. Crie um objeto NotificationChannel 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().

Kotlin

    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)
    }
    

Java

    private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    

A criaçã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 nesse canal usam os comportamentos visuais e auditivos definidos pelo nível de importância da classe NotificationManagerCompat, como IMPORTANCE_DEFAULT e IMPORTANCE_HIGH. Veja abaixo 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() em NotificationChannel. Mas, lembre-se de que depois de criar o canal, não será possível mudar essas configurações, e o usuário terá o controle final sobre a ativação desses comportamentos.

Você também pode criar diversos 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, e você precisa especificá-la no construtor NotificationChannel. Você pode usar um dos cinco níveis de importância, variando de IMPORTANCE_NONE(0) a IMPORTANCE_HIGH(4). O nível de importância que você atribui a um canal é válido para todas as mensagens de notificação que você publica nele.

Para oferecer compatibilidade com dispositivos com o Android 7.1 (API de nível 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 indicado na Tabela 1.

Tabela 1. Níveis de importância do canal.

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:
sem som
IMPORTANCE_LOW PRIORITY_LOW
Baixa:
sem som e não aparece na barra de status
IMPORTANCE_MIN PRIORITY_MIN

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" (Níveis de prioridade) no Guia de criação de notificações (em inglês).

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

Os usuários podem modificar as configurações dos canais de notificação, inclusive comportamentos, como vibração e alerta sonoro. Portanto, se você quer saber que configurações o usuário aplicou aos seus canais de notificação, siga estas etapas:

  1. Consiga o objeto NotificationChannel chamando getNotificationChannel() ou getNotificationChannels().
  2. Consulte configurações específicas do canal, como getVibrationPattern(), getSound() e getImportance().

Em seguida, 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 (consulte a 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 fácil acesso 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 ação ACTION_CHANNEL_NOTIFICATION_SETTINGS.

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

Kotlin

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

Java

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    intent.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 os canais de notificação chamando deleteNotificationChannel(). A amostra de código a seguir demonstra como concluir esse processo.

Kotlin

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

Java

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // The id of the channel.
    String id = "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 (por exemplo, para perfis de trabalho), para que você possa criar um grupo de canais de notificação para cada conta. Dessa forma, os usuários podem identificar e controlar facilmente 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 garante que os usuários possam distingui-los facilmente.

Cada grupo de canais de notificação exige um código 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.

Kotlin

    // 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
    notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
    

Java

    // The id of the group.
    String groupId = "my_group_01";
    // The user-visible name of the group.
    CharSequence groupName = getString(R.string.group_name);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));
    

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.