Notification Channel (canal de notificações) é um mecanismo do Android, introduzido na versão 8.0 (API 26), que agrupa notificações por categoria e dá ao usuário controle sobre seu comportamento. Cada canal define o nível de importância, som, vibração e aparência visual para todas as notificações enviadas através dele. De acordo com Android Developers, o NotificationChannel é obrigatório para todas as notificações no Android 8+ — sem ele, as notificações não são exibidas.
Principais pontos
Notification Channel é um contêiner lógico para notificações do mesmo tipo no Android 8+ (Oreo). O desenvolvedor cria um canal com um ID único, define seus parâmetros e então envia cada notificação especificando este canal. Todas as notificações em um mesmo canal herdam suas configurações.
Antes do Android 8, o gerenciamento de notificações era binário: tudo ou nada. O usuário só podia desativar completamente todas as notificações do aplicativo. Os canais resolveram este problema: agora é possível desativar as notificações “publicitárias” mas manter as “mensagens de amigos.”
Após criar um canal, sua importância pode ser alterada pelo usuário a qualquer momento através de Configurações → Aplicativos → Notificações. O desenvolvedor não pode alterar a importância programaticamente após a criação do canal — esta é uma restrição de segurança do Android.
No Android 8+, cada notificação deve ser enviada através de um NotificationChannel. Se um aplicativo tentar exibir uma notificação sem canal, o sistema a ignora silenciosamente. A exceção são notificações via NotificationCompat com um canal padrão, que é criado automaticamente pela biblioteca.
Um canal de notificação é definido por um conjunto de parâmetros que são definidos quando criado através da classe NotificationChannel. O parâmetro principal é o nível de importância, que determina como a notificação interage com o usuário.
Após a criação, o canal aparece nas configurações de notificação do sistema. O usuário pode alterar a importância, desativar o som, a vibração ou bloquear completamente o canal. Todas as alterações entram em vigor imediatamente para todas as notificações subsequentes.
Ao criar um NotificationChannel, você pode configurar: som (personalizado ou do sistema), vibração (padrão e duração), indicador luminoso (cor do LED), ícone de badge (setShowBadge), tela de bloqueio (setLockscreenVisibility) e modo não perturbe (setBypassDnd). Esses parâmetros são fixados na criação do canal e só podem ser alterados pelo usuário posteriormente.
O nível de importância é o principal parâmetro de um canal. Ele determina se a notificação reproduzirá um som, aparecerá na tela ou simplesmente será colocada na sombra. A importância não deve ser confundida com prioridade — a importância é definida pelo canal, e a prioridade (setPriority) é ignorada no Android 8+.
| Nível | Constante | Comportamento | Som |
|---|---|---|---|
| HIGH | IMPORTANCE_HIGH (4) | Mostra banner heads-up, aparece na sombra | Sim |
| DEFAULT | IMPORTANCE_DEFAULT (3) | Aparece na sombra, sem heads-up | Sim |
| LOW | IMPORTANCE_LOW (2) | Aparece na sombra sem som | Não |
| MIN | IMPORTANCE_MIN (1) | Apenas na sombra, sem som ou vibração | Não |
| NONE | IMPORTANCE_NONE (0) | Não é exibido de forma alguma | Não |
Para a maioria dos cenários de usuário, use IMPORTANCE_DEFAULT (3) — a notificação aparecerá na sombra com som mas sem banner pop-up. Use IMPORTANCE_HIGH apenas para eventos críticos: chamada recebida, mensagem de um contato, lembrete de timer.
O canal é criado uma vez ao iniciar o aplicativo ou no primeiro uso. A melhor prática é criar todos os canais na inicialização do aplicativo, no método Application.onCreate. Recriar um canal existente é seguro — o Android ignora a chamada se o canal já existir.
class App : Application() {
override fun onCreate() {
super.onCreate()
createNotificationChannels()
}
private fun createNotificationChannels() {
val messagesChannel = NotificationChannel(
CHANNEL_MESSAGES,
"Mensagens",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Notificações de novas mensagens"
enableVibration = true
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
val promoChannel = NotificationChannel(
CHANNEL_PROMO,
"Promoções e novidades",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Notificações de marketing e ofertas especiais"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(messagesChannel)
manager.createNotificationChannel(promoChannel)
}
companion object {
const val CHANNEL_MESSAGES = "messages"
const val CHANNEL_PROMO = "promo"
}
}
Ao enviar uma notificação, especifique o ID do canal através de setChannelId (para NotificationCompat) ou no construtor Notification.Builder. Se o canal com o ID especificado não existir, a notificação não será exibida, mas nenhum erro ocorrerá.
O Android fornece várias APIs para gerenciamento programático de canais: obter lista, excluir e verificar configurações atuais. Excluir um canal faz com que todas as suas notificações sejam removidas do histórico do sistema.
val manager =
getSystemService(NotificationManager::class.java)
// Obter lista de todos os canais
val channels = manager.getNotificationChannels()
channels.forEach { channel ->
Log.d("Canais", "${channel.id}: ${channel.importance}")
}
// Saber a importância atual (o usuário pode ter alterado)
val channel = manager.getNotificationChannel(CHANNEL_MESSAGES)
if (channel.importance == NotificationManager.IMPORTANCE_NONE) {
// O usuário desativou o canal
suggestEnablingChannel()
}
// Excluir canal
manager.deleteNotificationChannel(CHANNEL_PROMO)
Após a criação de um canal, o desenvolvedor não pode alterar sua importância programaticamente — esta é uma restrição do Android para proteger o usuário contra abusos. Se precisar alterar a importância de um canal, crie um novo canal com um ID diferente e migre as notificações.
Se precisar alterar a importância de um canal existente, crie um novo canal com um ID diferente (ex.: “messages_v2”) e comece a enviar notificações para ele. O canal antigo pode ser excluído via deleteNotificationChannel — todas as suas notificações serão removidas do histórico. Avise o usuário sobre a migração através da interface do aplicativo para que ele não perca suas configurações.
NotificationChannelGroup combina vários canais em um grupo visual na interface de configurações do Android. Os grupos ajudam o usuário a navegar quando o aplicativo usa 5+ canais: por exemplo, “Social,” “Sistema,” “Marketing.”
Um grupo é criado via createNotificationChannelGroup e passado para o canal na sua criação através do método setGroup. Excluir um grupo também exclui todos os seus canais. Cada canal pode pertencer a apenas um grupo.
Na prática, grupos de canais são recomendados para aplicativos com mais de 3 canais. Eles simplificam a navegação nas configurações e reduzem a probabilidade de o usuário desativar todas as notificações de uma vez sem entender a lista de canais.
Um grupo é criado via createNotificationChannelGroup com um ID e nome únicos. Em seguida, cada canal é atribuído ao grupo através do método setGroup. Nas configurações do sistema, o grupo aparece como uma seção com um cabeçalho, sob o qual todos os canais deste grupo são listados. Se um grupo for excluído, todos os seus canais também são removidos automaticamente pelo sistema sem possibilidade de recuperação.
O design adequado dos canais de notificação afeta diretamente a experiência do usuário e a retenção. O padrão principal são três níveis de importância: canal crítico (IMPORTANCE_HIGH) para mensagens e chamadas, padrão (IMPORTANCE_DEFAULT) para notificações gerais e silencioso (IMPORTANCE_LOW) para marketing e notícias. Essa gradação dá ao usuário uma escolha clara sem sobrecarga.
O segundo padrão é um canal por módulo funcional. Cada módulo importante do aplicativo (chat, pedidos, feed, marketing) tem seu próprio canal. Se houver mais de 5 módulos, combine-os em um NotificationChannelGroup. Nas configurações do sistema, o grupo aparece como uma seção com itens recolhíveis — isso simplifica a navegação.
O terceiro padrão é um canal do desenvolvedor. Crie um canal separado com IMPORTANCE_MIN para notificações de depuração e serviço. Os usuários não os verão na sombra, mas o desenvolvedor pode analisar logs via adb. Em produção, este canal pode ser excluído ou ocultado da interface através de Intent nas configurações.
O quarto padrão é o feedback do canal. Mostre ao usuário na interface quais canais estão ativos e qual é sua importância atual. No Android 8+, você pode obter o status do canal através de getNotificationChannel e oferecer ao usuário alterar as configurações se o canal estiver desativado. Isso é especialmente importante para funções críticas do aplicativo.
Perguntas frequentes
A notificação não será exibida nem na sombra nem na bandeja. O sistema ignora silenciosamente a chamada notify(). Exceções: ao usar NotificationCompat, a biblioteca cria um canal padrão, mas sua importância é sempre DEFAULT. É recomendável sempre criar seus próprios canais.
Você pode alterar o nome, a descrição e o som de um canal. Não é possível alterar a importância — esta decisão é protegida pelo sistema contra o desenvolvedor. Se precisar aumentar a importância, crie um novo canal com um ID diferente e use-o para novas notificações. O usuário pode alterar a importância a qualquer momento.
Use getNotificationChannel e verifique a importância: se o valor for IMPORTANCE_NONE, o canal está desativado. Você também pode abrir as configurações do sistema do canal através de Intent: Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS com os parâmetros app_package e channel_id.
Não há limites — o Android não define um limite para o número de canais. No entanto, recomenda-se não criar mais de 5–10 canais para não sobrecarregar o usuário com opções. O mínimo ideal é de 2–3 canais: notificações críticas, regulares e de marketing.
No Android 7.1 (API 25) e versões anteriores, os canais não são suportados. A classe NotificationChannel está disponível apenas a partir da API 26. Para compatibilidade reversa, use NotificationCompat e envolva a criação do canal em uma condição: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O).
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também