Criar e gerenciar canais de notificação

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

Confira o vídeo a seguir para ter uma visão geral dos canais e de 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 para o app Relógio e um dos canais dele.

Depois de criar um canal de notificação, não é possível mudar o comportamento de notificação. O usuário tem controle total nesse momento. Mas você ainda pode mudar o nome e a descrição de um canal.

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

Para o Android 8.0 (nível 26 da API) ou versões mais recentes, é necessário 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 26 da API) ou mais recente, ele vai se comportar da mesma forma que em dispositivos com o Android 7.1 (nível 25 da API) ou versões anteriores.

Criar um canal de notificação

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

  1. Crie um objeto NotificationChannel com um ID do 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:

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 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 recriação de um canal de notificação já existente com os valores originais dele não realiza operação, por isso é 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 classe NotificationManagerCompat, como IMPORTANCE_DEFAULT ou 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, chame métodos como enableLights(), setLightColor() e setVibrationPattern() no NotificationChannel. Depois de criar o canal, não será possível mudar essas configurações, e o usuário terá controle final sobre a ativação desses comportamentos.

Também é possível 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 postadas nele. Especifique-a no construtor NotificationChannel, usando um dos cinco níveis de importância, variando de IMPORTANCE_NONE(0) a IMPORTANCE_HIGH(4).

Para oferecer suporte a dispositivos com o Android 7.1 (nível 25 da API) ou versões anteriores, você também precisa 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 sons e não aparece na barra de status.
IMPORTANCE_MIN PRIORITY_MIN
Nenhum
Não emite som e não aparece na barra de status ou na aba.
IMPORTANCE_NONE N/A

Todas as notificações, independente da importância, aparecem em locais não interruptivos na interface do sistema, como na gaveta de notificações e como um indicador no ícone na tela de início. No entanto, é possível modificar a aparência do indicador de notificação.

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

Para saber mais sobre como escolher um nível de prioridade adequado, consulte "Níveis de prioridade" no Guia de design 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 alerta sonoro. Se você quer saber quais configurações um usuário aplica 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().

Se você detectar uma configuração de canal que possa impedir o comportamento pretendido do seu app, sugira que o usuário a mude e ofereça uma ação para abrir as configurações do 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 será possível mudar os comportamentos visuais e auditivos dele de maneira programática. Somente o usuário pode mudar os comportamentos do canal nas configurações do sistema. Para oferecer aos usuários acesso fácil a essas configurações de notificação, adicione um item à interface de 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 usa a ação ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Por exemplo, o exemplo de código abaixo mostra como 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);

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

Excluir um canal de notificação

Para excluir canais de notificação, chame deleteNotificationChannel(). O exemplo 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 melhor a aparência dos seus canais na interface das configurações, crie grupos de canais. Essa é uma boa ideia quando seu app oferece suporte a várias contas de usuário, como para perfis de trabalho, porque permite 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 com nomes idênticos.

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

Por exemplo, um app de rede social pode incluir suporte para contas pessoais e de trabalho. Nesse cenário, cada conta pode exigir vários canais de notificação com funções e nomes idênticos, como os seguintes:

  • 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 façam distinção entre eles.

Cada grupo de canais de notificação exige um ID, que precisa ser exclusivo dentro do pacote, além de um nome visível para o usuário. O snippet a seguir demonstra 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);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

Depois de criar um novo grupo, chame setGroup() para associar um novo objeto NotificationChannel a ele.

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