Programação para Dispositivos Móveis em Android
Programação para Dispositivos Móveis em Android
Móveis em Android
No desenvolvimento de aplicativos móveis para Android, há várias abordagens e
tecnologias disponíveis. Umas das mais populares é o React Native, que permite criar
aplicativos móveis usando JavaScript e React. Nesta explicação, vamos abordar os
principais conceitos envolvidos.
Componentes
Eles são a base de desenvolvimento com React Native. Um componente pode ser
entendido como um bloco de construção da interface do usuário. Ele pode ser reutilizável e
encapsular funcionalidades específicas, como um botão, um campo de entrada ou até
mesmo uma tela inteira.
Neste exemplo:
1. View é um contêiner similar à <div> do HTML
2. Text é utilizado para exibir textos na tela
JSX
JavaScript XML(JSX) é uma sintaxe que permite escrever código semelhante ao HTML
dentro do JavaScript. Ele facilita a criação da interface gráfica e melhora a legibilidade do
código.
Componentes Nativos
São aqueles que já fazem parte do próprio sistema operacional Android ou iOS. O React
Native fornece uma ponte entre o JavaScript e esses componentes para que possamos
usá-los.
Isso tornaria o desenvolvimento mais demorado e caro, pois exigiria duas equipes
diferentes trabalhando separadamente. O React Native resolve esse problema ao permitir
que um único código-fonte em JavaScript seja utilizado para criar aplicativos que funcionam
tanto no Android quanto no iOS.
Núcleo JavaScript
É a parte do React Native onde os desenvolvedores escrevem o código do aplicativo. Ele é
responsável por:
● Criar a interface do usuário(UI) com JSX
● Gerenciar estados e lógica de negócios
● Responder a eventos como toques de usuários e mudanças de tela
O React Native usa o motor JavaScript do próprio dispositivo para rodar esse código. Em
versões mais recentes do React Native, o Hermes é o motor JS padrão para Android,
tornando o desempenho mais eficiente.
Exemplo de código no núcleo JavaScript:
O código anterior cria um módulo nativo para Android, permitindo exibir um alerta
diretamente no sistema operacional.
A desvantagem da Bridge é que ela pode causar lentidão ao passar muitas mensagens
entre os núcleos.
Novas versões do React Native estão substituindo a Bridge por tecnologias mais rápidas
como:
TurboModules: Melhora a comunicação entre JS e módulos nativos.
Fabric: Substitui a renderização antiga para otimizar a interface.
Componentes Fundamentais do React Native
Principais características:
1. Agrupa outros componentes para organizar o layout
2. Permite aplicar estilos como cor de fundo, espaçamento e bordas
3. Pode ser usado para criar seções ou blocos de interface
Principais características:
1. Permite exibir textos estáticos e dinâmicos.
2. Suporta personalização de fonte, cor, tamanho e alinhamento.
3. Aceita aninhamento(pode conter outros elementos <Text> dentro dele).
<Image> – Exibe Imagens
O Image é usado para exibir imagens no aplicativo, seja a partir de um arquivo local ou da
internet.
Principais características:
1. Suporta imagens locais e remotas(URL)
2. Permite definir a altura, largura e estilos.
3. Oferece otimizações como cache para carregar imagens rapidamente.
Principais características:
1. Permite inserir texto interativamente
2. Suporta estilos personalizados
3. Pode ser configurado como senha, teclado numérico, validação e muito mais.
<ScrollView> – Rola Conteúdo na Tela
O ScrollView é um contêiner que permite rolagem vertical ou horizontal. Ele é útil quando há
muito conteúdo que não cabe na tela.
Principais características:
1. Permite rolar o conteúdo quando ultrapassa o tamanho da tela.
2. Pode ser usado para criar listas longas.
3. Suporta scroll vertical e horizontal
Esquematizar a depuração de aplicativos
Depuração
A depuração(debugging) é o processo de encontrar e corrigir erros no código de um
aplicativo. No React Native, podemos depurar erros que surgem durante a execução e
também fazer verificações proativas usando ferramentas especializadas.
Quando depurar(Debuggar)?
Vamos apresentar cenários onde é necessária a depuração de código:
Exemplo de breakpoint:
Estado de Objetos
Podemos inspecionar o estado dos objetos e componentes em tempo real. No React Native,
usamos o React Developer Tools para verificar estados e props de componentes.
Uso de Breakpoints
Os breakpoints permitem pausar a execução do código em um determinado ponto para
inspecionar valores de variáveis, estados e execuções.
Por exemplo, veja abaixo a descrição das funcionalidades de um APP, que por sua vez,
pode nos ajudar a entender o funcionamento.
Já no fluxo alternativo, que acontece quando o usuário não se loga, tem de ser possível:
1. Exibir os canais de contato.
2. Exibir banners rotativos de publicidade.
Tendo em mente a lista de funcionalidades, vamos organizar nosso pensamento da
seguinte forma:
Nº Tela Elementos visuais Elementos de
interação
Pesquisa e Referências
Antes de projetarmos a interface, analisaremos:
a. Aplicativos concorrentes
b. Padrões de design(Google Material Design, Human Interface Guidelines)
c. Experiência do usuário(UX) e boas práticas
Formas de entrega:
● Compartilhar o link do Figma / Adobe XD / InVision com a equipe.
● Criar um guia de estilo com cores, fontes e componentes.
● Definir as telas responsivas para diferentes tamanhos de tela(celular/tablet)
ScrollView
Insere um scroll próprio para o conteúdo nele inserido. Ele deve ser utilizado quando houver
muito texto a ser exibido na tela. Considerando as limitações de tamanho em um dispositivo
móvel, a utilização desse componente melhora a experiência do usuário, permitindo a
organização das informações mais importantes que queremos exibir em uma única tela.
SafeAreaView
Em termos de experiência do usuário, o SafeAreaView, disponível apenas para a plataforma
iOS, gera uma área segura no aplicativo e garante que o conteúdo por ele contido não seja
afetado pelas características e dimensões do dispositivo e nem por outros elementos da
própria aplicação, como barras de navegação, entre outros exemplos.
KeyboardAvoidingView
Ele resolve problemas comuns existentes entre os componentes visuais e o teclado virtual,
ajustando automaticamente a altura e a posição de acordo com a altura do teclado.
O que é um MODAL?
Um MODAL é uma janela ou caixa de diálogo que aparece sobre a tela principal do
aplicativo, geralmente para exibir informações importantes ou interagir com o usuário sem
sair da tela atual. Ele bloqueia a interação com o restante da interface até que seja fechado.
Eles são recursos essenciais para melhorar a interação do usuário em aplicativos móveis,
permitindo exibir mensagens, coletar informações ou solicitar confirmações sem sair da tela
atual.
Botões interativos
Button
O componente Button é um botão simples e estilizado pelo sistema operacional.
TouchableHighlight
Cria um botão que escurece ao ser pressionado, criando um efeito visual.
TouchableOpacity
Reduz a opacidade do botão ao ser pressionado, dando um efeito de transparência.
TouchableWithouFeedback
É usado para detectar toque sem um efeito visual. Ele é útil para fechar teclados ao tocar
fora de um campo de entrada.
O React Native fornece três componentes principais para renderizar listas de forma
eficiente:
● FlatList -> Para listas simples e performáticas.
● SectionList -> Para listas com seções organizadas por categorias.
● VirtualizedList -> Para listas muito grandes com otimização avançada.
Características:
1. Melhora a performance carregando apenas os itens visíveis.
2. Melhor alternativa para listas longas.
3. Suporta rolagem infinita e atualização dinâmica.
Propriedade Descrição
Características:
1. Organiza os itens por categorias/seções
2. Adiciona cabeçalhos para cada seção
3. Ideal para listas estruturadas, como catálogos ou lista de contatos
Propriedade Descrição
Características:
● Carrega apenas os itens visíveis na tela
● Útil para listas muito grandes(milhares de itens)
● Mais flexível, mas requer mais configurações
Propriedade Descrição
Stack Navigation
É um dos principais modelos de navegação no React Native, fornecido pela biblioteca
React Navigation. Ele organiza as telas do aplicativo em uma pilha(stack), onde cada nova
tela é empilhada sobre a anterior.
Método Descrição
Drawer Navigation
Também conhecido como navegação lateral, é um modelo de navegação no React Native
que usa um menu deslizante na lateral da tela. Esse menu permite que o usuário navegue
entre diferentes telas do aplicativo de forma prática.
Onde é usado?
1. Em aplicativos grandes, como WhatsApp e Gmail, onde há várias seções.
2. Aparece ao deslizar do lado esquerdo ou ao tocar no ícone de menu(hamburger ☰)
3. Ideal para navegação global entre páginas principais do app
Algumas propriedades do Drawer.Navigator
Propriedade Descrição
Em resumo, Drawer Navigation é muito útil para apps grandes, onde o usuário precisa
navegar entre diferentes seções do app sem precisar apertar botões de “voltar”. Ele melhora
a usabilidade, permitindo que as opções fiquem sempre acessíveis de forma rápida.
LayoutAnimation API
É um recurso voltado para animação do layout do aplicativo ao longo do seu ciclo de
renderização(inicialização e atualização). É bastante útil nas situações em que um
conteúdo inicialmente escondido, ao ser exibido, afeta o dimensionamento de seus
elementos anteriores ou posteriores.
Animated API
Se baseia em relações declarativas entre entradas e saídas, fazendo uso de
transformações configuráveis por meio de métodos, como iniciar e parar, por meio dos
quais podemos controlar a sua execução. Podemos animar os seguintes componentes
React :
● View
● Text
● Image
● ScrollView
● FlatList
● SectionList
Persistência de dados com React Native
Vamos entender dois conceitos muito importantes, que são a serialização e a
persistência.
Serialização
Definição: É um modo de expressar os dados de forma contígua, podendo ser uma
sequência de bytes ou algum padrão de texto conhecido, como XML ou JSON.
Conceito: Permitir a transmissão em rede ou a armazenagem em disco dos dados
serializados.
Persistência
Definição: Uma estrutura dotada de persistência ou persistente é aquela capaz de guardar
seu estado corrente, normalmente em meio não volátil, como as unidades de disco.
Objetivo: Recuperar posteriormente o seu estado corrente.
Web Services
Na comunicação B2B(Business to Business), temos o uso de XML, que apresenta maior
formalismo, através dos Web Services do tipo SOAP(Simple Object Access Protocol),
enquanto o uso de REST(Representational State Transfer), que apoia as operações de
consulta e cadastro nos métodos do HTTP, define um segundo tipo de Web Service, com
nome RESTful, o qual adota uma grande variedade de formatos para os dados, sendo
definido JSON como o padrão(voltado para o B2C).
A criação de um Web Service pode ser feita em qualquer linguagem, mas toda a
comunicação é efetuada com XML ou JSON, que é amplamente utilizado no mercado, que
permitem representar qualquer tipo de informação em modo texto, com neutralidade da
linguagem, por esse motivo são classificados como formatos interoperáveis.
SOAP(Simple Object Access Protocol)
É um protocolo mais rigoroso para a troca de informações estruturadas em uma rede. Ele
define um conjunto de regras sobre como os dados devem ser enviados e recebidos e é
baseado em XML
Exemplo de SOAP
GET https://api.weather.com/v1/city/NewYork
AsyncStorage
Ele permite guardar e recuperar pares do tipo chave-valor, ou seja, um identificador e um
dado associado, da mesma forma que uma chave primária identificando um registro em
uma tabela. Para utilizar objetos como valores, eles devem estar serializados no formato
JSON, com a utilização dos métodos descritos anteriormente.
Realm
É um banco de dados orientado a objetos(OODBMS - Object-Oriented Database
Management System) projetado para aplicativos móveis. Ele oferece uma alternativa mais
rápida e eficiente ao SQLite e AsyncStorage, sendo amplamente utilizado em aplicações
React Native, Android e iOS.
O Realm é:
● Leve e rápido, com melhor desempenho do que SQLite em muitas situações
● Fácil de usar, pois permite armazenar e recuperar dados usando objetos
diretamente
● Multiplataforma, suportando Android, iOS, React Native, Node.js e .NET
● Armazena os dados de forma nativa, sem necessidade de conversão para SQL
Relações entre dados Usa chaves estrangeira Usa referência diretas entre
objetos
Método Utilização
O conceito NoSQL evoluiu para Not Only SQL pois acabou incorporando maior hibridez nos
modelos de armazenamento. Houve então uma mudança de interpretação da sigla original,
que passou a significar Not Only SQL, ou seja, bancos de dados que não utilizam apenas
SQL.
Not Only SQL combina características de bancos relacionais e NoSQL, como PostgreSQL e
MongoDB. A ideia é que, embora bancos NoSQL não dependam de SQL, alguns podem
suportar consultas SQL ou até coexistir com bancos relacionais.
O diferencial do MongoDB, assim como os bancos NoSQL em si, é que cada documento de
uma coleção pode ter campos diferentes, ao contrário de uma tabela relacional onde todas
as linhas seguem o mesmo esquema.
Temos diversos operadores disponíveis na sintaxe de consulta do MongoDB, como
podemos observar no quadro seguinte
Operador Utilização
Vamos falar um pouco sobre os métodos HTTP para gerenciar as operações de consulta e
manipulação de dados:
Fetch API
Fetch API é uma biblioteca disponível nativamente em React Native para o consumo de
recursos externos.
Axios
O Axios é uma biblioteca JavaScript usada para fazer requisições HTTP. Ele funciona tanto
no navegador quanto no Node.js e é muito utilizado para consumir APIs REST.
Vantagens:
1. Melhora a experiência do usuário (UX), pois o app sempre funciona.
2. Evita perda de dados quando a internet cai.
3. Permite uso em locais com conexão instável(aviões, áreas rurais, etc.)
Como funciona?
1. Armazenamento Local
a. Os dados são salvos no dispositivo primeiro(banco de dados local, cache,
IndexedDB, SQLite, etc.)
2. Sincronização Inteligente
a. Quando a internet volta, o app sincroniza automaticamente as alterações
com o servidor.
3. Gerenciamento de Conflitos
a. Se houver alterações locais e remotas no mesmo dado, o app decide qual
versão manter(última alteração, merge, etc.)
Tecnologias Usadas
Sincronização de dados
1. PouchDB + CouchDB(Web e Mobile)
2. Firebase Firestore(sincronização automática)
3. Apollo Client + GraphQL(para cache offline)
Armazenamento em cache
1. Service Workers(Web)
2. Workbox(Web PWA)
3. AsyncStorage(React Native)
Singleton
Garante que uma classe tenha apenas uma única instância, útil para controladores de
acesso e gerenciadores de conexões com banco de dados. Para implementá-lo, é
necessário:
● Criar uma instância privada da classe.
● Criar um método estático público para retornar a essa instância.
● Definir um construtor privado para impedir múltiplas instâncias.
Facade
Simplifica o uso de subsistemas complexos, funcionando como uma interface única para
agrupar chamadas de componentes, como DAO’s. Esse padrão pode ser combinado com:
1. Flyweight - Para criar pools de objetos e otimizar o uso de memória
2. Proxy - Para acesso remoto eficiente a esses objetos.