🧩 Exercícios - Cap 18: Alertas de Batalha: Notificações

📖 Ver Cap 18

🎯 Antes de começar

No Cap 18 você declarou o AlertaService no Manifesto e criou o canal "canal_itens" (criarCanalItens + mostrarNotificacaoItem, com notify(2, ...)). Depois de completar as três Práticas, faça o exercício extra abaixo para criar um terceiro canal e entender por que o ID do notify é tão importante.


💪 Exercício Extra 1: Canal de Conquistas + IDs Dinâmicos (20 min)

Objetivo: Criar um terceiro canal ("canal_conquistas") e usar um ID incremental no notify, para que várias notificações apareçam empilhadas em vez de se sobrescreverem.

Passos:

  1. Crie o canal de conquistas:
    fun criarCanalConquistas(context: Context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val canal = NotificationChannel(
                "canal_conquistas",
                "Conquistas",
                NotificationManager.IMPORTANCE_LOW
            )
            val manager = context.getSystemService(NotificationManager::class.java)
            manager.createNotificationChannel(canal)
        }
    }
    
  2. Crie uma variável global para gerar IDs únicos, e a função mostrarNotificacaoConquista:
    var proximoIdConquista = 100
    
    fun mostrarNotificacaoConquista(context: Context, nomeConquista: String) {
        criarCanalConquistas(context)
    
        val notificacao = NotificationCompat.Builder(context, "canal_conquistas")
            .setContentTitle("🏆 Conquista Desbloqueada!")
            .setContentText(nomeConquista)
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setPriority(NotificationCompat.PRIORITY_LOW)
            .build()
    
        NotificationManagerCompat.from(context).notify(proximoIdConquista, notificacao)
        proximoIdConquista += 1
    }
    
  3. Chame a função duas vezes, com conquistas diferentes:
    mostrarNotificacaoConquista(context, "Primeira Captura")
    mostrarNotificacaoConquista(context, "10 Pokémons Capturados")
    

✅ Resultado Esperado


🆘 Resolução de Problemas Comuns

Erro Causa Solução
Val cannot be reassigned em proximoIdConquista += 1 A variável foi declarada com val em vez de var Declare var proximoIdConquista = 100
A segunda conquista substitui a primeira proximoIdConquista não foi incrementado antes da próxima chamada, ou o notify usa um id fixo Confirme proximoIdConquista += 1 ao final da função, e que notify(proximoIdConquista, ...) usa a variável
Nenhuma notificação aparece (Android 8+) criarCanalConquistas(context) não foi chamada antes do Builder Garanta que mostrarNotificacaoConquista chama criarCanalConquistas(context) na primeira linha

⬅️ Voltar para Exercícios