Aula 20 - Projeto Capstone: App Android Nativo Completo Autônomo 🚀
Objetivo Pedagógico
Objetivo: Conceber e integrar um aplicativo Android nativo completo de nível comercial: interface declarativa com Compose, arquitetura limpa em camadas (Clean Architecture), persistência reativa com Room, injeção Hilt e sincronização assíncrona em background com WorkManager.
📑 1. Fundamentos Teóricos & Análise Técnica
O Projeto Capstone consolida a maturidade profissional em desenvolvimento Android nativo moderno: 1. Arquitetura Limpa em Três Camadas (Clean Architecture): - Camada de Apresentação (Presentation Layer): Composables, ViewModels MVI e contratos de estado de tela. - Camada de Domínio (Domain Layer): Casos de uso atômicos (Use Cases / Interactors) contendo regras puras de negócio, completamente desacoplados do framework Android. - Camada de Dados (Data Layer): Repositórios, DAOs do Room, clientes HTTP (Retrofit/Ktor) e fontes de dados remotas e locais. 2. Sincronização em Background com WorkManager: - Garantia de execução de tarefas mesmo se o aplicativo for encerrado ou o dispositivo for reiniciado. - Restrições declarativas de hardware (Constraints): executar tarefas pesadas de upload/download somente quando o aparelho estiver conectado ao Wi-Fi e carregando a bateria. 3. Resiliência e Qualidade: - Testes unitários de Use Cases com MockK e testes de UI de componentes Compose utilizando createComposeRule.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
UI["Compose Presentation (Screens & ViewModels)"] --> UseCase["Domain Layer (Use Cases Puros)"]
UseCase --> Repo["Data Layer (Repository Pattern)"]
Repo --> Local["Room Database (Single Source of Truth)"]
Repo --> Remote["API REST / GraphQL (Retrofit / Ktor)"]
WM["WorkManager (Sync em Background)"] --> Repo
style UI fill:#e1f5fe,stroke:#01579b
style UseCase fill:#fff3e0,stroke:#e65100
style Repo fill:#f3e5f5,stroke:#7b1fa2
style Local fill:#e8f5e9,stroke:#2e7d32
style WM fill:#ffebee,stroke:#c62828 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Independência de Framework no Domínio: A camada de negócios não importa pacotes do SDK do Android, permitindo execução instantânea de testes na JVM. - Garantia de Execução com WorkManager: Persistência de tarefas em SQLite gerenciado pelo SO com tolerância a quedas de processo. - Repositório como Mediador Único: Encapsulamento das regras de prioridade entre cache local e chamadas de rede. - Build Rápido com Gradle Modularizado: Separação do projeto em submódulos Gradle (:core:database, :core:network, :feature:orders).
🛠️ 2. Implementação Prática em Engenharia Android Nativa, Compose, Hilt, Room e WorkManager
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// SyncOrdersWorker.kt (WorkManager com Restrições de Hardware e Injeção Hilt)
package com.portal.android.sync
import android.content.Context
import androidx.hilt.work.HiltWorker
import androidx.work.*
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import java.util.concurrent.TimeUnit
@HiltWorker
class SyncOrdersWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters,
private val ordersRepository: OrdersRepository
) : CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
return try {
ordersRepository.syncWithRemoteServer()
Result.success()
} catch (e: Exception) {
if (runAttemptCount < 3) Result.retry() else Result.failure()
}
}
companion object {
fun buildPeriodicSyncRequest(): PeriodicWorkRequest {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED) // Somente Wi-Fi
.setRequiresBatteryNotLow(true)
.build()
return PeriodicWorkRequestBuilder<SyncOrdersWorker>(6, TimeUnit.HOURS)
.setConstraints(constraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 15, TimeUnit.MINUTES)
.build()
}
}
}
💡 Análise Passo a Passo do Código
- Anotação
@HiltWorker: Permite injeção de dependências assistida com Hilt diretamente no construtor do Worker. - Restrições Inteligentes de Hardware: Poupa dados do usuário e vida útil da bateria exigindo rede Wi-Fi e bateria saudável.
- Backoff Exponencial: Garante que tentativas consecutivas de retry não sobrecarreguem o servidor em situações de queda de infraestrutura.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto