🧩 Exercícios - Cap 18: Alertas de Batalha: Notificações
🎯 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:
- 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) } } - 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 } - Chame a função duas vezes, com conquistas diferentes:
mostrarNotificacaoConquista(context, "Primeira Captura") mostrarNotificacaoConquista(context, "10 Pokémons Capturados")
✅ Resultado Esperado
- Aparecem duas notificações separadas na tela: “Primeira Captura” (id
100) e “10 Pokémons Capturados” (id101). - Compare com
mostrarNotificacao/mostrarNotificacaoItemdo capítulo, que sempre usam o mesmo id fixo (1ou2): chamá-las várias vezes substitui a notificação anterior, em vez de criar uma nova.
🆘 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 |