📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Especialização em Android Nativo. Recomendado revisar antes de iniciar.
v1.0 — Android Nativo, Kotlin, Firebase Cloud Messaging (FCM), NotificationCompat, Canais de Notificação e Deep Links
Série Prática Android Clássico — Projeto 14 de 21
- P13: TARDIS Panel com DataStore Preferences
- ➡️ P14 (este): Portais Dimensionais com Notificações Push
- P15: J.A.R.V.I.S. Sync com WorkManager
- P16: Alerta Gotham com Broadcast & Alarmes
- P17: Anime Soundboard com MediaPlayer
O projeto Portais Dimensionais domina a mecânica de engajamento assíncrono em dispositivos móveis através de Push Notifications e Deep Linking. A aplicação implementa serviços em segundo plano orientados a eventos via Firebase Cloud Messaging (FCM), cria canais categorizados de notificação (NotificationChannel) em conformidade com o Android 8.0+ (API 26+) e Android 13+ (permissão POST_NOTIFICATIONS), e direciona o usuário para fendas dimensionais específicas via PendingIntent e grafo de navegação.
Todos os serviços de mensageria, receptores e interfaces residem na subpasta canônica mobile-android-kotlin/:
catalogo_projetos/android_p14_portais_push/
├── assets/
│ ├── mockup_portais_fluxo.svg
│ ├── screenshot_01_lista_portais.svg
│ ├── screenshot_02_detalhe_fenda.svg
│ └── screenshot_03_push_notification.svg
├── mobile-android-kotlin/
│ ├── app/
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── java/br/com/curso/portaispush/
│ │ │ │ ├── fcm/
│ │ │ │ │ └── PortalFirebaseService.kt
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ └── build.gradle
│ ├── gradle/
│ ├── build.gradle
│ ├── gradlew
│ ├── settings.gradle
│ └── README.md
└── index.md
| ID | Persona | Narrativa da Funcionalidade | Critério de Aceitação Principal | Prioridade |
|---|---|---|---|---|
| US-01 | Viajante Interdimensional | Quero receber um alerta no smartphone quando um portal abrir em uma dimensão próxima. | Exibição de notificação na barra de status com título, som e ícone. | Alta |
| US-02 | Viajante Interdimensional | Quero tocar na notificação e ser levado diretamente para a fenda dimensional notificada. | Abertura da tela de detalhes via Deep Link contendo o ID do portal. | Alta |
| US-03 | Usuário Android 13+ | Quero que o app solicite permissão de notificação de forma transparente no primeiro acesso. | Diálogo nativo de permissão android.permission.POST_NOTIFICATIONS. |
Alta |
| US-04 | Engenheiro de Software | Quero que as mensagens sejam categorizadas em canais prioritários e secundários. | Criação de NotificationChannel com importância alta e sons distintos. |
Média |
| US-05 | Desenvolvedor Mobile | Quero capturar o token de registro do dispositivo para envio de testes direcionados. | Invocação de FirebaseMessaging.getInstance().token. |
Baixa |
POST_NOTIFICATIONS em dispositivos rodando Android 13 (API 33) ou superior.FirebaseMessagingService implementando os callbacks onMessageReceived e onNewToken.NotificationChannel com prioridade alta e vibração configurada.PendingIntent apontando para a Activity com flags seguras (FLAG_IMMUTABLE).FLAG_IMMUTABLE ou FLAG_MUTABLE.smallIcon).flowchart TD
User([fa:fa-user Viajante])
FCM[(fa:fa-cloud Firebase FCM)]
OSNotif[(fa:fa-bell NotificationManager)]
subgraph AppPortais ["🌀 Portais Push (mobile-android-kotlin)"]
UC01["Registrar Token de Notificação"]
UC02["Receber Payload de Fenda Dimensional"]
UC03["Construir Notificação com Canal"]
UC04["Disparar Alerta na Barra de Status"]
UC05["Navegar para o Portal via Deep Link"]
end
AppPortais --> UC01
UC01 --> FCM
FCM -->|Push Event| UC02
UC02 --> UC03
UC03 --> OSNotif
OSNotif --> UC04
User -->|Toca no Alerta| UC05
| ID Requisito | História de Usuário | Artefato de Código | Teste de Aceitação |
|---|---|---|---|
| RF-01 | US-03 | mobile-android-kotlin/app/.../MainActivity.kt |
testPostNotificationPermissionFlow() |
| RF-02 | US-01, US-05 | mobile-android-kotlin/app/.../PortalFirebaseService.kt |
testOnMessageReceivedHandler() |
| RF-03 | US-04 | mobile-android-kotlin/app/.../PortalFirebaseService.kt |
testNotificationChannelCreated() |
| RF-04 | US-02 | mobile-android-kotlin/app/.../PortalFirebaseService.kt |
testPendingIntentImmutableFlag() |
| RF-05 | US-02 | mobile-android-kotlin/app/.../MainActivity.kt |
testDeepLinkIntentArgs() |
PortalFirebaseService.kt)ℹ️ O trecho de código que ficava aqui não correspondia ao código do projeto e foi retirado. Consulte os arquivos em
mobile-android-kotlin.
cd catalogo_projetos/android_p14_portais_push/mobile-android-kotlin
./gradlew installDebug
| Checkpoint | Meta Técnica | Critério de Aceite | Status |
|---|---|---|---|
| CP-01 | Permissão Android 13 | Diálogo POST_NOTIFICATIONS configurado corretamente |
PASS ✅ |
| CP-02 | Canais de Notificação | NotificationChannel com alta prioridade registrado |
PASS ✅ |
| CP-03 | Recepção de Mensagens | Processamento de payloads FCM com exibição de heads-up | PASS ✅ |
| CP-04 | Navegação com PendingIntent | Toque na notificação direciona para o portal correto | PASS ✅ |
| CP-05 | Suíte de Testes Automatizados | Testes de unidade e instrumentação aprovados com 100% de sucesso | PASS ✅ |