Programação Mobile
Android
Sistema operacional da Open Handset Alliance
Liderado pela Google
Código aberto (Apache License)
fabricantes customizam SO
Baseado em Linux
Android é responsável por gerenciar memória e processos
Apesar de ser escrito em Java e Kotlin, os apps não utilizam a JVM e os bytecodes não são executados ➡ classes Java são compiladas para executáveis da máquina virtual Dalvik
Dalvik (runtime): VM especializada desenvolvida e otimizada especificamente dispositivos móveis
.apk (Android Package): Executável gerado após construção (build) do projeto/app; contém conteúdos necessários para o runtime e instalação
.aab (Android APP Bundle): Executável que contém os conteúdos de um projeto Android, porém adicionalmente inclui metadados que não são necessários para o runtime; formato de publicação que não pode ser instalado em dispositivos,

Tipos de Aplicativos Mobile
Aplicativos Web
Acesso pelo navegador e WebView
Não exigem instalação no dispositivo do usuário
Desenvolvidos usando tecnologias web como HTML, JavaScript e CSS
Publicação mais rápida; atualização automática
Aplicativos Híbridos
Desenvolvidos com tecnologias web (HTML, JavaScript e CSS), mas executados dentro de um contêiner nativo, permitindo o acesso a recursos do dispositivo
Combinam elementos de aplicativos nativos e da web
Depende de uma biblioteca de terceiros
Camada entre o aplicativo e a biblioteca da plataforma
São escritos uma vez e podem ser executados tanto no Android quanto no iOS
Principais bibliotecas e ferramentas: Cordova; Phonegap; Ionic; Appcelerator; JqueryMobile; Intel XDK
Aplicativos Multiplataformas Nativos
Desenvolvidos com uma única base de código que pode ser executada em diferentes SOs
Componentes são nativos, não HTML
Escritos em uma linguagem específica, que é convertida em código nativo (compilação cruzada) ou renderizada em tempo de execução (runtime) em diferentes plataformas
Compilação cruzada tende a ter menor desempenho ➡ menor controle de como é compilado
Podem acessar todos os recursos do dispositivo, como acelerômetro, giroscópio, geolocalização, etc
Principais tecnologias: Xamarin (C#); Nativescript (Javascript, Typescript e XML); React Native (Javascript, Typescript e XML)
Aplicativos Nativos
Bibliotecas próprias
Funciona como um software desktop, com possibilidade de arquitetura client/server (consumo de serviços)
Funcionamento offline
Armazenamento de dados localmente
Tarefas em segundo plano


Compilação
Processo de transformar/traduzir um código em de linguagem de programação de alto nível em um programa executável
Preprocessamento: O pré-processador lê o código-fonte (.java) e faz substituições necessárias para que o programa possa ser compilado
Verificação sintática: Etapa que procura por erros de sintaxe nos códigos, como parênteses não fechados, falta de ponto e vírgula no final da instrução, etc
Compilação propriamente dita: Transforma o código preprocessado em um programa objeto (.class) , que está em linguagem de máquina (bytecode), mas ainda não está pronto para ser executado
Linkedição (linking): Programas objeto e bibliotecas necessárias são linkadas, transformando-os em um único executável em linguagem de máquina própria de uma plataforma
Tempo de Compilação: Durante o processo de conversão entre código-fonte e código-objeto
Tempo de Execução: Após a ativação do programa executável

Arquitetura de Aplicativos
Dispositivos móveis também têm recursos limitados, portanto, a qualquer momento, o SO pode eliminar processos de aplicativos para abrir espaço para novos
Dadas as condições deste ambiente, é possível que os componentes sejam iniciados individualmente e fora de ordem, e o SO ou usuário pode destruí-los a qualquer momento
Não se deve armazenar ou manter na memória nenhum dado ou estado do aplicativo em componentes do aplicativo, e os componentes não devem depender uns dos outros
Classes baseadas em UI devem conter apenas lógica que lide com interações de UI e sistema operacional, não se deve armazenar dados diretamente nestas
Deve-se conduzir a UI a partir de modelos de dados (de preferência persistentes), que representam os dados de um aplicativo; eles são independentes dos elementos da interface do usuário e de outros componentes
SSOT - Single Source Of Truth: Quando novos dados são definidos no aplicativo, estes são atribuídos a um SSOT, que é o proprietário desses dados, e apenas o SSOT pode modificá-los UDF - Unidirecional Data Flow: O estado ou os dados geralmente fluem em uma direção, dos tipos de escopo mais alto da hierarquia para os de escopo mais baixo; eventos geralmente são acionados a partir dos tipos de escopo inferior até atingirem o SSOT para o tipo de dados correspondente
SSOT é frequentemente usado com o padrão UDF
Camadas
UI Layer: UI elements; state holders
Data Layer: Repositories; data sources

Programação Android em Java
Android Studio
Alterar ícone APP
app/src/main/res/minimap.../ic_launcher.xml
alterar também arquivo
AndroidManifest.xmliconeroundIcon
criar versões de diversos tamanhos e cortes (quadrado, redondo etc)
Componentes de Aplicativos
Activity: Porta de entrada de interação do usuário; representa uma única tela com a UI (User Interface); facilita manejo dos processos pelo sistema, de acordo com contexto salvo e utilização do usuário
Services: Ponto de entrada de uso geral para manter um aplicativo em execução em segundo plano, ou até este se encerrar (started service) ou por dependência de outro aplicativo ou sistema (bound service)
Broadcast receivers: Componente que permite ao sistema entregar eventos ao aplicativo fora de um fluxo normal de usuários; são outra entrada para aplicativos, permitindo que o sistema forneça transmissões mesmo para aplicativos que não estão em execução no momento
Content providers: Gerencia um conjunto compartilhado de dados de aplicativos que podem ser armazenados no sistema de arquivos; através do provedor de conteúdo, outros aplicativos podem consultar ou modificar os dados
Como o sistema executa cada aplicativo em um processo separado com permissões que restringem o acesso, para ativar um componente em outro aplicativo, uma mensagem é entregue ao sistema especificando a intenção (intent) de iniciar um componente específico
Arquivos
AndroidManifest.xml: Antes que o sistema possa iniciar um componente do aplicativo, ele lê o arquivo de Manifest do aplicativo, onde são declarados todos os componentes
Layout: Caixas para acoplar as views; base para componentes
XML: Linguagem de Marcação Extensível; permite descrever dados de maneira estruturada para criar interfaces de usuários (UI); estático
Para tornar dinâmico é necessário utilizar a classe R
Resources: Recursos; arquivos adicionais e conteúdo estático que o código usa, como bitmaps, definições de layout, strings de interface de usuário, instruções de animação e etc
Estrutura Básica
Gerada automaticamente pelo Android Studio
Bundle: Classe utilizada para armazenar dados que serão passados entre componentes (Activities ou Fragments); os dados são armazenados em pares de chave-valor, a chave é uma String e o valores pode ser de diversos tipos primitivos, objetos e outros Bundles
Classe
MainActivityherda deAppCompatActivityO método
onCreate()da classeAppCompatActivityé sobrescrito (@Override)Responsável por realizar configurações iniciais, como definir o layout da Activity pelo método
setContentView
Recebe o parâmetro
savedInstanceStatedo tipoBundleContém o estado anteriormente salvo da atividade, se houver
Útil para restaurar o estado da Activity após ela ser destruída e recriada pelo SO
super.onCreate(savedInstanceState)chama recursivamente o método onCreate da classe pai (AppCompatActivity), passando como parâmetro o Bundle declaradoEste método garante que a inicialização correta da atividade seja realizada pela classe pai
setContentView(R.layout.activity_main): define o layout da atividade, o argumento passado é um identificador de recurso que referencia o arquivo XML do layout a ser utilizado.R.layout.activity_mainrefere-se ao arquivo activity_main.xml localizado na pasta res/layout do projeto
Activity
Localizado no pacote
android.appMódulo único e independente que está relacionado diretamente com uma tela de interface de usuário e suas funcionalidades (similar a classe JFrame do swing Java)
Podem ser organizadas em blocos totalmente reutilizáveis para serem compartilhadas entre diferentes aplicativos
Controla seu estado e a passagem de parâmetros de uma tela para outra e controla os eventos dos componentes visuais.
Toda classe que representa uma tela, estende, direta ou indiretamente, a classe
ActivityToda classeActivityimplementa o métodoonCreate(), que é obrigatório e responsável por realizar a inicialização necessária para executar a aplicação
View
Localizado no pacote
android.viewClasse mais básica para a construção de componentes visuais, dos mais simples aos mais complexos
Todos os componentes visuais no Android, como EditText, Button, ConstraintLayout e outros, são subclasses da classe View
Cada View ocupa uma área retangular na tela e é responsável por desenhar a si mesma e tratar eventos (interações do usuário)
Listener para eventos em Botão
OnClickListenerse trata de um Interface Funcional, ou seja, contém apenas um método abstrato que deve ser implementado na classe que implementará a interfaceClasses Anônimas: Classe sem nome que é definida e instanciada ao mesmo tempo, pois serão utilizadas uma única vez enquanto estiver na memória; usada para implementar interfaces ou estender classes
new ClasseAnon();
Por meio de instâncias das classes anônimas podemos implementar interfaces funcionais e declarar a implementação do método abstrato que esta contém
Pode-se utilizar expressões Lambda para abstrair o código, dado que se a interface tem somente um método, não necessita da declaração explícita, sendo assim, não é mais necessário a declaração de uma classe anônima somente para implementar a interface
Classe R
Classe especial que é gerada automaticamente pelo Android Studio
Serve como um índice para recursos, responsável por encontrar os recursos descritos nos arquivos XML e construir na aplicação
Mediador entre o arquivo XML e o arquivo.java
Quando um layout é definido em um arquivo XML, cada elemento no layout recebe um ID único
Quando o aplicativo é compilado, essa ID é adicionada à classe R.
Pode então referenciar esses IDs em código para manipular os elementos do layout
setContentView(R.layout.activity_main);
R.layout.activity_mainé uma referência a um layout chamadoactivity_main.xmlque está localizado na pasta res/layout/Nunca modificar a classe R manualmente, pois ela é gerada automaticamente e qualquer alteração será sobrescrita na próxima compilação
Intent
Localizado no pacote
android.content.IntentRepresenta uma “ação” que uma aplicação deseja executar; intenção
Essa intenção é enviada ao sistema operacional Android como forma de uma mensagem
Ligam componentes individuais entre si em tempo de execução, solicitando uma ação de outros componentes
Intent é uma mensagem assíncrona que ativa três dos quatro tipos de componentes: activities, services, and broadcast receivers
Transição entre Activity e Intent
Necessário o uso do método
startActivity(intent)O parâmetro
intenta ser passado ao método contém as informações necessárias sobre a Activity que será ativada pelo SOPode-se passar parâmetros (dados) de uma tela para outra com o método
putExtra(chave, valor)Recupera-se dados enviados da primeira tela com o método
getStringExtra()
Recursos
Recursos de String
Referenciado usando o valor fornecido no atributo
name(e não no nome do arquivo XML)É possível combinar recursos de string com outros recursos em um arquivo XML em um elemento
<resources>Reutilização de string em arquivos XML
Localização do arquivo ➡
res/values/filename.xmlNome do elemento é usado como ID do recurso
Tipo de dados do recurso compilado ➡ ponteiro para um String
Referência do recurso
Em java ➡
R.string.str_nameEm XML ➡
@string/str_name
É possível utilizar arrays com diversas strings
Reutilização de Estilos
Criar arquivo
styles.xmlna pasta res/values
Componentes
Caixa de Diálogo
ListView
Spinner (Combobox)
Autocomplete
Atualizado