10 - Arquitetura de Aplicações Android e Outros Conceitos Importantes
Considerações Iniciais
- Limitações de Recursos: Dispositivos móveis podem encerrar processos de aplicativos para liberar recursos.
- Arquitetura de Aplicativos: Define os limites e responsabilidades de cada parte do aplicativo.
Princípios Fundamentais
Separação de Responsabilidades
- Evitar concentrar todo o código em uma Activity ou Fragment.
Interface Guiada por Modelos de Dados
- A UI deve ser baseada em modelos de dados, preferencialmente persistentes.
- Benefícios: Aplicativos mais testáveis e robustos.
Fonte Única de Verdade
- Designar uma única fonte de verdade (SSOT) para cada tipo de dado.
- Centraliza mudanças, protege dados contra alterações indevidas e facilita o rastreamento de bugs.
Fluxo de Dados Unidirecional
- Utiliza-se o padrão de Fluxo de Dados Unidirecional (UDF) onde o estado flui em uma direção e eventos na direção oposta.
Arquitetura Recomendada
Camadas do Aplicativo
- Camada de UI: Exibe os dados na tela.
- Camada de Dados: Contém a lógica de negócios e expõe os dados.
Técnicas Modernas
- Arquitetura reativa e em camadas.
- Fluxo de Dados Unidirecional (UDF).
- Uso de Coroutines e Flows.
- Injeção de dependência.
Camadas Detalhadas
Camada de UI
- Elementos de UI: Renderizam os dados.
- Portadores de Estado: Mantêm e gerenciam os dados do UI (exemplo: ViewModel).
Camada de Dados
- Repositórios: Expõem e centralizam dados, resolvem conflitos entre fontes e contêm lógica de negócios.
Camada de Domínio (Opcional)
- Função: Encapsula lógica de negócios complexa que pode, por exemplo, ser reutilizada por vários ViewModels.
Injeção de Dependência
- Injeção de Dependência (DI): Permite definir dependências sem construi-las diretamente. Durante a execução, outra classe é responsável por prover essas dependências.
- Service Locator: Padrão que fornece um registro para obter dependências. Ou seja, durante a execução, classes podem consultar o registro para obter suas dependências.
A biblioteca Hilt é indicada para o uso de DI em projetos Android:
Melhores Práticas Gerais
- Não armazene dados em componentes de aplicativos.
- Reduza dependências em classes Android (seus componentes devem ser os únicos a dependerem de Apis do Android, como o
Context
). - Crie limites bem definidos entre módulos.
- Minimize a exposição de cada módulo.
- Testabilidade e segurança de tipos.
Benefícios da Arquitetura
- Manutenção e Qualidade: Melhora a robustez geral do aplicativo.
- Escalabilidade: Facilita a contribuição de múltiplas pessoas e equipes.
- Onboarding: Consistência simplifica a adaptação de novos integrantes.
- Testabilidade: Arquitetura favorece tipos simples e testáveis.
Recomendações para Arquitetura de Aplicações Android
https://developer.android.com/topic/architecture/recommendations
Outros conteúdos
Distribuição de Aplicativos
- APKs Otimizados: No Google Play, servidores geram APKs otimizados contendo apenas recursos necessários para o dispositivo que solicita a instalação.
Sistema Operacional Android
- Sistema Multiusuário: Android é um sistema multiusuário baseado em Linux; cada app é um usuário diferente.
- Permissões de Arquivos: Cada app tem permissões para acessar apenas seus próprios arquivos.
- Processo Isolado: Cada app executa em seu próprio processo Linux e máquina virtual, garantindo isolamento.
- Princípio do Menor Privilégio: Apps acessam apenas componentes necessários para sua execução.
Permissões
- Solicitação de Permissões: Apps podem solicitar acesso a dados do dispositivo como localização e câmera, mas o usuário deve conceder explicitamente essas permissões. Mais informações sobre permissões.
Tipos de Componentes de Aplicativos
-
Activities
- Ponto de entrada para interação com o usuário, representando uma tela.
- Diferentes apps podem iniciar activities se permitido.
-
Services
- Executa operações em segundo plano sem interface de usuário.
- Ex.: Tocar música, buscar dados na rede.
-
Broadcast Receivers
- Permite receber eventos do sistema e reagir a eles.
- Ex.: Notificação de eventos futuros.
-
Content Providers
- Gerencia dados entre aplicativos.
- Por exemplo o sistema Android expõe um Content Provider que gerencia informações de contato do usuário. Qualquer Aplicação com permissões suficientes pode gerenciar essas informações;
- Acesso permitido a apps com as permissões corretas.
Interação entre Aplicativos
- Início de Componentes de Outros Apps: Apps podem iniciar componentes de outros apps sem incorporar código de terceiros.
- Intents: Mensagens assíncronas que ativam três dos quatro tipos de componentes (activities, services, receivers):
- Por exemplo, uma aplicação pode enviar uma
Intent
para o aplicativo nativo de câmera para capturar uma foto. - Nesse caso, não é necessário implementar um acesso à câmera. Basta utilizar a tela do aplicativo nativo.
- Esse relacionamento pode ser obtido com qualquer aplicativo que exponha
Intents
para acesso aos seus recursos.
- Por exemplo, uma aplicação pode enviar uma
- Manifesto do Aplicativo: Arquivo
AndroidManifest.xml
declara componentes e permissões de uso.
Exemplo de Intent
para compartilhar um filme na Aplicação Movies App.
Declaração de Componentes
-
Elementos no Manifesto:
<activity>
para activities<service>
para services<receiver>
para broadcast receivers<provider>
para content providers
-
Declaração de Câmera:
- Apps declaram recursos de hardware, como câmera, no arquivo
AndroidManifest.xml
. - Permite especificar se o recurso é necessário ou opcional.
- Apps declaram recursos de hardware, como câmera, no arquivo