Prévia do material em texto
<p>(Microsoft 2010-2019) foi utilizado por</p><p>diversos fabricantes</p><p>Desenvolvimento para</p><p>Dispositivos Móveis</p><p>SEMANA 1</p><p>Reconhecer o papel dos dispositivos móveis na sociedade, seus tipos,</p><p>usos, aplicações e tendências.</p><p>Conhecer os principais fabricantes, sistemas operacionais, e a base de</p><p>usuários de dispositivos móveis.</p><p>Entender as principais diferenças entre dispositivos móveis e</p><p>computadores de uso geral.</p><p>A computação ubíqua ou pervasiva parte do pressuposto da onipresença de computadores no cotidiano das</p><p>pessoas, de uma forma que se possa interagir com eles sem perceber. Para que isso ocorra, a interação deve</p><p>ser bastante natural, preferencialmente por meio da linguagem humana.</p><p>Dispositivos móveis são dispositivos tecnológicos (normalmente com</p><p>alguma inteligência...), que possuem duas características básicas:</p><p>Capacidade de comunicação</p><p>remota, normalmente via internet.</p><p>Mobilidade</p><p>Um aplicativo para smartphone se trata de um programa de computador e, como tal, precisa de um ambiente</p><p>de execução que, no caso dos aparelhos modernos, é um sistema operacional completo. Na atualidade, há dois</p><p>sistemas que dominam o mercado: o Android, projeto coordenado pelo Google e utilizado pela maioria dos</p><p>fabricantes de smartphones do mundo (Samsung, Motorola, LG, Xiaomi, etc.); e o iOS, o qual equipa</p><p>exclusivamente os iPhones da Apple.</p><p>O maior problema em relação à fragmentação dos sistemas operacionais é a incompatibilidade entre suas</p><p>plataformas. O desenvolvimento híbrido é uma espécie de fusão entre uma aplicação Web e um aplicativo</p><p>mobile nativo, que são desenvolvidos com tecnologia Web (basicamente Hypertext Markup Language [HTML],</p><p>Cascading Style Sheets [CSS] e JavaScript ou outras linguagens que, posteriormente, resultem nessa tríade),</p><p>suportada pelos navegadores.</p><p>2017</p><p>o uso de smartphones ultrapassou o uso de computadores como meio de acesso à internet</p><p>Sistema Operacional consiste basicamente no ambiente onde os</p><p>aplicativos são executados.</p><p>kernel Linux.</p><p>C, C++, Java, Kotlin.</p><p>utilizado exclusivamente nos dispositivos da Apple.</p><p>sistema proprietário desenvolvido pela Apple.</p><p>Objective-C e Swif</p><p>(Nokia 2002-2015) foi utilizado</p><p>por diversos fabricantes.</p><p>O Google e a Apple, como os principais fornecedores, mostram estratégias diferentes de mercado.</p><p>Enquanto o sistema operacional Android é aberto, possibilitando o seu uso por diversos fabricantes e modelos</p><p>de celulares (desde os mais baratos até os mais caros). O iOS da Apple está limitado aos dispositivos da própria</p><p>fabricante, que apresentam custo elevado, normalmente atendendo a um público com maior poder aquisitivo.</p><p>Estas características tornam o Android um sistema muito difundido e utilizado,</p><p>conferindo um maior Market Share.</p><p>A Apple costuma manter o sistema operacional atualizado durante vários anos, o sistema Android fornece</p><p>atualizações em janelas de tempo mais curtas, o que leva a uma base de usuários na plataforma Android</p><p>utilizando diferentes versões do sistema operacional, limitando por vezes as funcionalidades dos apps e / ou</p><p>demandando atualizações de aplicativos com maior frequência.</p><p>uso de diversos periféricos interfaces integradas ao dispositivo)</p><p>estático</p><p>interfaces integradas ao dispositivo possibilitando</p><p>movimento e localização</p><p>conexão estável conexão nem sempre estável</p><p>energia ''ilimitada" dependente de bateria</p><p>maior processamento e capacidade de</p><p>armazenamento</p><p>limitação do processamento e armazenamento</p><p>Com o desenvolvimento híbrido, precisa-se apenas de um time de desenvolvedores Web com conhecimento</p><p>geral em desenvolvimento mobile, sem ser especialista nos sistemas operacionais que executarão essa aplicação</p><p>(MAJCHRZAK; BIØRN-HANSEN; GRØNLI, 2018). A ideia original é utilizar a aplicação nativamente Web empacotada</p><p>em um executável para cada sistema, assim, a única diferença ficaria na parte da compilação e publicação do</p><p>aplicativo.</p><p>O aplicativo híbrido é executado em um navegador Web de forma transpa-rente ao usuário, portanto, quem está</p><p>usando a aplicação não vê o navegador (que fica oculto), e sim um aplicativo comum (MAJCHRZAK; BIØRN--</p><p>HANSEN; GRØNLI, 2018). Há uma grande vantagem em termos de desen-volvimento, porém, você ficaria sujeito</p><p>às limitações típicas de uma página Web acessada por meio do dispositivo, sem acesso aos recursos nativos do</p><p>aparelho e à renderização de telas via software, o que torna seu desempenho muito inferior e mais sujeito às</p><p>falhas.</p><p>Progressive Web Apps (PWA), que são uma aplicação Web que implementa certas especificações técnicas e, em</p><p>versões mais atuais, sobretudo da plataforma Android, executa em um browser oculto. Todavia, essa aplicação</p><p>possui um ícone para acesso e armazena localmente (no dispositivo) imagens, fontes e conteúdo estático para</p><p>poder ser acessado off-line, inclusive mantendo em cache os dados dinâmicos.</p><p>Assim, existe uma aplicação Web com pouquíssimas alterações, agindo como aplicativo. Dependendo do</p><p>framework utilizado no desenvolvimento da versão Web, tal modelo torna a criação desse aplicativo bastante ágil</p><p>e barata, se for comparada às outras formas de desenvolvimento. Um framework Web muito conhecido e capaz</p><p>de gerar PWA é o Quasar, baseado no Vue.js, com uma curva de aprendizado bastante suave e que pode servir</p><p>bem aos aplicativos que não demandem muitos recursos.</p><p>SEMANA 2</p><p>Reconhecer os principais componentes presentes no hardware de um</p><p>dispositivo móvel;</p><p>Compreender os principais aspectos de usabilidade no</p><p>desenvolvimento de aplicativos móveis;</p><p>Reconhecer tipos de testes e ferramentas utilizadas para verificação e</p><p>validação durante o desenvolvimento de aplicativos;</p><p>Compreender que os smartphones, o foco dos estudos ao longo do</p><p>curso, podem ser vistos como um "superset" dos demais dispositivos</p><p>móveis.</p><p>CPU (SOC)</p><p>SENSORES DE MOVIMENTO</p><p>T</p><p>E</p><p>L</p><p>A</p><p>S</p><p>A plataforma Android oferece dois sensores que permitem determinar a posição de um dispositivo: o</p><p>sensor de campo geomagnético e o acelerômetro. Além disso, esse sistema fornece um sensor que</p><p>permite identificar a proximidade da face de um dispositivo em relação a um objeto (conhecido como</p><p>sensor de proximidade). O sensor de campo geomagnético e o sensor de proximidade são baseados</p><p>em hardware. A maioria dos fabricantes de celulares e tablets inclui um sensor de campo</p><p>geomagnético nos próprios produtos. Da mesma forma, os fabricantes de celulares geralmente</p><p>incluem um sensor de proximidade para determinar quando o dispositivo é mantido próximo ao rosto</p><p>do usuário (por exemplo, durante uma chamada telefônica).</p><p>A maioria dos dispositivos Android tem um acelerômetro e muitos deles agora incluem um giroscópio.</p><p>A disponibilidade dos sensores com base em software é mais variável porque eles costumam depender</p><p>de um ou mais sensores de hardware para derivar os dados. Dependendo do dispositivo, esses</p><p>sensores com base em software podem derivar os dados do acelerômetro e magnetômetro ou do</p><p>giroscópio.</p><p>Os sensores de movimento são úteis para monitorar o movimento do dispositivo, como inclinação,</p><p>trepidação, rotação ou giro. O movimento geralmente é um reflexo de entrada direta do usuário. s</p><p>sensores de movimento por si só não costumam ser usados para monitorar a posição do dispositivo.</p><p>No entanto, eles podem ser usados com outros sensores, como o sensor de campo geomagnético,</p><p>para determinar a posição de um dispositivo relativa ao frame de referência do mundo.</p><p>Os sensores de vetor de rotação e de gravidade são os mais frequentemente usados para</p><p>monitoramento e detecção de movimento. O sensor de vetor rotacional é particularmente versátil e</p><p>pode ser usado para uma ampla gama de tarefas relacionadas a movimento, como detecção de gestos,</p><p>monitoramento de alteração angular e monitoramento de mudanças de orientação relativa.</p><p>O Android Open Source Project (AOSP) oferece três sensores de movimento com base em software:</p><p>sensor de gravidade, de aceleração linear e de vetor de rotação.</p><p>Uma característica que diferencia os smartphones de um computador de uso comum é que a CPU se apresenta</p><p>na forma de um System On a Chip (SOC),</p><p>onde o processador é composto por diversos componentes internos,</p><p>todos encapsulados em um mesmo chip.</p><p>Os smartphones podem contar com dezenas de sensores. Sensores basicamente são dispositivos</p><p>que respondem a alguma variação de um parâmetro físico no ambiente, como temperatura,</p><p>pressão, aceleração etc. Abaixo temos alguns sensores comumente encontrados em</p><p>smartphones:</p><p>Giroscópio: usa a força da gravidade para determinar a posição de um objeto no espaço e</p><p>permite detectar se o aparelho girou sobre o seu próprio eixo.</p><p>Acelerômetro: detecta aceleração e movimentos de deslocamento.</p><p>Magnetômetro: permite detectar campos magnéticos. Pode funcionar como uma bússola.</p><p>Infravermelho: sensor de velocidade.</p><p>LCD (Liquid Crystal Display): são telas de cristal líquido, onde uma corrente elétrica modifica a</p><p>estrutura molecular dos cristais produzindo as imagens.</p><p>IPS (In-Plane Switching): uma variação da tela de LCD (moléculas mais próximas), resultando em uma</p><p>melhor qualidade de imagem.</p><p>BATERIAS</p><p>USABILIDADE</p><p>Ion-lítio (Li+): este tipo de bateria possui a vantagem de não ficar “viciada”, pois não apresenta o efeito de</p><p>memória. No entanto, é uma tecnologia sensível às altas temperaturas. O calor pode fazer com que perca suas</p><p>propriedades.</p><p>Lítio-polímero: apresenta características semelhantes à Li+ com uma redução de certa de 20% no seu peso. É</p><p>mais resistente à sobrecarga, o que a torna mais segura. O custo de fabricação é mais elevado.</p><p>Níquel-cádmio: Possui um custo baixo e uma vida útil relativamente longa. No entanto, além de apresentar o</p><p>efeito de memória, leva na sua composição elementos tóxicos, o que fez com que o seu uso tenha sido bastante</p><p>reduzido em aparelhos.</p><p>Níquel híbrido: Foi a tecnologia utilizada nos primeiros aparelhos celulares. Possui uma longa durabilidade, no</p><p>entanto é grande e pesada.</p><p>OLED (Organic Light-Emitting Diode): utilizam diodos orgânicos emissores de luz no lugar de cristais líquidos,</p><p>resultando em um menor consumo de energia, e uma espessura mais fina da tela.</p><p>AMOLED (Active-Matrix Organic Light-Emitting Diode): derivada do OLED, esta tecnologia é capaz de</p><p>melhorar a responsividade permitindo um controle de imagem mais rápido e preciso tornando as imagens mais</p><p>fluidas.</p><p>Super AMOLED: incluem uma camada sensível ao toque, dispensando a camada de vidro do aparelho, com</p><p>menor consumo e uma estrutura mais leve do aparelho.</p><p>está associada à experiência que um usuário tem quando utiliza um determinado</p><p>aplicativo. A usabilidade diz respeito ao quão intuitivo, simples, agradável e útil o</p><p>aplicativo se apresenta ao usuário, resultando na fidelização ou não do usuário.</p><p>ESTRATÉGIA DE CONTEÚDO</p><p>Qual o produto ou serviço oferecido pelo App?</p><p>Quem é o público-alvo do App? (faixa etária, poder aquisitivo, grau de</p><p>instrução etc.)</p><p>ESTRATÉGIA DE APRESENTAÇÃO</p><p>A apresentação diz respeito à interface de usuário (UI). Existe uma série de técnicas e recursos que</p><p>podem tornar a interface com o usuário mais agradável e intuitiva. Toda vez que um novo elemento</p><p>(imagem, botão ou texto) é adicionado, aumentamos a complexidade da interface de usuário</p><p>Hierarquia: é interessante que</p><p>a UI apresente uma hierarquia</p><p>clara de importância</p><p>• Elementos claramente visíveis</p><p>• Contraste de tamanhos entre os elementos</p><p>• Informações-chave facilmente identificáveis.</p><p>• Ações importantes na parte superior ou inferior da tela</p><p>• Itens relacionados de nível hierarquia semelhante lado a lado</p><p>Ordem de Foco: Diz respeito a como</p><p>o foco do usuário caminha (em</p><p>relação aos itens apresentados), ao</p><p>longo da navegação do layout visual.</p><p>Geralmente a ordem de foco flui da</p><p>parte superior para a parte inferior</p><p>da tela (do item mais importante</p><p>para o menos importante).</p><p>• A ordem em que os elementos recebem o foco</p><p>• A forma como os elementos são agrupados</p><p>• Onde o foco se move quando o elemento em foco</p><p>desaparece</p><p>Uso de tecnologias assistivas: As tecnologias assistivas auxiliam a acessibilidade para</p><p>indivíduos com deficiência. Aplicativos para dispositivos móveis podem incorporar ou</p><p>ainda serem projetados visando facilitar o uso de tecnologias assistivas. Exemplos:</p><p>O conteúdo pode ser rotulado para otimizar a experiência para quem usa leitores de tela ou</p><p>experimenta uma versão somente de texto na sua interface.</p><p>Incorporação no aplicativo de um leitor de tela de interface de toque, que permite aos usuários</p><p>passar o dedo sobre a tela para ouvir o que está diretamente abaixo</p><p>A cor pode ajudar a comunicar humor, tom e informações críticas. Cores primárias, secundárias e de</p><p>destaque podem ser selecionadas para oferecer suporte à usabilidade. O contraste de cores</p><p>suficiente entre os elementos pode ajudar os usuários com baixa visão a ver e usar seu aplicativo.</p><p>O contraste de cores é importante para os usuários distinguirem vários elementos textuais e não</p><p>textuais. O contraste mais alto torna as imagens mais fáceis de ver. Uma imagem de baixo contraste</p><p>pode ser difícil para alguns usuários diferenciarem em condições de muita luz ou pouca luz, como em</p><p>um dia muito ensolarado ou à noite.</p><p>ESTRATÉGIA DE DESEMPENHO</p><p>A usabilidade de um aplicativo também está associada ao quão eficiente o aplicativo é para interagir</p><p>com o usuário. Para isto é importante que o aplicativo possua:</p><p>Layout responsivo: onde a UI se adeque de forma a evitar “truncar” o conteúdo em dispositivos</p><p>específicos ou com diferentes resoluções. Como visto na aula sobre dispositivos internos, existe</p><p>uma grande variedade de tamanhos de telas e resoluções</p><p>Baixa latência de resposta:</p><p>Dados baixados: uma quantidade exagerada de dados e informações pode levar o</p><p>aplicativo a demorar para carregar, tornando a experiência de navegação desagradável.</p><p>Cacheamento: o uso de cacheamento muitas vezes é útil em aplicativos que acessam</p><p>dados da internet. O cacheamento funciona como um tipo de memória temporária, que</p><p>guarda dados de websites, evitando que os dados necessitem ser recarregados em novos</p><p>acessos.</p><p>Ferramentas de Verificação: muito da eficiência do aplicativo está relacionada à qualidade</p><p>do código. Existem ferramentas que são capazes de encontrar códigos com estrutura</p><p>ineficiente que podem afetar a confiabilidade e eficiência, ou ainda melhorar aspectos de</p><p>usabilidade e acessibilidade.</p><p>Lint (conteúdo site developers): o Android Studio oferece uma ferramenta de</p><p>verificação de código chamada lint para ajudar a identificar e corrigir</p><p>problemas com a qualidade estrutural do código.</p><p>TESTES AUTOMATIZADOS</p><p>FUNCIONAL</p><p>Conhecidos com testes de caixa preta,</p><p>testam as funcionalidades do app sem se</p><p>preocupar com o código. Neste tipo de</p><p>teste são fornecidas entradas para</p><p>verificação de uma determinada</p><p>funcionalidade.</p><p>Erros de interface de usuário.</p><p>Erros de inicialização e término.</p><p>Funções incorretas ou ausentes</p><p>DESEMPENHO</p><p>Verificam diversos aspectos relacionados</p><p>ao funcionamento do app, no que se</p><p>refere ao consumo de recursos do</p><p>dispositivo móvel, bem como na sua</p><p>eficiência na realização de tarefas em</p><p>diferentes cenários</p><p>Desempenho em diferentes</p><p>dispositivos.</p><p>Desempenho sob tráfego pesado e</p><p>carga de usuário (verificando o</p><p>desempenho do lado do cliente e do</p><p>servidor).</p><p>Consumo gerado no dispositivo</p><p>móvel (CPU, memória,</p><p>armazenamento).</p><p>INTERRUPÇÃO</p><p>Visam testar o comportamento do app</p><p>quando fatores externos entram em cena,</p><p>durante o funcionamento da aplicação</p><p>Interrupção devido a chamadas ou</p><p>SMS.</p><p>Bateria fraca.</p><p>Pouca memória.</p><p>USABILIDADE</p><p>Visam identificar elementos que possam</p><p>melhorar a usabilidade do app. Muitos</p><p>aspectos podem ser identificados através</p><p>de softwares de teste, como o Lint</p><p>discutido na aula anterior</p><p>Tamanho da área de toque.</p><p>Baixo contraste.</p><p>Marcação de conteúdo para</p><p>acessibilidade (content description).</p><p>INSTALAÇÃO</p><p>Tem por objetivo testar se alguns</p><p>processos ocorrem de forma correta e</p><p>sem dificuldades</p><p>Instalação</p><p>Atualização</p><p>Desinstalação</p><p>Para a validação de um App busca-se cobrir o maior número possível</p><p>de situações, interações e comportamentos. Desta forma, a realização</p><p>de testes de forma manual se torna uma tarefa inviável na maioria dos</p><p>casos para aplicações comerciais</p><p>• Economizar tempo em testes que precisam ser realizados repetidamente</p><p>(e.g. testes de regressão).</p><p>• Realizar testes de carga (simulação de um número elevado de usuários e</p><p>dispositivos simultâneos).</p><p>• Reutilizar o mesmo teste ou scripts que podem ser reaproveitados para</p><p>outros dispositivos ou aplicativos.</p><p>• Elevar a confiabilidade, já que nos testes manuais - sem automação -</p><p>podem ocorrer problemas causados por erro humano.</p><p>Testes automatizados possibilitam:</p><p>E podem ser do tipo:</p><p>Na engenharia de testes de software, existe uma ampla gama de tipos diferentes, com foco em áreas</p><p>distintas e que se complementam, mas do ponto de vista procedimental, eles são divididos em quatro</p><p>etapas principais implementadas em sequência. Inicia-se com o teste de componentes de forma</p><p>individual, como funções ou métodos, classes e objetos, garantindo que estejam retornando o resultado</p><p>esperado. Essa etapa é chamada de teste de unidade ou unitário.</p><p>Na sequência, testa-se o sistema em um aspecto mais amplo, com suas funcionalidades já postas de</p><p>forma integrada, e não mais em unidades indi-viduais (PRESSMAN; MAXIM, 2016). Essa etapa é chamada</p><p>de testes de integração, que podem verificar áreas do sistema ou o sistema como um todo, dependendo</p><p>da sua complexidade. No caso de um sistema inteiro, pode-se chamar de testes e2e. Depois, precisa-se</p><p>validar se os requisitos funcionais, comportamentais e de desempenho foram atingidos na etapa de</p><p>desenvolvimento. Assim, os testes são realizados mais a nível de negócios do que de código e se</p><p>chamam testes de validação ou aceitação.</p><p>Já na última etapa, o teste de sistema engloba todas as variáveis que compõem o sistema em si, como a</p><p>aplicação, o banco de dados, o hardware e, dependendo da fase, os usuários.</p><p>Dentro das práticas de Quality</p><p>Assurance ou Garantia de</p><p>Qualidade (QA), os testes podem</p><p>ser executados manualmente ou</p><p>automatizados. Atualmente o foco</p><p>é nos testes automatizados</p><p>porque:</p><p>SEMANA 3</p><p>Identificar as principais características e diferenças entre aplicativos</p><p>nativos, híbridos, Web apps e PWA;</p><p>Identificar as diferentes plataformas e linguagens utilizadas para o</p><p>desenvolvimento de aplicativos móveis;</p><p>Relembrar as principais estruturas da linguagem em Java;</p><p>Relembrar os conceitos de herança e polimorfismo.</p><p>O Android teve sua versão Alpha lançada em 2008 e é um sistema baseado em Linux, desenvolvido e</p><p>mantido pela Google. Sua licença é de código aberto, embora as decisões sobre o que será</p><p>desenvolvido estejam sob o controle da Google (DEITEL; DEITEL; WALD, 2016). Seu núcleo de</p><p>desenvolvimento é em C, mas também usa C++, PHP e Java.</p><p>Já o iOS é desenvolvido e mantido pela Apple desde sua primeira versão em 2007. É um sistema</p><p>operacional de código fechado, sendo desenvolvido nas linguagens C, C++, Objective-C, Swift e Java.</p><p>I</p><p>D</p><p>E</p><p>Ambientes integrados de desenvolvimentos, ou IDEs são</p><p>softwares que facili-tam o desenvolvimento de sistemas. Eles</p><p>são compostos por editor de código fonte, compilador,</p><p>depurador e outras funcionalidades.</p><p>Android Studio</p><p>Visual Studio Code</p><p>IntelliJ IDEA</p><p>ATOM IDE</p><p>XCode</p><p>Os aplicativos nativos, como o nome diz, são aqueles desenvolvidos utilizando os recursos, o ambiente</p><p>de desenvolvimento e a linguagem determinada pelo fabricante do sistema operacional do dispositivo</p><p>móvel. No desenvolvimento nativo, as aplicações são desenvolvidas pensando espe-cificamente em um</p><p>sistema operacional (VILETE; LOPES, 2018). Aplicações nativas acessam diretamente todos os recursos</p><p>disponíveis no dispositivo.</p><p>os aplicativos nativos têm a vantagem de explorar todos os recursos oferecidos pelo sistema</p><p>operacional do fabricante (APIs) e do dispositivo, podendo atingir um desempenho superior em</p><p>relação às outras abordagens e oferecendo uma experiência diferenciada aos usuários (e.g.</p><p>interfaces mais fluidas, maior velocidade). o desenvolvedor conta com toda a infraestrutura de</p><p>suporte do fabricante tal como: APIs e códigos, além de guias com melhores práticas para</p><p>proporcionar uma boa experiência ao usuário.</p><p>Portabilidade: por ser desenvolvido dentro do “ecossistema” do fabricante, utilizando sua</p><p>linguagem, APIs etc., não é possível portar o código para outra plataforma (Android, iOS). Custo: a</p><p>necessidade de ter um desenvolvimento e as atualizações feitas separadamente para cada</p><p>plataforma encarece o custo do aplicativo para a empresa. Aplicações: se a aplicação demanda</p><p>uma alta qualidade de apresentação de interface ou de desempenho, o desenvolvimento de um</p><p>aplicativo nativo é o mais recomendado.</p><p>Aplicativos híbridos buscam aliar os recursos de navegadores web a alguns recursos nativos do</p><p>aparelho. Na verdade, o aplicativo é executado em um navegador web oculto, sendo que o usuário tem a</p><p>impressão de que se trata de uma aplicativo nativo. No desenvolvimento híbrido, as aplicações são</p><p>desenvolvidas para que funcionem tanto em Android como em iOS. Essas aplicações são executadas em</p><p>um container que utiliza um recurso chamado webview para simular a execução de uma aplicação nativa.</p><p>Webview é um navegador que é execu-tado quando o usuário inicializa uma aplicação híbrida. Neste</p><p>caso, os aplicativos se baseiam em HTML, CSS e Javascript. Comparando com o desenvolvimento nativo, o</p><p>desenvolvimento híbrido tem a possibilidade de ter um único código para executar em ambos os</p><p>sistemas, reduzindo o tempo e o custo com desenvolvimento e manutenção. Por outro lado, abordagens</p><p>híbridas perdem em relação ao desempenho quando com-paradas com abordagens nativas.</p><p>APLICATIVOS WEB</p><p>Multiplataforma: um único código gera executáveis para ambas as plataformas (Android e iOS).</p><p>Tempo de desenvolvimento: o tempo é mais curto, pois só há a necessidade de se escrever um</p><p>código, além disso por não ter de lidar com dois códigos, o tempo gasto em atualizações do</p><p>código é menor.</p><p>Limitações Web: limitações típicas de uma página web acessada por meio do dispositivo, sem</p><p>acesso a alguns recursos nativos do aparelho como renderização de telas. Desempenho inferior a</p><p>apps nativos: por não contar com o acesso a todos os recursos nativos, os aplicativos</p><p>normalmente apresentarão um desempenho e uma interface de usuário (UI) com qualidade</p><p>inferior à um aplicativo nativo. Aplicações: mesmo com os problemas inerentes, muitas empresas</p><p>optam por esta abordagem para aplicações de pequeno e médio porte, devido ao seu menor</p><p>custo e simplicidade.</p><p>Um Web App nada mais é do que um site responsivo se comportando como um aplicativo. Quando o</p><p>servidor de uma determinada empresa, que utiliza Web App, reconhece que o dispositivo que está</p><p>acessando o seu site é um smartphone, ele envia uma versão mobile (um site desenvolvido</p><p>exclusivamente para dispositivos móveis, ou seja, um Web App).</p><p>Aplicações: Por serem mais baratos e fáceis de desenvolver, podem ser uma boa opção quando o</p><p>objetivo é apenas ter presença mobile online. Sua programação pode ser é feita em HTML, CSS e</p><p>Javascript utilizando frameworks. Responsivo: pode ser acessado de qualquer tipo de navegador</p><p>adaptando o tamanho das suas páginas para o tamanho de tela do dispositivo. Não ocupa</p><p>espaço na memória do aparelho: não é preciso fazer download.</p><p>Acesso limitado a recursos do dispositivo: impossibilitando algumas funcionalidades, tais como</p><p>envio de notificações push e renderização de imagem, diminuindo a sua usabilidade e a</p><p>qualidade da interface de usuário. Funcionamento dependente de acesso à web: sem internet,</p><p>sem app!</p><p>PROGRESSIVE WEB APPS (PWA)</p><p>Os PWAs podem ser vistos como uma evolução dos web apps.</p><p>São páginas web que utilizam as últimas tecnologias</p><p>disponíveis. A ideia é, como no caso dos aplicativos híbridos,</p><p>rodar em um site oculto produzindo uma experiência muito</p><p>próxima a de um aplicativo híbrido ou nativo. Algumas das</p><p>novas funcionalidades que estas tecnologias permitem são:</p><p>Push Notification</p><p>Ícone na tela do smartphone</p><p>Acesso à câmera e galerias do dispositivo</p><p>Acesso à geolocalização</p><p>Aplicações: Por serem mais baratos e fáceis de desenvolver, podem ser uma boa opção quando o</p><p>objetivo é apenas</p><p>ter presença mobile online. Sua programação pode ser é feita em HTML, CSS e</p><p>Javascript utilizando frameworks. Responsivo: pode ser acessado de qualquer tipo de navegador</p><p>adaptando o tamanho das suas páginas para o tamanho de tela do dispositivo. Não ocupa</p><p>espaço na memória do aparelho: não é preciso fazer download.</p><p>O navegador Safari da Apple ainda não oferece suporte à algumas das funcionalidades</p><p>encontradas em PWA, como o envio de Push Notification.</p><p>Além do indicado para as WEB APPS:</p><p>JAVA</p><p>mantido pela Oracle, o Java é composto por uma linguagem de programação e uma plataforma</p><p>computacional, que é utilizada como base por muitas aplicações. Está disponível em duas versões: Java</p><p>Runtime Environment (JRE) e Java Development Kit (JDK). O JRE é utilizado na execução das aplicações e o</p><p>JDK, no seu desenvolvimento. Por esse motivo, é necessário instalar o JDK. Java é uma linguagem de</p><p>programação popular, sendo considerada a base para o desenvol-vimento Android. É orientada a</p><p>objetos, o que significa ser baseada na modelagem e comunicação entre os objetos. Java também é uma</p><p>linguagem estaticamente tipada, ou seja, o usuário precisa declarar o tipo de dados que será</p><p>armazenado em cada variável declarada. Por exemplo, se a variável for tipada com “INT”, só será</p><p>permitido guardar números inteiros nessa variável.</p><p>Componentes:</p><p>Classes basicamente são arquivos</p><p>que descrevem “uma receita” para a</p><p>criação de um objeto.</p><p>Variáveis de Instância são os</p><p>atributos necessários para se</p><p>construir um objeto da classe.</p><p>Métodos são os</p><p>comportamentos/ações que o objeto</p><p>possui e é capaz de realizar.</p><p>Os objetos só existem em tempo de</p><p>execução. Materializam uma entidade</p><p>capaz de receber atributos e executar</p><p>tarefas definidas pela sua classe.</p><p>Classes basicamente são arquivos que descrevem “uma</p><p>receita” para a criação de um objeto.</p><p>O arquivo contendo a classe deve ter o mesmo nome da</p><p>classe e a sua sintaxe básica de declaração é</p><p>Modificador de acesso (aplicasse também a variáveis, métodos e construtores:</p><p>public: qualquer membro tem acesso</p><p>protected: somente membros do mesmo pacote têm acesso</p><p>private: somente membros da própria classe têm acesso</p><p>Métodos são os comportamentos/ações que o objeto possui e é capaz de realizar.</p><p>public int meuMetodo( lista de argumentos de entrada)</p><p>{</p><p>-----algum código ----</p><p>return valor (retorna o tipo especificado pelo método)</p><p>}</p><p>public: Modificador de acesso (obs. métodos normalmente</p><p>são public)</p><p>int: Tipo de retorno do método: Pode ser um tipo</p><p>primitivo: byte, char, short, int, long, float,double Pode ser</p><p>um tipo por referência: aponta (referência) para o objeto</p><p>de alguma classe. Pode também não retornar nada: void</p><p>Lista de argumentos de entrada: Lista de variáveis que</p><p>o método recebe como entrada Obs. São variáveis locais e</p><p>só existem dentro do método</p><p>Construtores são métodos que nos permitem inicializar os valores dos atributos (variáveis de</p><p>instância) de um objeto no momento da sua criação. Os construtores recebem o mesmo nome da</p><p>classe, e não possuem tipo de retorno.</p><p>ESTRUTURAS CONDICIONAIS</p><p>ESTRUTURA DE REPETIÇÃO</p><p>Uma vez iniciada a execução de um try, sempre</p><p>executa o trecho de código, independente se houve</p><p>lançamento de exceção ou não.</p><p>Tenta executar um trecho de código, se for lançada exceção</p><p>Interrompe a execução no ponto de lançamento da exceção.</p><p>Se foi lançada uma exceção e ela é a classe</p><p>especificada no catch, ou uma subclasse desta,</p><p>executa o trecho de código do catch</p><p>Obs. Muitas vezes a alocação de recursos é feita no try, e a liberação no finally. Assim, se ocorrer</p><p>lançamento de exceção com interrupção da execução do try há garantia de que os recursos serão</p><p>liberados (e.g. abertura de conexão com banco de dados).</p><p>FORMAS</p><p>FORMATOS BIDIMENSIONAIS FORMATOS TRIDIMENSIONAIS</p><p>Porque ela permite que o código escrito em uma classe possa ser automaticamente aproveitado em</p><p>outras classes.</p><p>Porque novas subclasses poderão trabalhar sobre códigos bem definidos e testados em uma</p><p>superclasse definida anteriormente</p><p>• Porque é uma das maneiras que nos permite trabalhar com polimorfismo.</p><p>HERANÇA</p><p>A ideia de herança está associada à características comuns que os descendentes carregam (herdam)</p><p>porém, possuindo suas próprias características individuais. Similarmente ao que ocorre no mundo real,</p><p>na programação orientada a objetos, uma classe (chamada Superclasse) define características comuns</p><p>(atributos e comportamentos) que serão herdados pelas suas classes filhas (Subclasses).</p><p>Na POO:</p><p>public class Agenda{</p><p>private String nome;</p><p>public Agenda (String nome){</p><p>this.nome = nome ;</p><p>}</p><p>---algum código----</p><p>public String getNome() {</p><p>---algum código----</p><p>return nome;</p><p>}</p><p>public void setNome(String nome) {</p><p>---algum código----</p><p>this.nome = nome;</p><p>}</p><p>}</p><p>CONSTRUTOR</p><p>GET</p><p>SET</p><p>Quando criamos uma subclasse de</p><p>uma super classe em Java, todos os</p><p>seus membros são herdados. Membros</p><p>public e protected estão</p><p>automaticamente acessíveis (variáveis e</p><p>métodos), já os membros private não</p><p>são acessíveis diretamente pela</p><p>subclasse. Assim, variáveis de instância</p><p>que normalmente são private terão</p><p>seus valores acessíveis somente</p><p>através de métodos public get/set</p><p>disponibilizados pela super classe.</p><p>public class Contato extends Agenda {</p><p>private String telefone;</p><p>public Contato ( String nome, String telefone)</p><p>{</p><p>super(nome);</p><p>this.telefone = telefone;</p><p>}</p><p>COMBATENTE</p><p>Artilheiro Infante Cavaleiro</p><p>Obs. Caso o construtor não seja declarado explicitamente através da palavra super, o compilador</p><p>tentará inicializar as variáveis herdadas através do construtor padrão (construtor vazio). Caso a super</p><p>classe tenha um construtor declarado de forma explícita, e não possa ter sua variáveis inicializadas</p><p>com o construtor vazio, será gerado um erro de compilação.</p><p>CONSTRUTOR DA</p><p>SUBCLASSE</p><p>A sintaxe utilizada na linguagem Java para informar que uma classe é uma subclasse de uma dada</p><p>superclasse é através do uso da palavra “extends”. O construtor que inicializa as variáveis de instância</p><p>na superclasse também é herdado, e deve ser declarado explicitamente através da expressão super</p><p>(lista de variáveis de instâncias herdadas) dentro do construtor da subclasse, a menos que a</p><p>superclasse utilize o construtor padrão (construtor vazio).</p><p>POLIMORFISMO</p><p>O polimorfismo possibilita tratar “semelhantes” de uma mesma maneira, permitindo “programar no</p><p>geral”, ao invés de “programar no específico”</p><p>Superclasse</p><p>Inst Var 1</p><p>Inst var 2</p><p>Inst var L</p><p>Method1</p><p>. .</p><p>Method N</p><p>Variável de superclasse</p><p>Combatente soldado3 = new Artilheiro();</p><p>Objeto de subclasse</p><p>INTERFACES</p><p>O uso de interfaces é um outro mecanismo que nos possibilita realizar processamento polimórfico,</p><p>porém sem a necessidade de uma estrutura de hierarquia de herança entre classes. Uma interface é</p><p>basicamente um “contrato” que especifica um conjunto de ações (métodos abstratos) que uma classe</p><p>que implementa a(s) interface(s) terá que possuir, porém sem especificar a maneira como o método será</p><p>executado (métodos abstratos não possuem um corpo de instruções).</p><p>Uma interface pode ainda definir constantes acessiveis aos objetos.</p><p>Obs. Se uma superclasse implementar uma interface, então todas as subclasse obrigatoriamente</p><p>herdam aquela interface, e precisarão implementar os métodos definidos na interface. Obs. Tanto os</p><p>métodos como as constantes de uma interface são sempre públicos.</p><p>Toda declaração de classe que inicia com a palavra-chave public deve ser armazenada em um arquivo</p><p>que tem exatamente o mesmo nome que a classe e terminar com a extensão de nome do arquivo .java.</p><p>A palavra-chave class em uma declaração de classe é imediatamente seguida pelo nome da classe.</p><p>Quando cada objeto de uma classe mantém sua própria cópia de um atributo, o campo que representa</p><p>o atributo também é conhecido como um(a)_variável de instância_.</p><p>A palavra public é um modificador de acesso.</p><p>O tipo de retorno void indica que um método não retornará um valor.</p><p>Um(a) número de ponto flutuante_é um número com um ponto de fração decimal, como 7,33, 0,0975</p><p>ou 1.000,12345.</p><p>Os tipos no Java são divididos</p><p>em duas categorias – tipos_primitivos e de referência.</p><p>Uma variável de tipo primitivo não pode ser utilizada para invocar um método – uma referência a um</p><p>objeto é necessária para que os métodos do objeto possam ser invocados.</p><p>Se nenhuma exceção é lançada em bloco try, onde o controle prossegue quanto o bloco try completa a</p><p>execução? Os blocos catch para essa instrução try são pulados e o programa retoma a execução depois</p><p>do último bloco catch. Se houver um bloco finally, ele será executado primeiro; então o programa</p><p>retomará a execução depois do bloco finally.</p><p>Qual é a razão-chave para utilizar blocos finally? O bloco finally é o meio preferido de liberar recursos</p><p>para impedir vazamentos de recurso.</p><p>SEMANA 4</p><p>Reconhecer os recursos disponíveis no site do Google para o</p><p>desenvolvedor Android;</p><p>Realizar o fluxo geral para criação de projetos no Android Studio;</p><p>Identificar as principais ferramentas e recursos disponíveis no ambiente</p><p>de desenvolvimento do Android Studio;</p><p>Reconhecer os principais elementos de layout e as principais regras</p><p>para construção de layouts de tela;</p><p>Reconhecer as principais funcionalidades do Layout Editor do Android</p><p>Studio.</p><p>os widgets que correspondem aos componentes que normalmente encontramos em uma tela de</p><p>aplicativo, tais como: caixas de texto, botões, barras de progresso, imagens, listas, etc;</p><p>e as classes de layout que são classes que gerenciam a apresentação destes elementos dentro do</p><p>layout</p><p>Para criarmos layouts de tela de um aplicativo na plataforma Android Studio, utilizamos basicamente</p><p>dois tipos de elementos:</p><p>A plataforma Android Studio utiliza a linguagem XML como padrão para a construção de layouts de tela.</p><p>Classe View</p><p>representa o bloco de construção básico para componentes da interface de usuário. Uma</p><p>view ocupa uma área retangular na tela e é responsável pelo desenho e tratamento de</p><p>eventos. View é a classe base para construção de widgets, utilizados para construção de</p><p>componentes de IU interativos.</p><p>Alguns atributos são normalmente utilizados quando estamos manipulando as propriedades de</p><p>componentes dentro de Layouts, ou do próprio Layout. Dois atributos comuns para o dimensionamento</p><p>do layout e de componentes internos ao layout são:</p><p>Controle de altura: android:Layout_height</p><p>Controle de largura: android:layout_width</p><p>Outros atributos comuns: gravtity, layout_weight, hint.</p><p>A subclasse ViewGroup é a classe base para layouts de tela, que são contêineres invisíveis</p><p>que contêm widgets (ou ainda outros layouts internamente) e definem as propriedades do</p><p>layout.</p><p>O SDK da Android é projetado para permitir que se trabalhe com várias versões da plataforma no</p><p>mesmo desenvolvimento. Para manter os downloads pequenos, a versão do SDK pacotes é separada do</p><p>SDK. Isso também permite atualizar para novas versões da Android sem ter que baixar o SDK</p><p>novamente, A maioria dos IDEs no mercado atual utiliza o SDK da Android como base para suas</p><p>aplicações, fornecendo uma ferramenta de criação, gerencia-mento e depuração do projeto com base</p><p>nas funcionalidades fornecidas pelo SDK.</p><p>O Android Studio, na condição de IDE mais indicado pela plataforma para o desenvolvimento de seus</p><p>aplicativos, possui características muitos similares às de outros IDEs, visto que o próprio Android Studio</p><p>é baseado em um IDE desenvolvido para Java (IDE JetBrains Intellij IDEA, conforme mencionado).</p><p>Gradle: ferramenta de automatização do processo de compilação do aplicativo.</p><p>Layout: a interface do IDE permite arrastar componentes para formar o layout do aplicativo e editar o</p><p>código-fonte gerado pela interface. Além disso, permite simular o comportamento do layout criado nos</p><p>diversos tamanhos e formatos de displays encontrados nos dispositivos disponíveis do mercado.</p><p>Renderização dos layouts: função de renderização inteligente de layout na qual os erros de layout são</p><p>identificados e sugestões de solução são disponibilizadas ao desenvolvedor.</p><p>Análise do código: similar a renderização de layouts, a análise de código verifica o código-fonte do</p><p>aplicativo, linha a linha, sugerindo correções ao desenvolvedor.</p><p>Repositórios de versionamento: possui integração com os principais repositórios de versionamento</p><p>do mercado, o que possibilita o trabalho em conjunto entre grandes equipes de desenvolvimento,</p><p>trabalhando simultaneamente em um único projeto.</p><p>Plugins: apesar de ser uma característica muito comum nos IDEs, o suporte de plugins do Android</p><p>Studio é muito potente, visto que até mesmo o emulador nativo do SDK pode ser substituído pelo uso</p><p>de plugins.</p><p>Você sempre deverá utilizar os arquivos e as pastas de resource para armazenar os valores e as</p><p>imagens do seu aplicativo. Dessa forma, além de organizado, será muito mais fácil manter e atualizar o</p><p>seu código com maior facilidade. A pasta “res” é a pasta do projeto que guarda todos os resources da</p><p>aplicação. A pasta “res” deve ser subdividida em várias pastas com propósitos diferentes.</p><p>DESENVOLVIMENTO</p><p>RELATIVE LAYOUT</p><p>A classe android.widget.RelativeLayout permite organizar as views de maneira relativa umas em</p><p>relação as outras ou em relação ao Layout. Sendo que o uso de um dado atributo em relação ao</p><p>Layout geralmente se dá através do uso da condição booleana “true”. (e.g.</p><p>android:Layout_alignParentBotton=“true”). Já para o caso de posição de uma view em relação a outra</p><p>view, é necessario informar o “id” da view em referência. (e.g. android:layout_bellow =“@id/button1”</p><p>O RelativeLayout possibilita que os componentes filhos determinem a sua posição em relação à</p><p>posição do componente pai ou à alguma outra, nesse caso especificada por ID (o seu identificador), ou</p><p>seja, podemos alinhar dois componentes pela borda direita ou posicionar um abaixo do outro,</p><p>centrali-zado na tela, centralizado à esquerda, e assim por diante. Por padrão, todos os componentes</p><p>filhos são desenhados no canto superior esquerdo do leiaute, portanto você deverá definir o</p><p>posicionamento de cada componente usando as diversas propriedades de leiaute disponíveis</p><p>Linear Layout: Um dos tipos de leiaute mais utilizados quando desenvolvemos aplicativos para o</p><p>Android, possibilita que os componentes sejam organizados tanto em posição vertical quanto</p><p>horizontal, alinhando todos os componentes em uma única direção, conforme especificado.</p><p>Todos os componentes de um LinearLayout (Figura 3) são colocados um após o outro; logo, uma lista</p><p>vertical terá somente um componente por linha, independentemente da dimensão de sua largura, e</p><p>uma lista horizon-tal terá a altura de apenas uma linha (a altura do componente mais alto). O</p><p>LinearLayout respeita as margens entre os componentes e o seu ali-nhamento (direita, centro ou</p><p>esquerda).</p><p>LINEAR LAYOUT</p><p>permite criar layouts grandes e complexos. É semelhante a RelativeLayout, onde os elementos são</p><p>dispostos de acordo com as posições relativas entre wigets e o layout, mas é mais flexível que o</p><p>RelativeLayoute e relativamente fácil de usar através do uso do Editor de Layout do Android Studio.</p><p>O ConstraintLayout possibilita criar leiautes complexos com uma hierar-quia de visualização simples,</p><p>sem o uso de grupos aninhados, e se assemelha ao RelativeLayout, pois os componentes são exibidos</p><p>de acordo com os relacionamentos entre os componentes e o leiaute parent. Permite, ainda, alinhar</p><p>componentes baseados em regras.</p><p>CONSTRAINT LAYOUT</p><p>gerencia a disposição dos componentes de uma janela através de uma disposição que agrupa as</p><p>exibições em linhas e colunas. Esse tipo de layout é bastante utilizado na criação de telas de login e</p><p>formulários. O TableLayout é um ViewGroup que agrupa exibições em linhas e</p><p>colunas, que constitui uma especificação do LinearLayout que organiza seus filhos (views) de modo</p><p>tabular.</p><p>TABLE LAYOUT</p><p>SEMANA 5</p><p>Compreender a classe Activity para criação de telas e o ciclo de vida de</p><p>uma Activity;</p><p>Compreender a classe Intent e a sua utilização para criar solicitações de</p><p>ações ao S.O.;</p><p>Compreender o código utilizado para a construção do app com duas</p><p>telas utilizando os conceitos de Activity e Intent;</p><p>Verificar o funcionamento</p><p>da primeira parte do app utilizando o AVD.</p><p>INTENT é um objeto de mensagem que pode ser usado para solicitar uma ação para outro</p><p>componente. Possui quatro componentes:</p><p>ACTIVITY1.</p><p>TELA</p><p>É uma classe filha da classe android.app.Activity ou alguma subclasse desta. Representa uma tela da</p><p>aplicação e é responsável por tratar os eventos gerados nessa tela, como por exemplo, quando o usuário</p><p>pressiona um botão ou quando um item de menu é escolhido. Toda Activity deve obrigatoriamente estar</p><p>declarada no arquivo AndroidManifest.xml</p><p>Uma Activity representa uma única tela em um aplicativo. É possível iniciar uma nova instância de uma</p><p>Activity passando um Intent para startActivity(). O Intent referencia a Activity para iniciar e carrega todos</p><p>os dados necessários. Uma Activity representa uma única tela em um aplicativo. É possível iniciar uma</p><p>nova instância de uma Activity passando um Intent para startActivity(). O Intent referencia a Activity para</p><p>iniciar e carrega todos os dados necessários.</p><p>Durante o ciclo de vida da Activity, a classe fornece</p><p>métodos que são evocados pelo sistema (callbacks), à</p><p>medida que ela passa pelos diferentes estados, desde</p><p>a sua criação até a sua destruição.</p><p>2. SERVICES</p><p>3. BROADCAST RECEIVERS</p><p>4. CONTENT PROVIDERS</p><p>O Service é um componente que realiza operações em segundo plano sem interface do usuário. É</p><p>possível iniciar um serviço para realizar uma operação que acontece uma vez (como fazer o download de</p><p>um arquivo) passando um Intent a startService().</p><p>são componentes do Android que permitem que você registre eventos do sistema ou do</p><p>aplicativo. Eles são notificados pelo sistema Android quando um evento ocorre, como a</p><p>bateria estar baixa, a tela estar desligada ou uma imagem ter sido capturada</p><p>são componentes do Android que permitem que você gerencie o acesso aos dados</p><p>armazenados pelo seu aplicativo ou por outros aplicativos e fornece uma forma de</p><p>compartilhar dados com outros aplicativos. Eles encapsulam os dados e fornecem</p><p>mecanismos para definir a segurança dos dados. Content providers são a interface padrão</p><p>que conecta dados em um processo com código executado em outro processo</p><p>Transmissão é uma mensagem que qualquer aplicativo pode receber. O sistema fornece diversas transmissões para eventos</p><p>do sistema, como quando o sistema inicializa ou o dispositivo inicia o carregamento. Você pode fornecer uma transmissão a</p><p>outros aplicativos passando um Intent ao sendBroadcast() ou ao sendOrderedBroadcast()</p><p>Os intents podem ser do tipo:</p><p>Explícito: especificam qual aplicativo atenderá ao intent, fornecendo o nome do pacote do aplicativo de destino ou</p><p>o nome de um componente totalmente qualificado. Normalmente, usa-se um intent explícito para iniciar</p><p>um componente no próprio aplicativo porque se sabe o nome de classe ou do serviço que se quer iniciar.</p><p>Por exemplo, iniciar uma nova Activity em resposta a uma ação do usuário ou iniciar um serviço para</p><p>fazer o download de um arquivo em segundo plano.</p><p>Implícito: não nomeiam nenhum componente específico, mas declaram uma ação geral a realizar, o que permite</p><p>que um componente de outro aplicativo a processe. Por exemplo, se você quiser exibir ao usuário uma</p><p>localização em um mapa, pode usar um intent implícito para solicitar que outro aplicativo capaz exiba</p><p>uma localização especificada no mapa. Ao criar um intent implícito, o sistema Android encontra o</p><p>componente adequado para iniciar, comparando o conteúdo do intent aos filtros de intents declarados</p><p>no AndroidManifest de outros aplicativos no dispositivo. Se o intent corresponder a um filtro de intents, o</p><p>sistema iniciará esse componente e entregará o objeto Intent. Se diversos filtros de intents</p><p>corresponderem, o sistema exibirá uma caixa de diálogo para que o usuário selecione o aplicativo que</p><p>deseja usar. Para receber um intent implícito: intents para cada um dos componentes do aplicativo com</p><p>um elemento no arquivo AndroidManifest. Cada filtro de intents especifica o tipo de intent aceito com</p><p>base na ação, nos dados e na categoria do intent. O sistema fornecerá um intent implícito ao</p><p>componente do seu aplicativo somente se ele puder passar por um dos filtros de intents. Cada filtro de</p><p>intents é definido por um elemento no arquivo AndroidManifest do aplicativo, aninhado no componente</p><p>correspondente do aplicativo (como por exemplo uma Activity ). Dentro de , é possível especificar o tipo</p><p>de intents aceitos usando um ou mais dos elementos a seguir:</p><p>ACTION_VIEW</p><p>Use essa ação em um intent com startActivity() quando houver</p><p>informações de que uma Activity possa ser exibida ao usuário,</p><p>como uma foto para exibição em um aplicativo de galeria ou um</p><p>endereço para exibição em um aplicativo de mapa.</p><p>ACTION_SEND</p><p>Também conhecida como o intent de share, deve ser usada em um</p><p>intent com startActivity() quando houver alguns dados que o</p><p>usuário possa compartilhar por meio de outro aplicativo, como um</p><p>app de e-mails ou de compartilhamento social</p><p>Dados</p><p>É o URI (um objeto Uri) que referencia os dados. O tipo dos dados fornecidos geralmente é determinado pela ação do</p><p>intent. Por exemplo, se a ação for ACTION_EDIT, os dados deverão conter o URI do documento a editar.</p><p>Extras</p><p>São pares de chave-valor que carregam informações adicionais necessárias para realizar a ação solicitada. Assim</p><p>como algumas ações usam determinados tipos de URIs de dados, outras também usam determinados extras. É</p><p>possível adicionar dados extras com diversos métodos putExtra(), cada um aceitando dois parâmetros: o nome</p><p>principal e o valor. Também é possível criar um objeto Bundle com todos os dados extras e, em seguida, inserir o</p><p>Bundle no elemento Intent com putExtras().</p><p>CRIAÇÃO DE UMA INTENT:</p><p>As informações principais contidas em um Intent são as seguintes:</p><p>O nome do componente a iniciar.</p><p>É opcional, mas é a informação fundamental que torna um intent explícito, o que significa que o intent deve ser</p><p>entregue somente ao componente do aplicativo definido pelo nome do componente.</p><p>Sem nome de componente, o intent será implícito, e o sistema decidirá qual componente deve receber o intent com</p><p>base nas outras informações contidas no intent (como a ação).</p><p>Ação - String que especifica a ação genérica a realizar (como exibir ou selecionar).</p><p>É possível especificar as ações nos intents para serem realizadas por componente do próprio aplicativo (ou para uso</p><p>de outros aplicativos para chamar componentes dentro do seu aplicativo), mas normalmente são usadas constantes</p><p>de ação já predefinidas pela própria classe Intent ou por outras classes de biblioteca. Exemplos:</p><p>RECURSOS E A CLASSE R JAVA</p><p>A classe R é responsável por fazer a ligação entre o arquivo XML, localizado no diretório res, e o código</p><p>da aplicação. Essa classe é gerada automatica-mente pelo plugin da AAPT, no momento em que o build é</p><p>executado. Nunca deveremos realizar alterações diretamente nessa classe: a classe R é gerada</p><p>automaticamente pelo plugin da AAPT e somente a AAPT pode realizar alterações nessa classe. A classe R</p><p>representa os recursos do projeto Android, que correspondem a todos os conteúdos da pasta res.</p><p>Quando o aplicativo for compilado, conforme citado, a AAPT irá gerar a</p><p>classe R sem que exista a necessidade de interferência. Essa classe contém um código que permite</p><p>acesso a todos os recursos disponíveis no diretório res. Para cada tipo de recurso há uma subclasse R</p><p>(por exemplo, R.drawable para todos os recursos drawable) e, para cada recurso daquele tipo, há um</p><p>número inteiro estático (por exemplo, R.drawable.icon). Esse número inteiro é o ID do recurso e pode ser</p><p>usado para recuperá-lo.</p><p>No código, usando o respectivo identificador inteiro estático, provido pela classe R, assim</p><p>R.layout.activity _ about.</p><p>Em um arquivo XML, usando uma sintaxe especial (@ tipo/nome) e o ID provido pela classe R, assim:</p><p>@string/ list _ item _ textview _ title _ default.</p><p>Acesso aos recursos:</p><p>Devemos utilizar o ID de cada recurso, e todos estes IDs são definidos em sua respectiva classe R, gerada</p><p>automaticamente pela IDE. Quando a aplicação é compilada,</p><p>a IDE gera a classe R para os resources,</p><p>que estão na pasta res, e as subclasses, para os tipos de resource. Para isto, basta sabermos que um ID</p><p>é sempre composto pelo tipo e pelo nome do resource (sem extensão). Desse modo, há duas formas de</p><p>acesso:</p><p>Para demonstrar a utilização da classe R e referenciar o uso de recursos, vamos utilizar os arquivos de</p><p>cores, que são arquivos utilizados para definir todas as cores em um aplicativo. As cores devem ser</p><p>definidas em res/values/colors.xml e o arquivo XML deverá ser parecido com o exemplo abaixo:</p><p>PARA ACESSO</p><p>THREAD</p><p>AsyncTask</p><p>SEMANA 6</p><p>reconhecer a classe AsyncTask, seus métodos e parâmetros para a sua</p><p>utilização na criação de uma thread paralela;</p><p>reconhecer a classe HttpURLConnection, seus principais métodos e a</p><p>sua utilização para realização de acesso à internet;</p><p>compreender o código utilizado para fazer download de conteúdo XML</p><p>de um site;</p><p>reconhecer a interface XmlPullParser e seus principais métodos para</p><p>análise e extração de informações de conteúdo XML;</p><p>compreender a codificação da segunda parte do aplicativo que agrega a</p><p>funcionalidade de acesso à internet e tratamento de conteúdo XML;</p><p>acompanhar a verificação do funcionamento da segunda parte do APP</p><p>utilizando o Android Virtual Device (AVD).</p><p>Por padrão, todos os componentes do mesmo aplicativo são executados na mesma thread ou linha de</p><p>execução (chamada de thread "principal"). Se um componente de aplicativo for iniciado e já existir um</p><p>processo para esse aplicativo, o componente usará a mesma thread para execução. No entanto, você</p><p>pode criar threads adicionais (linhas de execução de worker) para qualquer processo.</p><p>É recomendável criar uma nova thread quando haverá uso de recursos externos ao aplicativo porque</p><p>essa consulta pode demorar e, como a execução da UI é realizada na thread principal do aplicativo, a tela</p><p>poderá ficar travada até a consulta terminar</p><p>permite a criação de uma thread secundária (paralela) para realizar um processamento</p><p>em segundo plano. Métodos disponíveis:</p><p>Pode ser utilizado para exibir uma barra de progresso, ou uma mensagem de</p><p>“aguarde”.</p><p>onPreExecute():</p><p>Executado na thread da interface de usuário antes que a tarefa em segundo plano</p><p>seja executada.</p><p>Responsável por realizar a parte pesada do processamento. Este método pode</p><p>retornar um objeto qualquer, que pode ser passado como parâmetro para o</p><p>método onPostExecute().doInBackground():</p><p>Método executado na thread secundária em background imediatamente após a</p><p>execução do método onPreExecute().</p><p>O resultado do processamento em background é passado para este método como</p><p>parâmetro.</p><p>onPostExecute():</p><p>Método executado na thread da interface de usuário</p><p>Ele é usado para exibir qualquer forma de progresso na interface do usuário</p><p>enquanto o processamento em segundo plano ainda está em execução (o</p><p>progresso é informado em background dentro do método doInBackground()</p><p>através da chamada do método publishProgress())</p><p>onProgressUpdate():</p><p>: Método executado na thread da interface de usuário.</p><p>HttpURLConnection</p><p>Params: consiste na lista de argumentos que são passados para a execução da tarefa (poderia por</p><p>exemplo ser um URL de um site a ser acessado, ou ainda uma lista de URLs). Esses argumentos são</p><p>passados através do método execute (params…) ao executar o AsyncTask. (Obs. Params é repassado</p><p>internamente como entrada para o método doInBackground (Params… params) )</p><p>Progress: pode ser utililizado para receber um valor inteiro (Integer), que representa o progresso da</p><p>execução da tarefa. Pode, por exemplo, ser utilizado para notificar o progresso da operação ao</p><p>usuário através de uma barra de progresso. (Obs. O Progress é repassado internamente para o</p><p>método onProgressUpDate (Progress… progress) pelo método publishProgress())</p><p>Result: é o retorno do método doInBackground() interno a AsyncTask, que executa a tarefa na</p><p>thread secundária. Esse retorno é repassado como entrada para o método onPostExecute (Result</p><p>result), caso este seja utilizado. Poderia, por exemplo, ser o conteúdo baixado de um site.</p><p>Para criar uma tarefa é preciso criar uma subclasse da AsyncTask e informar o tipo de três argumentos</p><p>genéricos <Params, Progress, Result> (generics):</p><p>Assim, na criação de um AsyncTask que recebesse um tipo URL, utiliza-se um tipo inteiro para exibição</p><p>de uma barra de progressos, e retornasse um tipo String de conteúdo de um site, teríamos:</p><p>pode ser usada para enviar e receber dados pela internet. Esta classe pode ser</p><p>usada para enviar e receber dados de streaming cujo comprimento não é</p><p>conhecido antecipadamente.</p><p>Abrir uma conexão evocando o método openConnection().</p><p>URL myUrl = new URL("https://www.w3schools.com/xml/note.xml");</p><p>HttpURLConnection myconnection = (HttpURLConnection)</p><p>myUrl.openConnection();</p><p>my_connection.setReadTimeout(10000);</p><p>Define o tempo máximo em milissegundos para</p><p>aguardar a conclusão de um download antes de</p><p>abortar a conexão.</p><p>my_connection.setConnectTimeout(15000); Define o tempo máximo em milissegundos para</p><p>aguardar o estabelecimento da conexão.</p><p>my_connection.setRequestMethod(String);</p><p>Define o comando de solicitação que será enviado</p><p>ao servidor HTTP remoto. O default é “GET” para</p><p>download. (os outros comandos aceitos são POST,</p><p>HEAD, OPTIONS, PUT, DELETE e TRACE)</p><p>int response = my_connection.getResponseCode();</p><p>Retorna o código de resposta retornado pelo</p><p>servidor HTTP remoto. (Obs. O código retornado</p><p>quando a conexão é bem sucedida é “200”)</p><p>A janela Logcat no Android Studio exibe mensagens do sistema e permite que você exiba</p><p>mensagens em tempo real durante o funcionamento do aplicativo no emulador através</p><p>do uso da classe Log. No exemplo abaixo, o trecho de código permite visualizar o retorno</p><p>do servidor através do Logcat.</p><p>Interface XmlPullParser</p><p>Obter o conteúdo a ser baixado utilizando o metódo getInputStream(), que retorna</p><p>um stream de bytes com o conteúdo de interesse.</p><p>InputStream data = myconnection.getInputStream();</p><p>Exemplo de parâmetros possíveis:</p><p>LOGCAT</p><p>oferece um conjunto de métodos que permitem analisar e extrair conteúdos</p><p>XML de forma eficiente no Android.</p><p>A primeira etapa na análise de um conteúdo XML é decidir quais os campos do seu interesse. O</p><p>analisador irá então extrair dados desses campos e ignorar o restante do documento.</p><p>Durante a leitura do conteúdo XML pelo analisador, o método next() permite avançar o</p><p>analisador evento a evento dentro do conteúdo XML, e o método getEventType() é capaz de</p><p>determinar qual foi o evento encontrado. Eventos possíveis:</p><p>Uma vez que uma START_TAG foi encontrada, é possível então determinar qual o nome da tag</p><p>correspondente ao campo através do método getName(). Assim, podemos procurar por uma tag</p><p>específica iniciando um campo com um conteúdo de interesse dentro do XML. Exemplo:</p><p>Uma vez encontrada da tag de interesse, o</p><p>próximo passo é encontrar um evento TEXT</p><p>sinalizando que existe um conteúdo de</p><p>texto, e então utilizar o método getText()</p><p>para obter o conteúdo de texto. Assim,</p><p>através de um laço while por exemplo,</p><p>podemos varrer o conteúdo XML tag a tag</p><p>buscando as tags de interesse e</p><p>armazenando seus conteúdos dos campos</p><p>de interesse.</p><p>ANR Uma execução convencional de uma Activity que gaste mais de 5 seg para retornar irá</p><p>disparar um ANR.</p><p>Geralmente, o sistema exibe uma mensagem de ANR quando o aplicativo não responde à entrada do</p><p>usuário.</p><p>Em qualquer situação em que seu app executar uma operação possivelmente demorada, não realize o</p><p>trabalho na linha de execução de UI. Em vez disso, crie uma linha de execução de trabalho e realize a</p><p>maioria das operações nela. Isso mantém a linha de execução de UI (que aciona o loop de eventos da</p><p>interface do usuário) em execução e evita que o sistema conclua que o código congelou. Como essas</p><p>linhas de execução geralmente são feitas no nível da classe, você pode pensar na capacidade de</p><p>resposta como um problema de classe. Por exemplo e em particular, as activities devem fazer o mínimo</p><p>possível para configurar os métodos do ciclo de vida, como onCreate() e onResume(). Operações</p><p>possivelmente longas,</p><p>como as de rede ou banco de dados, ou cálculos computacionalmente caros, como o</p><p>redimensionamento de bitmaps, devem ser feitos em uma linha de execução de secundária. Para isso, pode-</p><p>se utilizar a AsyncTask. Basta estender AsyncTask e implementar o método doInBackground() para</p><p>realizar o trabalho.</p><p>SEMANA 7</p><p>compreender as principais estruturas da API Android para SQLite;</p><p>compreender a sintaxe dos principais métodos utilizados para criação e</p><p>manipulação de banco de dados;</p><p>compreender o código para criação de um banco de dados dentro do</p><p>aplicativo;</p><p>compreender e verificar o funcionamento da terceira parte do APP,</p><p>quanto a persistência de dados utilizando o Android Virtual Device</p><p>(AVD).</p><p>BANCO DE DADOS</p><p>Basicamente, a criação de um Banco de Dados no Android pode ser feita de três formas:</p><p>Através do uso de ferramentas externas auxiliares (e.g. SQLite Expert Personal, SQLite Manager).</p><p>Utilizando o console (terminal) do AndroidStudio, através do aplicativo sqlite3 (programa que</p><p>permite gerenciar bancos de dados SQLite criados por aplicativos Android através de linha de</p><p>comando).</p><p>Utilizando a API Android para o SQLite (android.database.sqlite): Contém as classes, interfaces e</p><p>métodos que uma aplicação pode utilizar para o gerenciamento do seu banco de dados.</p><p>Dentro do sistema de arquivos do Android, quando um banco de dados é criado, ele é armazenado</p><p>internamente no sistema de arquivos do dispositivo no caminho:</p><p>/data/data/pacote.do.aplicativo/databases/</p><p>Um banco de dados é visível somente</p><p>pela aplicação que o criou</p><p>STATEMENT: (declaração): É basicamente qualquer texto utilizado para enviar comandos</p><p>para o banco de dados.</p><p>QUERY: Método normalmente utilizado para retornar uma lista de valores de dados de uma</p><p>tabela na forma de um cursor.</p><p>CURSOR: pode ser visto como o objeto que contém o vetor de valores retornado por uma</p><p>query. O cursor retorna um objeto que possui vários métodos que nos permitem manipular</p><p>o vetor retornado em referência a uma dada estrutura de dados consultada.</p><p>Criação de um Banco de Dados utilizando a API:</p><p>Em Java, para que uma classe possa criar ou abrir um banco de dados, ela deve</p><p>ser filha da classe SQLiteOpenHelper.</p><p>public class MeuBancoDeDados extends SQLiteOpenHelper{ ….. }</p><p>public MeuBancoDeDados(Context context){</p><p>Super(context, NOME_BANCO, null, VERSAO_BANCO);</p><p>A classe SQLiteOpenHelper possui ainda dois métodos abstratos que precisam ser implementados de</p><p>forma concreta:</p><p>Método onCreate(SQLiteDatabase db): Método chamado quando o banco de dados é criado</p><p>pela primeira vez. É dentro deste método que é realizada a criação das tabelas (normalmente</p><p>utilizando o método execSQL() e um statement).</p><p>O primeiro campo normalmente tem o nome _ID e a instrução " INTEGER PRIMARY KEY AUTOINCREMENT,“ , transformando</p><p>o campo em um campo de autoincremento, ou seja, à medida que itens vão sendo incluídos esse campo é</p><p>automaticamente incrementado.</p><p>1.</p><p>BANCO DE DADOS</p><p>INTERAÇÃO</p><p>Método onUpgrade(SQLiteDatabase db int oldVersion, in newVersion): Nesse método é</p><p>possível executar algum script com a finalidade de atualizar a versão do banco de dados. Por</p><p>exemplo, deletando, criando ou alterando dados e tabelas.</p><p>getWritableDatabase(): Esse método retorna um objeto do tipo SQLiteDatabase, que representa</p><p>a conexão com o banco de dados. Com a utilização desse objeto dentro de um método definido</p><p>pelo desenvolvedor é então possível fazer diversas manipulações. Uma vez finalizadas as</p><p>manipulações, fecha-se então a conexão com o banco de dados através do método close()</p><p>insert:</p><p>Para inserir um novo registro no banco de dados, é necessária a criação de um objeto do tipo</p><p>android.content.ContentValues, que possui uma estrutura de chave e valor.</p><p>//valor.put(“chave” (Nome da coluna), valor do campo)</p><p>//db.insert(“nome da tabela”,opcional (normalmente ”null”), variável ContentValues valor);</p><p>ContentValues valores = new ContentValues();</p><p>valores.put(“Name”,”Paul”);</p><p>valores.put((“Phone”,7990002);</p><p>valores.put(“Room”, 18);</p><p>db.insert(“hospedes”, null, valores);</p><p>update:</p><p>A atualização de registros já existentes em uma tabela é realizada através do uso do método</p><p>update(“nome da tabela”, contentValues, where, whereArgs[ ]).</p><p>where: Contém a identificação do registro na tabela na qual a atualização de algum valor será</p><p>realizada, (e.g. “_id=3”). Nesse caso, whereArgs[ ] será declarado como null. No entanto, se a</p><p>posição for passada pelo argumento whereArgs, então nesse campo ficará apenas a string “_id=?”</p><p>whereArgs[ ]: Array de strings com os parâmetros necessários para a identificação da posição do</p><p>registro, (e.g. newString[]{String.valueOf(id)} ). O símbolo “?” no campo “where”, será substituído por</p><p>essa informação</p><p>moveToFirst() Posiciona o cursor para leitura no primeiro registro</p><p>moveToNext() Posiciona o cursor para leitura do próximo registro.</p><p>moveToPositon(pos) Posiciona o cursor no local especificado</p><p>delete:</p><p>Para apagar um registro da tabela utilizamos o método delete (“nome da tabela”, where, whereArgs[]);</p><p>db.delete (“hospedes”, “Room=32”, null);</p><p>in room =32;</p><p>query:</p><p>Para consultar os registros de uma tabela no banco de dados utilizamos o método query(), que</p><p>retorna um objeto da classe android.database.Cursor, que contém os campos/registros</p><p>especificados na sua lista de argumentos.</p><p>db.delete (“hospedes”, “_id=?”, String[]{String.valueOf(room)});</p><p>Sintaxe:</p><p>query(</p><p>table name: “nome da Tabela”,</p><p>columns: String[] {nome das colunas de interesse},</p><p>where :String[]{Nome e valor dos registros de interesse, ou =?},</p><p>whereArgs :String[] {valor dos registros de interesse},</p><p>groupBy: String[] {nome das colunas para agrupar} => normalmente “null”</p><p>orderBy: String[]{ nome das colunas para ordenar} ) => normalmente “null”</p><p>Cursor c = db.query(</p><p>table name: “hospedes”,</p><p>columns: new String[]{ “Name”,”Phone”},</p><p>where: ”Room=?” ,</p><p>whereArgs: new String[]{String.valueOf{101},</p><p>groupBy: null,</p><p>filter: null,</p><p>orderTy: null);</p><p>irá retornar um cursor que possui os valores do</p><p>nome e do telefone do hóspede do quarto 101.</p><p>Exemplo de métodos do objeto Cursor:</p><p>moveToLast () Posiciona o cursor no último registro.</p><p>getColumnIndex() Retorna o índice da coluna para o nome da coluna informado.</p><p>g(getColumnIndex(“nomeDa</p><p>Coluna”);) •</p><p>getString(i)/getInt(i)/getFloa</p><p>t</p><p>o cursor em um registro da tabela através de algum dos métodos</p><p>vistos anteriormente e através desse método consegue-se ler o</p><p>conteúdo da coluna de interesse)</p><p>A persistência de dados consiste basicamente em armazenar dados gerados pelo aplicativo — em</p><p>memória secundária — que sejam ou que possam ser necessários no futuro, ou seja, a persistência</p><p>dos dados refere-se à capacidade de armazenar dados (de qualquer tipo) na memória secundária</p><p>do dispositivo, para futura utilização pelo aplicativo.</p><p>SQLite: Ele é totalmente escrito na linguagem C, a mesma linguagem na qual se desenvolve a</p><p>plataforma Android, tornando-se um dos principais motivos de seu suporte nativo.</p><p>é totalmente suportado pelas principais versões do Android; qualquer banco de dados poderá ser</p><p>acessado por seu nome a partir de qualquer classe da aplicação, mas não poderá ser acessado fora</p><p>dela;</p><p>trata-se de uma biblioteca open source implementada na linguagem C, um banco de dados</p><p>embutido sem servidor e que realiza os procedi-mentos de leitura e escrita diretamente no arquivo;</p><p>sua utilização não requer qualquer tipo de configuração ou processo administrativo — você</p><p>somente precisará definir os comandos SQL para criar e atualizar o banco de dados. O SQLite é</p><p>gerenciado auto-maticamente pela plataforma Android.</p><p>Por indicação da própria Google, para criar um novo banco de dados deve-se utilizar a subclasse</p><p>SQLiteOpenHelper e modificar seu método onCre-ate(), a partir do qual é possível executar o</p><p>comando SQLite que criará as tabelas no banco de dados. O SQLite também possibilita a consulta</p><p>de dados, para o qual se deve utilizar os métodos query() do SQLiteDatabase, que, por sua vez, acei-</p><p>tam diversos parâmetros de consulta, como tabela a ser consultada, projeção, seleção,</p><p>agrupamentos, etc.</p><p>Todas as consultas do SQLite retornam um cursor, que aponta para as linhas que foram retornadas</p><p>pela consulta. Esse cursor constituirá o mecanismo que você deverá utilizar para navegar pelos</p><p>resultados gerados pela consulta dos dados, ou seja, será utilizado para ler as linhas e colunas.</p><p>Para que consiga realizar ope-rações de gravação e leitura no banco de dados, invoque,</p><p>respectivamente, os métodos getWritableDatabase() e getReadableDatabase(), os quais retornarão</p><p>um objeto SQLiteDatabase, que representa o banco de dados e fornece os métodos para as</p><p>operações do SQLite.</p>