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. Para cada canal, é possível definir o comportamento visual e auditivo que é aplicado a todas as notificações desse canal. Os usuários podem mudar essas configurações e decidir quais canais de notificação do seu 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, como 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. 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.

Ao segmentar 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 o targetSdkVersion estiver definido como 25 ou menos, 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 menos.

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. Se quiser, 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 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 =
        context.getSystemService(NotificationManager::class.java)
    notificationManager?.createNotificationChannel(mChannel)
}

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

Por padrão, todas as notificações postadas 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 canal, chame métodos como enableLights(), setLightColor() e setVibrationPattern() no NotificationChannel. Depois de criar o canal, não é possível mudar essas configurações, e o usuário tem o controle final sobre se esses comportamentos estão ativos.

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-o no construtor NotificationChannel usando um dos cinco níveis de importância, que vão 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édio
Não emite som.
IMPORTANCE_LOW PRIORITY_LOW
Baixa
Não emite som nem aparece na barra de status.
IMPORTANCE_MIN PRIORITY_MIN
Nenhuma
Não emite som e não aparece na barra de status ou na aba.
IMPORTANCE_NONE N/A

Todas as notificações, independentemente da importância, aparecem em locais da interface do sistema que não são interruptivos, como na gaveta de notificações e como um selo no ícone na tela de início, embora seja possível modificar a aparência do selo de notificação.

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

Para saber 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 som de alerta. Para saber as configurações que um usuário aplica aos seus canais de notificação, siga estas etapas:

  1. Chame getNotificationChannel() ou getNotificationChannels() para acessar o objeto NotificationChannel.

  2. Consulte as configurações de canais específicos, como getVibrationPattern(), getSound() e getImportance().

Se você detectar uma configuração de canal que acredita que inibe o comportamento pretendido para seu app, sugira que o usuário a mude e forneç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 é possível mudar os comportamentos visuais e auditivos dele de forma programática. Somente o usuário pode mudar os comportamentos do canal nas configurações do sistema. Para oferecer aos usuários acesso rápido a essas configurações de notificação, adicione um item na interface de configurações do app que abra essas configurações do sistema.

É possível abrir as configurações do sistema para canais de notificação com uma Intent que usa a ação ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Por exemplo, o exemplo de código a seguir mostra como 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, context.packageName)
    putExtra(Settings.EXTRA_CHANNEL_ID, CHANNEL_ID)
}
Button(onClick = {
    context.startActivity(intent)
}) {
    Text("Open Channel Settings")
}

Observe que a intent requer 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:

val notificationManager =
    ContextCompat.getSystemService<NotificationManager>(context, NotificationManager::class.java)
notificationManager?.deleteNotificationChannel(channelId)

Criar um grupo de canais de notificação

Se você quiser organizar ainda mais a aparência dos seus canais na interface de configurações, crie grupos de canais. Essa é uma boa ideia quando o app oferece suporte a 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 com nomes idênticos.

Figura 2. Configurações de canais 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

Organizar os canais de notificação em grupos para cada conta permite que os usuários os diferenciem.

Cada grupo de canais de notificação requer um ID, que precisa ser exclusivo no seu 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.

fun createNotificationChannelGroup(context: Context, groupId: String, groupName: String) {
    val notificationManager =
        ContextCompat.getSystemService(context, NotificationManager::class.java)
    notificationManager?.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
}

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

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.