Escolar Documentos
Profissional Documentos
Cultura Documentos
DISPOSITIVOS MÓVEIS
CAPÍTULO 1 – VAMOS CRIAR UM
APLICATIVO MÓVEL?
Evandro de Souza Lima Rocha
INICIAR
Introdução
Os dispositivos móveis estão presentes na vida pessoal e profissional das pessoas,
mas você consegue mensurar isso? Segundo uma pesquisa do IBGE (2016), o uso de
dispositivos móveis, para navegar na internet, já é maior que o de computador
pessoal (PC). Em cerca de 97% dos domicílios com acesso à internet, o smartphone
(dispositivo móvel mais popular) é utilizado. E cerca de 92,4% dos habitantes que
acessam a internet no Brasil (116 milhões de habitantes), utilizaram aplicativos
móveis.
A grande procura por aplicações móveis ocorre devido à crescente necessidade que
as pessoas têm, de coleta e acesso às informações de forma rápida, correta,
intuitiva e segura, a qualquer momento e em qualquer localização, o que torna cada
vez mais importante a criação de aplicativos. É por isso que o desenvolvimento de
aplicativos móveis é uma promissora habilidade para despontar no mercado de
trabalho.
Considerando a importância dessas aplicações na vida das pessoas, como começo
a desenvolver aplicativos móveis?
Neste capítulo, vamos compreender o universo da computação móvel e começar a
desenvolver aplicativos. Para isso, vamos identificar e analisar os principais
dispositivos, plataformas de so ware, ferramentas, padrões, técnicas e métodos
voltados para a computação móvel, presentes no mercado. Assim, este
conhecimento é utilizado para a construção e entendimento de nossa primeira
aplicação.
Vamos entender como funciona o desenvolvimento de aplicações móveis e criar um
aplicativo? Bons estudos!
Android
Segundo o Google (2018), a plataforma Android é uma pilha de so wares baseada no
sistema operacional Linux, de código-fonte aberto, e foco em atender dispositivos
móveis. A versão mais recente deste sistema, em 2019, é a 8.1 (Oreo). As versões
ativas do Android em dispositivos móveis podem ser vistas na figura abaixo.
Figura 3 - Fragmentação de
versões da plataforma iOS. Fonte: Owen (2018, [s./d.]).
Quais são os elementos envolvidos num projeto de aplicativo? Lee et al. (2005)
apresenta múltiplos fatores que devem ser analisados num projeto de aplicativo,
representados na arquitetura de solução móvel apresentada na figura abaixo.
Figura 4 - Arquitetura de solução móvel. Fonte: LEE et al. (2005, p. 7).
Estes fatores definidos por Lee et al. (2005), têm as seguintes funções:
Esta arquitetura nos mostra uma visão geral da solução móvel completa, que
envolve mais que apenas o projeto do aplicativo móvel (apenas a solução cliente),
como segurança e conexão com servidores back-end, por exemplo. Porém, nesta
seção vamos focar apenas no projeto de interface de usuário de cliente móvel.
Mockup
Um mockup é um diagrama estático que representa fielmente o design de
aplicativo. Diferente do wireframe, um mockup é um modelo bem próximo do
design final do produto, ou até o próprio design visual do produto. Já neste modelo,
há uma preocupação bem maior com elementos estéticos, como cores, fontes e
contraste, que não acontece nos modelos de wireframe.
Figura 6 - Mockup de um aplicativo. Fonte: FONTÃO et al. (2012).
Os mockups (exemplo na figura acima) são muito utilizados com a função de vender
uma ideia de um produto antes de ele estar pronto para um público estratégico
(possíveis clientes, por exemplo).
Enfim, um projeto de um aplicativo cliente móvel pode ser construído seguindo as
seguintes diretrizes:
CASO
Vamos compreender, na prática, como desenvolver a partir do Android Studio.
Primeiro, faça o download do Android Studio, que pode ser realizado no endereço:
<https://developer.android.com/studio/install
(https://developer.android.com/studio/install)>. A instalação é simples e rápida,
mas caso tenha alguma dúvida, pode seguir o manual de instalação do Android na
página <https://developer.android.com/studio/install
(https://developer.android.com/studio/install)>.
Ao instalar o Android Studio, por padrão, já é instalado o kit de desenvolvimento (SDK)
mais atual e as ferramentas básicas (bibliotecas Android, emuladores, ferramentas de
debug), para a criação de uma aplicação móvel.
Agora, você está pronto para criar um projeto no Android Studio, utilizando as opções.
“File”/”New Project” (Arquivo/Novo projeto). Acompanhe o texto para saber o passo a
passo.
#PraCegoVer: print da tela da próxima GUI com o nome de Target Android Devices,
abaixo: Select the form factors and minimum SDK, Some devices require assitional
SDKs. Low API levels target more devices, but offer fewer API features. Abaixo os
campos para preenchimento: Phone and Tablet: API 15: referente ao Android 4.0.3
(IceCreamSandwich), Wear: API 21: Android 5.0 (Lollipop), TV: API 21: Android 5.0
(Lollipop) e Android Things: API 24: Android 7.0 (Nougat).
A opção de criar o aplicativo como instant app deve estar desmarcada. O conceito
de instant app é compatível com versões superiores a 4.2 (API 17) e possibilita que
aplicativos nativos sejam executados em dispositivos móveis sem que estejam
instalados. Esta arquitetura de aplicativos é mais avançada e não será abordada,
por enquanto. Como o foco do nosso projeto são os smartphones, vamos marcar
apenas esta opção nesta etapa de criação do projeto.
Na terceira tela, é apresentada uma coleção de templates de Activity para selecionar
como tela inicial do aplicativo. Uma Activity ou atividade pode ser entendida como
uma tela da aplicação. Para cada tela é necessária a criação de, pelo menos, uma
Activity que permitirá aos utilizadores manipular, adicionar ou obter informação de
uma aplicação. Ou seja, neste passo de inicialização do projeto, estamos definindo
como será o layout da primeira tela do aplicativo, definida como Activity principal.
Neste exemplo (figura abaixo), vamos utilizar o template empty Activity, visto que
nosso propósito neste exemplo é de entender o funcionamento dos componentes
básicos do Android.
Figura 9 - Terceiro passo na criação de um projeto Android. Fonte: Elaborado pelo autor, 2018.
#PraCegoVer: Print da tela da próxima GUI com o nome Add na Activity to Mobile,
abaixo temos as opções: Add No Activity, Basic Activity, Bottom Navigation Activity
e Empty Activity (opção selecionada).
VOCÊ SABIA?
O Gradle é um sistema avançado de automatização de builds (compilação do código
fonte em um apk). O processo de compilação de um aplicativo Android envolve
muitas ferramentas e etapas que são integradas com o Gradle, tornando ágil e fácil
a geração de um apk. Maiores detalhes sobre esta ferramenta podem ser
encontradas no endereço:
<https://docs.gradle.org/current/userguide/userguide.html
(https://docs.gradle.org/current/userguide/userguide.html)>.
Desta forma, é estruturada uma aplicação padrão Android. Nas próximas seções
deste tópico, iremos focar nos arquivos de definição de interface de usuário que
ficam localizados na pasta res. As configurações globais realizadas no arquivo
AndroidManifest.xml e arquivos fontes java serão explicados mais adiante no tópico
1.4.
Já na visão design, são carregadas quatro ferramentas para montar o layout da tela
visualmente (GOOGLE, 2018):
VOCÊ SABIA?
Uma das mais importantes ferramentas disponíveis no SDK é o Android Virtual
Device Manager (AVD Manager). Usando o AVD Manager, é possível criar dispositivos
móveis emulados (AVD) com as mais variadas características (CPU, memória,
resolução de tela, armazenamento, etc.) no ambiente de desenvolvimento. A
documentação explicando como funciona o AVD Manager pode ser acessada em
<https://developer.Android.com/studio/run/managing-avds?hl=pt-BR
(https://developer.Android.com/studio/run/managing-avds?hl=pt-BR)>.
1.4.1 Intents
O Android possui um mecanismo de troca de mensagens conhecido como Intents.
As Intents são mensagens assíncronas que são usadas para comunicação entre os
diversos processos rodando no sistema operacional. Ou seja, os diversos
aplicativos executados na plataforma Android, podem se comunicar e trocar dados
com o sistema operacional por meio das Intents.
<activity android:name=“.TelaPrincipalActivity”>
<intent-filter>
<action android:name=“android.intent.action.MAIN” />
<category android:name=“ android.intent.category.LAUNCHER” />
<intent-filter>
<activity>
No trecho de código da figura acima, estamos registrando uma Activity com o nome
TelaPrincipalActvity. Perceba que temos um elemento neste arquivo chamado de
Intent-filter.
ativa: uma atividade ativa é visível na tela e “tem o foco”, isto é, está no
primeiro plano. O usuário pode interagir com a atividade que está no
primeiro plano;
pausada: uma atividade pausada é visível na tela, mas não tem o
foco – como quando uma caixa de diálogo de alerta é exibida. Não é
possível interagir com a atividade pausada até que ela se torne ativa;
parada: uma atividade parada não é visível na tela, ou seja, ela está
em segundo plano.
Para cada mudança de estado da tela, existe um método da classe Activity que trata
esta mudança. Os métodos são (GOOGLE,2018):
onCreate: como já foi mencionado, é acionado apenas quando a
Activity é criada; onStart: este método é executado logo após uma
Activity ter sido criada ou após ela ter sido reiniciada; onResume: o
método é executado acionado quando a Activity volta a ter foco;
onPause: o método é executado acionado quando a Activity perde o
foco, ou seja, a Activity será substituída por outra (pausada), ou existe um
componente de interface assumindo o foco (mensagem de diálogo);
onStop: o método é executado quando a Activity deixa de ser exibida
porque outra Activity assumiu o foco; onDestroy: o método é executado
sempre que a Activity esteja sendo destruída, ou seja, após a execução deste
método a plataforma limpará da memória a Activity.
Figura 17 - Configurando requisição de permissão para leitura no cartão de memória. Fonte: elaborado
pelo autor, 2018.
#PraCegoVer: Linhas de comando com o elemento <uses-permission> antes do
elemento <application>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”dtcom.com.br.primeiroaplicativo”>
<uses-permission
android:name=”android.permission.READ_EXTERNAL_STORAGE”></uses
permission> <application
android:icon=”@mipmap/ic_launcher”
android:label=”PrimeiroAplicativo”
android:roundIcon=”@mipmap/ic_launcher_round”
android:supportsRtl=”true”
android:theme=”@style/AppTheme”>
<activity android:name=”. TelaPrincipalActivity”>
<intente-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intente-filter>
</activity>
</application>
</manifest>
Com esse crescimento de uso de dispositivos móveis, o usuário passa a ver o mundo
com os olhos de suas necessidades. Essas necessidades geram novas aplicações que
atendam o objetivo do usuário e cria novos conceitos como vender serviços e não
produto. Essa mudança de conceito determina uma mudança fundamental para os
desenvolvedores de aplicações, o conhecimento do negócio.
Antes, a visão para desenvolvimento de uma aplicação era praticamente uma visão
sistêmica, hoje, essa visão muda. Devido às necessidades do usuário, a visão
sistêmica passa para uma visão das necessidades do usuário. Esse usuário que é
desconhecido para a maioria das empresas e esse desconhecimento gera um grau
de desafios ou barreiras que o desenvolvedor tem de enfrentar.
Vamos Praticar
Convido você a pensar, analisar e descrever quais são os desafios atuais e futuros
que um desenvolvedor de aplicações móveis do século 21 deve enfrentar no
desenvolvimento de uma aplicação móvel para um ambiente escolar. Compartilhe
no fórum da disciplina o seu ponto de vista num texto discorrido com,
aproximadamente, 15 linhas problematizando a importância do levantamento dos
desafios/barreiras para entendimento dos pontos positivos e negativos no
processo de criação da aplicação.
COMPUTAÇÃO PARA
DISPOSITIVOS MÓVEIS
CAPÍTULO 2 - QUAIS RECURSOS E
APIS
DO SISTEMA ANDROID PODEMOS
UTILIZAR PARA TORNAR NOSSA
INTERFACE DE USUÁRIO DINÂMICA?
Fernando Skackauskas Dias
INICIAR
Introdução
A tecnologia dos dispositivos móveis tem avançado consideravelmente nos últimos
anos. Novos aparelhos com recursos inéditos, interfaces cada vez mais amigáveis e
disponibilidade de novos serviços, dentre outras inovações, estão dominando o
mercado. Diante deste panorama, os cientistas da computação se encontram
diante de grandes desafios.
Nesse contexto, o sistema operacional Android foi desenvolvido com o objetivo de
se tornar um sistema aberto, englobando diversas novas funcionalidades. Por ser
um sistema aberto, significa que diferentes desenvolvedores podem atuar
diretamente no sistema operacional. Portanto, podemos questionar: quais são os
recursos e aplicativos do sistema Android que podem ser utilizados? Como
melhorar a interface do usuário, tornando-a mais dinâmica? Como utilizar os seus
recursos de forma a desenvolver aplicativos com melhor qualidade?
O sistema operacional Android foi desenvolvido por um consórcio de empresas,
sendo que, além de ser um sistema aberto, ele detém outras vantagens como, por
exemplo, o fato de várias marcas de dispositivos móveis o utilizarem como SO e a
possibilidade de ter acesso a vários so wares por meio do serviço de distribuição
digital de aplicativos.
Este capítulo é focado nos recursos e padrões de programação do sistema
operacional Android. Vamos entender como é feita a persistência de arquivos,
como funciona o banco de dados SQLite e os provedores de conteúdo, como é o
processamento XML e como são identificadas as formas de acesso à rede. Por fim,
será apresentado o padrão de desenvolvimento JSON e a ferramenta Retrofit.
Acompanhe com atenção e bons estudos!
Android.provider.contacts.Phones.CONTENT_URI
Observe que a classe é separada em quatro: a primeira parte indica que o dado é
fornecido por um determinado provedor de conteúdo; logo após, vem o
identificador do provedor de conteúdo; em seguida o tipo de dados; e, por fim, o
identificador de um determinado registro.
Processamento XmlPullParser
O XML (do inglês eXtensible Markup Language) é uma linguagem de marcação,
diferente das outras linguagens de programação, que corresponde a um agregado
de códigos para padronizar uma determinada sequência de dados, separando o
conteúdo do código. Ela foi desenvolvida originalmente para criar documentos, nos
quais os dados são organizados hierarquicamente. Vamos ver, a seguir, um
exemplo de um documento XML.
#PraCegoVer: Código: <aviso> <para>Fernando data= “18/06/2018”</para>
<de>Juliana</de> <cabecalho>Lembrete</cabecalho> <corpo>É necessário fazer
as correções no documento</corpo> </aviso>
Estas quatro linhas definem os quatro elementos filhos da raiz (para, de, cabeçalho e
corpo).
Por fim, última linha, </aviso>, define o fim do elemento raiz.
No caso do sistema operacional Android, o XML contido nele, pode ser de um dos
seguintes tipos: DOM, SAX e PullParser. O PullParser é uma interface que permite
criar implementações do XML. Existem diferentes tipos de parser, dependendo dos
recursos. Um deles é o analisador de não-validação, conforme a especificação XML
1.0, quando FEATURE_PROCESS_DOCDECL está definido como verdadeiro. Por
outro lado, quando FEATURE_PROCESS_DOCDECL é falso, o analisador se
comporta como sendo uma validação não compatível com XML 1.0 sob a condição
de que nenhum DOCDECL esteja presente em documentos XML.
Este modo de operação destina-se a ambientes restritos, como o J2ME ou JME. JME
significa “Java Platform, Micro Edition”, oferecendo mais robustez e flexibilidade
para aplicativos que são executados em dispositivos móveis e integrados, como
celulares, dispositivos de mídia digital e impressoras. Utilizandose o método next()
é possível recuperar o valor de um determinado evento e
compará-lo às constantes dos eventos da classe que está sendo executada. Cada
elemento que foi encontrado tem um nome, valor de texto e um conjunto opcional
de atributos.
Acesso à rede
O sistema operacional Android engloba uma série de funcionalidades, como o
acesso à rede. Neste caso, existe a solução Android Samba Client (SMB) que permite
acessar arquivos externos ao dispositivo móvel. Portanto, qualquer dispositivo
móvel que utilizar o Android pode acessar, por exemplo, partições do Windows.
Formato JSON
JSON – do inglês JavaScript Object Notation – é uma estrutura que tem por objetivo
representar os dados. Ela foi desenvolvida para ter um formato mais leve e simples
de troca de dados. O Android fornece quatro classes diferentes para manipular
dados JSON. Essas classes são: JSONArray, JSONObject, JSONStringer e
JSONTokenizer. Existe uma vantagem ao se utilizar a classe JSON, que é a
possibilidade de acessar as aplicações web no sistema operacional Android, sendo
que no XML é necessário encontrar uma solução para integração, como baixar um
leitor de XML. Comparando-se o XML e JSON, um arquivo XML é mais “burocrático”
de ser escrito do que o JSON. Por exemplo, se formos representar uma pessoa com
os atributos “nome” e “idade”, em XML, ficaria no seguinte formato:
<pessoa>
<nome>Nawarian Níckolas</nome>
<idade>20</idade>
</pessoa>
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Fernando Skackauskas Dias – 2018.
*/
public class CriaBanco extends SQLiteOpenHelper {
@Override
Public void onCreate(SQLiteDatabase db){
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
O código apresentado acima foi desenvolvido na ferramenta Android Studio, na
qual foi feita a prototipação dos métodos. É necessário implementar dois métodos
para que o aplicativo funcione corretamente:
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Fernando Skackauskas Dias – 2018.
*/
public class CriaBanco extends SQLiteOpenHelper {
private static final String NOME_BANCO = “banco.db”;
private static final String TABELA = “livros”; private static
final String ID = “id”; private static final String TITULO =
“titulo”; private static final String AUTOR = “autor”; private
static final String EDITORA = “editora”; private static final
int VERSAO = 1;
@Override
public void onCreate(SQLiteDatabase db){ String
sql = “CREATE TABLE”+TABELA+“{“
+ ID + “integer primary key autoincrement,”
+ TITULO + “text,”
+ AUTOR + “text,”
+ EDITORA + “text,”
+ “}”;
db.execSQL(sql);
}
Public CriaBanco(Context context){
super(context, NOEM_BANCO,null,VERSAO);
}
Para criar uma Activity é necessário estender a classe Activity, ou uma de suas
implementações como AppCompatActivity ou ListActivity. Isso tem como objetivo
fazer com que a classe herde todas as características das Activities, senão ela seria
somente uma classe do Java. Temos um exemplo a seguir.
#PraCegoVer: Print da tela com o código:
Na figura a seguir, podemos ver a tela do Android Studio, na qual é possível criar a
interface de entrada de dados.
Figura 3 - Tela do Android Studio, onde é possível elaborar a interface do usuário descrevendo os campos a
serem exibidos no aplicativo. Fonte: Elaborada pelo autor, 2018, adaptada da tela do Preview do Android
Studio.
<RelativeLayout
xmlns?android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=”match_parent” android:layout_height=”match_parent”
android:paddingLe =”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
android:paddingBottom=”@dimen/activity_vertical_margin”
tools:context=“.Inicial” android:id=“@+id/Inser”/
<TextView android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:textAppearence=“?android:attr/textAppearanceMedium
” android:text=“Titulo:” android:id=“@+id/TextView”
android:layout_marginTop=“47dp”
android:layout_alignParentTop=“true”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true” />
<EditView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:id=“@+id/editText”
android:layout_below=“@+id/textView”
android:layout_alignParentLe =“true”
android:layout_alignParentRight=“true”
android:layout_alignParentEnd=“true” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:textAppearence=“?android:attr/textAppearanceMedium
” android:text=“Autor:” android:id=“@+id/TextView2”
android:layout_below=“@+id/editText”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true”
android:layout_marginTop=“51dp” />
<EditView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:id=“@+id/editText2”
android:layout_below=“@+id/textView2”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true”
android:layout_alignRight=“@+id/editText”
android:layout_alignEnd=“@+id/editText” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:textAppearence=“?android:attr/textAppearanceMedium
” android:text=“Editora:”
android:id=“@+id/TextView3”
android:layout_below=“@+id/editText2”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true”
android:layout_marginTop=“64dp” />
<EditView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:id=“@+id/editText3”
android:layout_below=“@+id/textView3”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true”
android:layout_alignRight=“@+id/editText2”
android:layout_alignEnd=“@+id/editText2” />
<Button
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Cadastrar”
android:id=“@+id/button”
android:layout_below=“@+id/editText3”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true”
android:layout_marginTop=“72dp”
android:layout_alignRight=“@+id/editText3”
android:layout_alignEnd=“@+id/editText3”
/>
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:textAppearence=“?android:attr/textAppearanceMedium
” android:id=“@+id/TextView4”
android:layout_alignParentBottom=“true”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true” />
</RelativeLayout>
O código ainda não apresenta nenhuma funcionalidade, pois não foi programado
internamente ao Activity que fará o controle. Existem duas classes contidas no
código: a classe Activity, cujo objetivo é controlar a interface, e a classe
BancoController, cujo objetivo é manter o controle das operações no banco de
dados.
A classe BancoController faz o controle das manipulações no banco de dados, e é
necessária para a execução do aplicativo. O atributo banco é repassado na
instanciação do construtor das classes. De forma semelhante, o resultado do
método getWritableDatabase() é passado ao atributo db. Esta ação faz a
comunicação ao sistema operacional Android para a leitura e manipulação dos
dados. Para a inserção dos dados, o método insert() recebe a tabela de dados ao
final, encerrando a conexão.
Na figura a seguir, são demonstradas as classes BancoController e InsereDado.
Figura 6 - Classes de inserção de dados em Android, utilizando o banco de dados nativo SQLite e a
ferramenta Android Studio. Fonte: Elaborado pelo autor, 2018.
db = banco.getWritableDatabase();
valores = new ContentValue();
valores.put(CriaBanco.TITULO, titulo);
valores.put(CriaBanco.AUTOR, autor);
valores.put(CriaBanco.EDITORA, editora);
if (resulado ==-1)
return “Erro ao inserir registro”; else
return “Registro Inserido com sucesso”;
}
}
resultado = crud.insereDado(tituloString,autorString,editoraString);
Toast.makeText(getApplicationContext(),resultado, Toast.LENGTH_LONG).show();
}
}};
}
}
Para fazer a consulta aos dados, precisamos criar a interface, que apresenta um
ListView, que é um arquivo de XML de layout para sua estilização, como é mostrado
na figura a seguir.
Figura 7 - Código da Interface do usuário de consulta desenvolvido com o banco de dados SQLite e a
ferramenta Android Studio. Fonte: Elaborada pelo autor, 2018.
<ListView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:id=“@+id/listView”
android:layout_alignParentLe =“true”
android:layout_alignParentStart=“true” />
</RelativeLayout>
O resultado da criação do layout pode ser conferido na figura a seguir.
Figura 8 - Layout de consulta de
livro de um aplicativo desenvolvido em Android, utilizando o banco de dados nativo SQLite e a ferramenta
Android Studio. Fonte: Elaborada pelo autor, adaptada de Fenton one, Shutterstock, 2018.
VOCÊ SABIA?
Como os smartphones usam uma arquitetura de so ware semelhante à dos PCs, eles
tem as mesmas vulnerabilidades, mas a diferença é que seus recursos são limitados
e impedem a integração de soluções avançadas de monitoramento de segurança.
No artigo “Secloud: a cloud-based comprehensive and lightweight security solution for
smartphones”, o pesquisador Zonous e seus colaboradores (2013) propõem a
Secloud, uma solução de segurança baseada em nuvem, para dispositivos
smartphone, demonstrando o uso dos recursos do sistema operacional Android:
<https://www.sciencedirect.com/science/article/pii/S016740481300031X
(https://www.sciencedirect.com/science/article/pii/S016740481300031X)>.
A atualização da interface gráfica, a partir das informações processadas, precisa de
handlers e, para isso, a classe AsyncTask foi criada. Ela permite que esses processos
rodem em segundo plano, a fim de atualizar os dados na Interface. Deitel, Deitel e
Wald (2016, p. 245), descrevem o processo da seguinte forma:
Assim, vemos que a classe AsyncTask tem a função de encapsular a criação das
funções threads e handler. A criação da classe é feita pela ação
AsyncTask<Parâmetro, Progresso, Resultado>, na qual os parâmetros passados são
o tipo de dados, o Progresso e o retorno da thread (Resultado). A classe AsyncTask
compreende outros métodos sobrescritos que são o onPreExecute (antes de se
iniciar a thread), o método doInBackground (processamento em paralelo e
background, para processamentos pesados), o método onPostExecute (retorno do
doInBackground) e onProgressUpdate (percentual do download para a interface)
(DEITEL; DEITEL; WALD, 2016).
Serviços no Android
Simões e Pereira (2014) explicam que serviço é uma parte de um aplicativo, com
operação mais pesada e que não interage com a interface. Um serviço é iniciado por
um determinado componente do aplicativo, sendo executado em segundo plano,
mesmo havendo alteração entre os aplicativos pelo usuário (DEITEL; DEITEL; WALD,
2016). Conforme descrito por Simões e Pereira (2014), pode ter duas formas:
VOCÊ SABIA?
O modelo de programação assíncrona é comumente usado em sistemas móveis e
ambientes web 2.0. Porém, usam algoritmos que são de magnitude de desempenho
e espaço ineficiente, em comparação com os detectores de dados convencionais.
Pensando nisso, o pesquisador Hsiao e seus colaboradores (2017) resolveram
identificar e abordar dois problemas importantes no raciocínio sobre a causalidade
entre eventos assíncronos. Eles propõem uma nova classe chamada AsyncClock,
que resolve esse problema, explicitamente rastreando eventos causalmente
precedentes.
Se o aplicativo for iniciado ou vinculado, outros componentes do aplicativo
poderão usar o serviço, da mesma forma que qualquer componente poderá usar
uma atividade — iniciando com uma Intent. Portanto, é possível declarar o serviço
como privado, no arquivo do manifest, e bloquear o acesso de outros aplicativos.
Conforme exposto por Goovaerts (2016), o Google Glide permitirá que usuários
façam e recebam chamadas por Bluetooth e escutem mensagens de áudio e vídeo,
por meio de aplicativos. O Glide é uma biblioteca do Image Loader para Android,
desenvolvida e recomendada pela Google. Ele foi usado em muitos projetos de
código aberto da Google, incluindo o aplicativo oficial Google I / O 2014. Ele fornece
suporte a GIF animado e lida com o carregamento / armazenamento de imagens.
Glide é uma biblioteca de carregamento de imagens rápida e eficiente para Android,
focada em rolagem suave. O Glide oferece uma API fácil de usar, um pipeline de
decodificação de recursos e extensíveis e um conjunto automático de recursos.
Glide suporta busca, decodificação e exibição de fotos de vídeo, imagens e GIFs
animados. O Glide inclui uma API flexível, que permite aos desenvolvedores
conectar-se a praticamente qualquer pilha de rede. Por padrão, o Glide usa uma
pilha baseada em HttpUrlConnection, mas também inclui bibliotecas de utilitários
no projeto Volley da Google ou na biblioteca OkHttp da Square. O Glide leva em
consideração dois aspectos principais do desempenho do carregamento de
imagens no Android:
Para que os usuários tenham uma ótima experiência com um aplicativo, as imagens
não devem aparecer apenas rapidamente, mas devem também fazê-lo sem causar
muita interferência e engasgos com a entrada e saída do thread principal, ou com o
excesso de coleta de lixo.
O Glide realiza várias etapas para garantir que o carregamento de imagens seja o
mais rápido e suave possível no Android:
JobScheduler
O componente JobScheduler tem como objetivo planejar os processos, para tornar
o processamento mais eficiente, inclusive reduzindo o consumo de energia. Neste
sentido, são criadas classes lógicas para o gerenciamento dos sinais. É criada,
também, a classe SynAdapater para executar tarefas em background, tornando
mais ágeis os processos em execução. O JobScheduler não consegue ter o controle
dos serviços escalonados, sendo que o espaço de intervalo de execução é definido
pelos métodos setPeriodic(), setBackoffCriteria() e setOverrideDeadline().
Para Meike (2016, p. 155), “a maior motivação para a criação do JobScheduler é um
controle mais refinado do agendamento das tarefas assíncronas [...] a arquitetura
do JobSchedule é um modelo que está entre as classes sync-adapter e
AlarmManager”. Quando se processa o JobScheduler, são necessárias três etapas:
tornar a tarefa acessível pelo JobScheduler, agendar a tarefa e implementar o
agendamento.
BroadcastReceiver
Um BroadcastReceiver é um componente que responde aos eventos de
transmissão em todo o sistema. Muitas transmissões são originadas do próprio
sistema, como uma transmissão anunciando que a tela foi desligada ou a bateria
está fraca. Os aplicativos também podem iniciar transmissões para permitir que
outros aplicativos saibam que alguns dados foram baixados para o dispositivo e
estão disponíveis para serem usados. Embora os receptores de transmissão não
exibam, necessariamente, uma interface de usuário, eles podem criar uma
notificação de barra de status para alertar o usuário de algum evento de
transmissão. O mais comum porém, é que um receptor de broadcast seja apenas
um canal para outros componentes e tenha o objetivo de fazer uma quantidade
mínima de trabalho. Um receptor de broadcast é implementado como uma
subclasse de BroadcastReceiver e cada broadcast é entregue como um objeto
Intent.
Notificações no Android
No sistema operacional Android, uma notificação significa uma mensagem enviada
ao usuário, de uma forma normal. Estas notificações são realizadas por meio de um
ícone. O armazenamento destas notificações é gerenciado pelo próprio sistema
operacional Android, sendo que o usuário do sistema pode ter acesso a este
repositório. As classes que são utilizadas são o objeto NotificationCompat.Builder(),
para notificar as ações, o método NotificationCompat.Builder.build(), para criar a
notificação, e o método NotificationManager.notifiy(), para emitir a notificação.
Interface avançada do usuário
A interface com o usuário de um dispositivo móvel tem se desenvolvido de maneira
rápida e com recursos cada vez mais avançados. No sistema operacional Android
diversas novas funcionalidades foram criadas para atender de forma mais eficiente
às mais variadas demandas dos seus usuários.
Parcelables e os Bundles são objetos que devem ser usados nos limites do processo,
como nas transações IPC/Binder, entre as atividades, com o objetivo de armazenar
o estado transitório nas alterações de configuração. O Bundle é um
armazenamento de chave/valor para objetos especializados, usado para passar
dados para componentes do Android. Se for preciso passar os objetos de cliente via
Bundle, é necessário implementar a Parcelable interface.
A Parcelable é a implementação do Android do Java Serializable que assume a
estrutura de processamento. Dessa forma, um Parcelable pode ser processado de
forma relativamente rápida, comparada com a serialização Java padrão. Para
permitir que o objeto seja analisado para outro componente, é preciso
implementar a Android.os.Parcelableinterface. Ele também fornece um método
final estático chamado CREATOR, que deve implementar a
Parcelable.Creatorinterface. “O objeto Parcelable é um objeto que implementa
uma API específica que requer dois métodos: o describeContent() e o writeParcel()”
(MEIKE, 2016, p. 116).
O sistema operacional Android oferece as funcionalidades de widgets, que são
pequenos aplicativos dispostos na tela inicial, que tornam o acesso mais rápido às
informações como previsão do tempo, hora e agenda, sem que seja necessário abrir
o aplicativo correspondente..
Resource selectors
Os dispositivos Android vêm em uma variedade de configurações diferentes de
tamanho, densidade de pixels da tela, configurações de idioma, etc. O Android
suporta a seleção automática de recursos que se ajustam à configuração do
dispositivo. Para isso, o sistema fornece recursos diferentes em subpastas
predefinidas no diretório. O nome do sufixo de uma subpasta define a configuração
do dispositivo para a qual ela é válida, por exemplo, orientação, resolução ou
idiomas.
Temos, como exemplo, as telas de dispositivos Android, que são diferentes em
termos de resolução e em termos de densidade dos pixels na tela. No caso de
diferentes densidades de tela, o mesmo comprimento de um componente de
interface do usuário consiste em uma quantidade diferente de pixels. Por exemplo,
se o desenvolvedor especificar os pixels diretamente, poderá obter um
determinado resultado em um dispositivo com um número relativamente pequeno
de pixels. Por esta razão, é necessário fornecer recursos gráficos, por exemplo, os
ícones da barra de ação e laucher em diferentes resoluções. Isso pode ser feito
usando qualificadores de recursos com base na densidade de pixel. É possível usar
a densidade como qualificador de recurso. O Android suporta as seguintes seleções:
a linha de base é de 160 pontos por polegada (ppp). Se, por exemplo, o dispositivo
Android tiver 320 dpi, o drawable do drawable-hdpi será selecionado.
Uso de animações
As animações podem adicionar dicas visuais que avisam os usuários sobre o que
está acontecendo no aplicativo. Eles são especialmente úteis quando a interface do
usuário muda de estado, como quando novos carregamentos de conteúdo ou
novas ações ficam disponíveis. As animações também adicionam uma aparência
elegante ao aplicativo, o que proporciona maior qualidade.
O Property Animation é um framework disponível no Android e foi desenvolvido com
o objetivo de fornecer mais robustez e controle, ao desenvolver animações. O
Property Animation permite que qualquer objeto seja animado, seja este visível na
interface ou não. O funcionamento do Property Animation parte do princípio de que
é possível animar qualquer atributo de um objeto por um período de tempo, como
também definir as características importantes:
O Android dispõe de várias interpolações que não passam de fórmulas, que podem
ser copiadas e modificadas, para satisfazer o objeto do aplicativo.
CASO
Uma empresa de gestão de projetos percebeu que, um dos maiores problemas que
enfrentava, era devido aos atrasos no acompanhamento das tarefas dos projetos. Os
gestores de projetos tinham problemas de acompanhar o desenvolvimento e entrega
de todas as tarefas. Para contornar a situação, a empresa desenvolveu um aplicativo em
Android com a API 21, conhecida como o Android Lollipop. O Google forneceu um novo
componente conhecido como JobScheduler API, para lidar com esse mesmo cenário. A
JobScheduler API realiza uma operação para o aplicativo quando um conjunto de
condições predefinidas é atendido. Além disso, a JobScheduler é capaz de agrupar
várias tarefas para serem executadas juntas. Isso permite que o aplicativo execute e
informe a tarefa determinada, para que os gestores de projetos possam resolver os
problemas de acompanhamento.
Síntese
Compreendemos, neste capítulo, como utilizar e implantar os recursos e APIs do
sistema Android, de forma a tornar a interface de usuário mais dinâmica. Foi visto
como o sistema operacional Android oferece classes que permitem o acesso à rede,
ao armazenamento de dados e como fazer a persistência de dados. Ao implantar
um aplicativo em um dispositivo móvel, verificamos a importância dos
processamentos assíncronos e as notificações, agregando à interface, melhores
funcionalidades para o usuário.
Neste capítulo, você teve a oportunidade de:
compreender e aplicar as principais classes e métodos de
armazenamento e manipulação de dados por meio do SQlite, o
processamento XmlPullParser, o formato JSON e a ferramenta Retrofit;
demonstrar e executar processamentos assíncronos utilizando
handlers e AsuncTaksas, e as manipulações de imagens e serviços no
sistema operacional Android utilizando o Google Glide;
identificar o serviço de agendamento e notificações por meio do
JobSchedulere BroadcastReceiver;
prender a utilizar os recursos de interface do Android como o drag and
drop, drawables, pacelables, styles, themes e widgets, com a
possibilidade de criar animações e o resource selectors.
Projeto
INTERFACE ANDROID
Segundo relatórios publicados a respeito da Internet pelas empresas “We are social”
e “ Hootsuite” em 2018, esses revelam que já passam de 4 bilhões de usuários de
Internet ao redor do mundo. Mais da metade da população mundial plugados na
Internet. O relatório aponta que mais de 1 bilhão de usuários se tornaram ativos na
Internet em 2017.
Esse crescimento de usuários online tem sido impulsionado por suas questões: o
barateamento dos smartphones, atualmente consegue-se comprar smartphones
com preços mais acessíveis e de ótima qualidade, e novos planos de dados providos
pelas operadoras de telefonia. As operadoras agregam valores aos serviços por
custo reduzido, como uso de redes sociais sem custos e telefonia sem custos ao
usuário, inclusive interurbana.
Nesse contexto digital, uma nova era se apresenta para o mundo computacional.
Novos desafios, novas tecnologias e inovações. Segundo dados do Comitê Gestor da
Internet Brasil, o brasileiro fica cerca de 9 horas e 14 minutos conectados por dia na
Internet, sendo o terceiro no mundo, atrás somente de Tailândia e Filipinas. Esse
tempo distribuído em entretenimento, trabalho e estudos (G1, 2018).
Todo esse acesso é realizado através de aplicações móveis, via http ou app mobile, e
a comunicação interativa por meio de telas. As telas são as interfaces da aplicação
através do qual o usuário interage com o sistema. Essas interfaces devem ser
usáveis, interativas e possuir elementos que atendam às necessidades dos usuários
como botões, imagens, banners, menus, links etc. Uma interface mal projetada pode
causar insatisfação ao usuário por não conseguir alcançar seus objetivos ao usar o
produto, mas ao contrário, uma interface bem planejada faz com que o usuário
consiga obter boas experiências de uso, manuseio fácil e eficiente.
Ignorar o planejamento da Interface com usuário pode ser uma tomada de decisão
que resulta na rejeição da aplicação. Características como facilidade de manutenção,
fidelização de uso pelo cliente, trazer bons experiências ao usuário, tornando a
aplicação parte de dia a dia são resultados de uma interface bem planejada. Em
resumo, o usuário precisa alcançar seus objetivos de forma simples, eficiente,
através de fácil uso de uma interface.
Vamos Praticar
Convido você a pensar e fazer uma análise conceitual de um planejamento de
uma interface para um sistema específico de delivery de comidas para um
restaurante de comidas veganas. Faça uma análise de quais elementos de telas
comporiam a Interface do usuário e quais API poderiam ser usadas e sua
funcionalidade por meio de serviços que a aplicação poderia oferecer ao
usuário. Compartilhe no fórum da disciplina o seu ponto de vista. Faça esse
compartilhamento através de um texto detalhando a sua análise.
COMPUTAÇÃO PARA
DISPOSITIVOS MÓVEIS
CAPÍTULO 3 - COMO PODEMOS
CONSTRUIR APLICATIVOS DE
QUALIDADE?
Fernando Skackauskas Dias
INICIAR
Introdução
Com a tendência cada vez mais forte de desenvolver aplicativos para dispositivos
móveis, para os mais diversos fins, o mercado passa a ser mais exigente com
qualidade, o que exige critérios mais elevados de boa interação, funcionalidades
inteligentes, alto desempenho, conectividade com as mais diversas plataformas e
com outros aplicativos. Para atender a essas exigências, os sistemas operacionais
são desenvolvidos com classes e componentes para serem utilizadas como
recursos nos aplicativos.
Estes recursos concentram utilidades, como ferramentas para depuração e testes,
que auxiliam os desenvolvedores a construírem aplicativos com maior agilidade e
robustez. Outra função dos SOs dispositivos móveis tem como objetivo analisar o
desempenho e a automatização na construção de aplicativos.
Neste capítulo, vamos entender o Databinding do SO Android, permitindo ao
desenvolvedor escrever layouts declarativos. Vamos aprender, também, a usar os
padrões MVP (Model-View-Presenter) e MVVM (Model-View-ViewModel) e o
componente Dagger2, e demonstrar como utilizar as ferramentas de teste e
depuração como o JUnit, Espresso e Robotium. Será mostrado como realizar a
análise de desempenho por meio de ferramentas de análise. Por fim, serão
mostradas as ferramentas de automatização de construção como o Gradle e
Jenkins.
Acompanhe com atenção e bons estudos!
3.1.1 Databinding
O Android oferece suporte para escrever layouts declarativos, usando o
Databinding, também, chamado de vinculação de dados. Databinding permite
sincronizar a interface de usuário com o modelo de aplicativo e a lógica. Para Lee
(et al., 2005), isso minimiza o código necessário do aplicativo para se conectar aos
elementos da interface do usuário.
O uso de Databinding requer alterações nos arquivos de layout. Eles iniciam com
uma tarefa raiz, seguido de um elemento data e um elemento de visão. Os
elementos de dados descrevem os dados que estão disponíveis para ligação. O
elemento de visão contém sua hierarquia semelhante aos arquivos de layout, que
não são usados com Databinding.
As referências aos elementos de dados ou expressões dentro do layout são gravadas
nas propriedades do atributo usando o @{}ou @={}. Na figura a seguir, é
demonstrada a estrutura de vinculação de dados no Databinding.
A Databinding do Android gera uma classe “Binding”, com base nesse layout. Esta
classe contém todas as ligações das propriedades de layout, isto é, a variável
definida para as visualizações correspondentes. Ele também fornece as classes
“setters” geradas para seus elementos de dados, a partir do layout. O nome da
classe gerada é baseado no nome do arquivo de layout. Este nome é convertido e é
adicionado a ele. Por exemplo, se o arquivo de layout for chamado
activity_main.xml(), o método generate() será chamada ActivityMainBinding, sendo
possível incrementar o layout e conectar o modelo por meio dessa classe.
Portanto, a vinculação de dados é construída com a ideia de usar dados de um
objeto Java para definir atributos em seus layouts, e essa é a medida em que é
muito utilizado. Isto permite que se defina a lógica de visualização
independentemente do Android Framework.
VOCÊ SABIA?
Os aplicativos móveis, que incluem calendários, navegadores e mapas interativos,
fazem parte da vida da maioria das pessoas hoje em dia. A maioria dos aplicativos
móveis é de usuário único; e eles não permitem a colaboração síncrona entre os
usuários. A colaboração móvel permite que vários usuários em diversos locais
combinem sinergicamente suas contribuições de maneira conveniente.
Figura 2 - Modelo MVP do sistema operacional Android, indicando os módulos e suas correlações. Fonte:
Elaborado pelo autor, 2018.
VOCÊ SABIA?
No artigo dos pesquisadores Pinto e Araújo (2016), podemos acompanhar um estudo
de caso para testes automatizados com frameworks de código aberto em aplicativos
móveis em sistema operacional Android, no nível de unidade e interface de sistema.
O estudo demonstra uma análise crítica de cada ferramenta. Leia mais em
<https://seer.cesjf.br/index.php/cesi/article/view/922
(https://seer.cesjf.br/index.php/cesi/article/view/922)>.
Figura 5 - Estrutura e componentes do Android Debug Bridge do sistema operacional Android. Fonte:
Elaborado pelo autor, 2018.
#PraCegoVer: Apresenta uma tabela onde a primeira linha é laranja e está escrito
no meio da linha: AndroidDevMetries, embaixo dessa linha tem-se duas colunas
uma encostada na outra. Na primeira coluna está escrito Vantagens: -Fácil
integração, - Existência de métricas para várias atividades. Na segunda coluna está
escrito desvantagens: - Métricas somente para poucos métodos, - Não há
mecanismo de armazenamento das métricas.
Agora, vamos ver quais as ferramentas que tratam da otimização do desempenho
da interface do usuário de um aplicativo, e como são utilizadas.
Existem muitas ferramentas que podem ajudar na identificação de problemas de
interface do usuário e fornecer informações sobre os motivos do problema de
desempenho.
VOCÊ O CONHECE?
O criador do Java, James Gosling, quando adolescente, teve a ideia de criar um pequeno intérprete para
resolver um problema em um projeto de análise de dados em que estava trabalhando na época. Ao longo
dos anos, como aluno de pós-graduação e na Sun, como criador de Java e da Java Virtual
Machine, ele usou variações dessa solução. Leia mais sobre o criador do Java no artigo escrito por
Allman (2004), disponível em <https://queue.acm.org/detail.cfm?id=1017013
(https://queue.acm.org/detail.cfm?id=1017013)>.
CASO
O mercado consumidor está cada vez mais exigente com relação aos aplicativos para
dispositivos móveis e suas funcionalidades e, para não perder oportunidades, as
empresas devem estar atentas para o que o público espera, a fim de atender a essas
demandas. Um grande escritório de advocacia percebeu um nicho de utilização de
aplicativos: a capacidade de realizar as sessões de conciliação de processos
virtualmente. Para isto, a empresa solicitou o desenvolvimento de um aplicativo que
permite que as partes envolvidas no processo, possam fazer uma videoconferência,
utilizando o aplicativo no dispositivo móvel. Isto agiliza as decisões, as torna mais
eficientes e reduz custos de deslocamento para as partes envolvidas e os advogados.
Quando se faz as alterações manualmente, é mais complexo analisar o impacto das
alterações no código. Por isso, será difícil descobrir quais alterações introduziram
o problema. Mas quando o Jenkins é configurado para rodar automaticamente em
cada envio de código para o repositório, é sempre fácil saber o que e, quem,
introduziu o problema (DEITEL, DEITEL; WALD, 2016). Na lista a seguir, podemos ver
algumas das razões pelas quais é preciso automatizar o teste e as integrações de
build.
O tempo do desenvolvedor é concentrado no trabalho que importa:
a maior parte do trabalho, como integração e teste, é gerenciada por
sistemas automatizados de criação e teste.
A qualidade do so ware é aprimorada: os problemas são detectados e
resolvidos quase imediatamente, o que mantém o so ware em um
estado em que ele pode ser liberado a qualquer momento com
segurança.
Torna o desenvolvimento mais rápido: a maior parte do trabalho de
integração é automatizada. Por isso, os problemas de integração são
menores. Isso economiza tempo e dinheiro ao longo da vida útil de um
projeto.
Projeto
FERRAMENTAS DE AUTOMAÇÃO
Os objetivos dos padrões são impor uma estrutura geral para um sistema de
software ou subsistema que é apropriado para o problema que o sistema ou
subsistema está resolvendo; esclarecer as intenções do designer sobre a
organização do sistema ou subsistema; fornecer um paradigma que ajudará a
estabelecer e manter a consistência interna; permitir a verificação e análise
apropriadas; preservar informações sobre a estrutura para referência durante
posterior manutenção (SHAW, 1996).
Vamos Praticar
Convidamos você a pensar, analisar e descrever a importância do uso de um
framework no desenvolvimento de um sistema para dispositivos móveis.
Reforçamos a necessidade do planejamento do projeto na definição adequada da
arquitetura de software. Compartilhe no fórum da disciplina o seu ponto de vista
por meio de texto de aproximadamente 15 linhas. Problematizando a importância
do uso do modelo, explore as vantagens do uso do padrão escolhido, mas também
pontue seus pontos negativos. Lembre-se que há outros padrões de arquitetura,
por exemplo, o modelo em camadas.
COMPUTAÇÃO PARA
DISPOSITIVOS MÓVEIS
CAPÍTULO 4 - COMO APRIMORAR
NOSSO APLICATIVO COM AS APIS DA
GOOGLE?
Fernando Skackauskas Dias
INICIAR
Introdução
É notório o grande avanço dos aplicativos nos dispositivos móveis, as novas
funcionalidades, a usabilidade e capacidade de comunicação e interação com
outros dispositivos e componentes. As tecnologias de geolocalização e
mapeamento estão levando à criação de aplicativos que atendem às necessidades
de diversas empresas e usuários, que, há poucos anos, eram inimagináveis. Nesse
contexto, os serviços em nuvem também estão cada vez mais presentes no dia a
dia. O Android tem inserido, dentre as suas possibilidades, a interação com os
serviços cloud, como a execução de backup e serviços de mensagens por meio de
APIs. E como a API trabalha? Por que as APIs são tão importantes para os
desenvolvedores?
Uma API (Application Programming Interface, ou, em português, Interface de
Programação de Aplicativos) trata do conjunto de aplicações que permitem a
construção de uma interface inteligente. Ou seja, a API é o motor dos aplicativos,
pois ela é quem faz a ligação de todos os recursos necessários para que um so ware
funcione de forma correta para o usuário. A empresa Google oferece várias APIs,
sendo que um dos principais destaques é o Google Maps. Este é um serviço gratuito,
que pode ser utilizado em qualquer aplicativo de dispositivo móvel. Mas como
utilizar o Google Maps em aplicativos?
Neste capítulo, vamos entender como o Android utiliza a geolocalização e o
mapeamento, por meio do Google Maps. Estudaremos o Android e a utilização dos
serviços em nuvens, como o Android Data Backup, o Firebase e o Cloud, do Service
Manager, e as funcionalidades de sensores e toque. Por fim será demonstrada a
construção de um so ware para aplicativo, utilizando as funcionalidades do
Android.
Vamos estudar com atenção!
VOCÊ SABIA?
Os deficientes visuais encontram enormes desafios no seu dia a dia, como a
limitação para perceber o entorno dos objetos e para aquisição de produtos. Para
promover a autonomia dos deficientes visuais, foi desenvolvida uma solução na área
de Engenharia Elétrica, para aparelhos Android, que orienta o usuário por meio da
tecnologia Near Field Communication. Leia mais no artigo escrito por Lamas e Souza
(2016):
<https://periodicos.ufsc.br/index.php/extensio/article/view/18070221.2016v13n24
p37
(https://periodicos.ufsc.br/index.php/extensio/article/view/18070221.2016v13n24p
37)>.
A API do Google Maps disponibiliza a classe principal MapView. Esta classe tem
como função exibir, em um determinado mapa, as coordenadas e dados oriundos
do Google Maps. É possível fazer o zoom no mapa virtual pelo toque, inclusive
interagindo com mapas adicionais, oferecendo os elementos de interface para o
usuário. O aplicativo também pode usar a classe MapView para controlar o mapa
de forma programática e desenhar várias sobreposições na parte superior do mapa.
Conforme demonstrado por Murukannaiah e Singh (2015), utilizando-se o MapView,
um lugar deriva seu significado do espaço físico, das atividades ou do contexto
social de um usuário. Dessa maneira, o local pode facilitar uma melhor experiência
do usuário em comparação com a representação tradicional de localização, que
são coordenadas espaciais.
VOCÊ O CONHECE?
Quando a Google comprou o Android, Nick Sears, cofundador, esperava o desenvolvimento de um
sistema operacional avançado, como, por exemplo, câmeras digitais. No entanto, houve uma grande
reviravolta com as tecnologias que vieram a seguir. Quer ler mais sobre o cofundador do Android? Leia
no artigo escrito por Moliane e Almeida (2016): <https://docplayer.com.br/54762841-Art-e-dalvik-
emdispositivos-android.html (https://docplayer.com.br/54762841-Art-e-dalvik-em-
dispositivosandroid.html)>.
As APIs do Google Maps para Android não estão incluídas na plataforma Android,
mas estão disponíveis em qualquer dispositivo com o Google Play Store,
executando o Android 2.2 ou superior, por meio dos serviços do Google Play.
Portanto, para integrar o Google Maps ao aplicativo, é necessário instalar as
bibliotecas do Google Play Services para o Android SDK.
4.1.2 Google Maps API
É possível para os desenvolvedores de aplicativos para dispositivos móveis
incorporarem as diversas funcionalidades disponíveis pelo Google Maps nas
páginas web ou obter informações do Google Maps. Isto torna o resultado do
aplicativo mais personalizado. Neste sentido, a Google oferece um conjunto de
interfaces de programação de aplicativos (APIs) desenvolvidas, que permitem a
comunicação com o Google Services e sua integração a outros serviços. Exemplos
disso incluem: pesquisa, Gmail, tradutor ou Google Maps. Aplicativos de terceiros
podem usar essas APIs para aproveitar ou ampliar a funcionalidade dos serviços
existentes.
As APIs fornecem funcionalidades como análise, aprendizado de máquina como um
serviço (a API de previsão) ou acesso a dados do usuário (quando a permissão para
ler os dados é fornecida). Outro exemplo importante é um mapa do Google
incorporado em um site, que pode ser obtido usando a API de mapas estáticos, a
API do Google Places ou a API do Google Earth.
4.2.2 Firebase
O Firebase é um API da Google que tem como objetivo enviar mensagens de
notificações e dados de forma confiável. O Firebase é um Firmware Cloud Messaging
(FCM), no qual é possível, por exemplo, executar uma notificação no aplicativo do
usuário informando que e-mail, ou outros dados, estão disponíveis.
Portanto, é possível enviar mensagens de notificação para fazer a interação entre
usuários. O pré-requisito para configurar o Firebase é, pelo menos, ter uma conta
do Google para entrar no sistema.
A Câmera API 2.0 é uma nova API que permite um controle muito melhor por
aplicativos e aumenta o desempenho da câmera. A Câmera API 2.0 é rápida o
suficiente para aproveitar a resolução total do sensor. Isso significa que uma
fotografia computacional como essa deve ser muito mais barata em dispositivos
Android. A nova API também permite um controle muito mais refinado do sensor,
lente e flash por quadro individual.
Figura 1 - O modelo de atividade do Google Maps da ferramenta Android Studio para criação de
aplicativos. Fonte: Elaborada pelo autor, 2018, na ferramenta Android Studio.
#PraCegoVer: Print da tela do Android Studio contém no topo uma faixa verde
escrito: Add na activity to Mobile, abaixo da faixa verde do lado esquerdo tem um
pedaço em branco escrito Add No Activity; do lado à direita a tela de um celular em
branco e no topo dessa tela representa o browser e embaixo dele está escrito Blank
Activity; do lado desta tela à direita tem outra tela de celular e dentro dela tem no
topo uma faixa representando o browser e embaixo o desenho de uma linha
pontilhada azul claro que faz o contorno da borda da tela em branco e embaixo
desta tela está escrito Blank Activity with Fragment. Do lado desta tela à direita tem
outra tela de celular com faixas onduladas intercalando azul escuro com azul claro
(cor de fundo da tela do celular) e no topo desta tela tem uma faixa representando
o browser, do lado direito, tem um símbolo branco quadrado, onde cada
extremidade desse quadrado é uma seta apontando de dentro para fora do
quadrado, uma linha branca no meio da tela inclinada para a esquerda cruza a tela
na diagonal e abaixo desta tela está escrito Fullscreen Activity; do lado desta tela à
direita tem outra tela de celular preta e dentro dela tem uma quadrado azul com
um quadrado amarelo no meio da tela escrito Ad, embaixo desta tela de celular está
escrito Google AdMob Ad s Activity. Abaixo dessas telas tem-se mais 5 telas de
celular, à primeira tela à direita tem no topo uma linha representando o browser e
embaixo o desenho de uma mapa e de um localizador em vemelho e abaixo dessa
tela está escrito Google Maps Activity; do lado desta tela à direita tem outra tela de
celular onde dentro dela no topo tem uma linha representando um browser e
abaixo o símbolo do google play que é uma peça de quebra cabeça com o encaixe
do lado esquerdo da peça e uma parte a ser encaixada no topo dela, está peça é
colorida, com uma parte verde claro, outra azul claro, outra vermelho e a outra
laranja, abaixo desta tela de celular está escrito Google Play Service Activity; do lado
desta tela à direita tem outra tela de celular e dentro dela tem uma tela onde no
topo tem uma barra representando o browser e embaixo tem dois campos um para
digitar email e embaixo um para digitar a senha e embaixo um botão, embaixo da
tela está escrito Login Activity; do lado desta tela à direita tem outra tela de celular
mas virada na horizontal e dentro dela tem uma faixa cinza à esquerda com
algumas linhas brancas onduladas (representando escritas) e do lado tem um
quadro branco e embaixo dele algumas linhas brancas onduladas (representando
escritas), embaixo desta tela está ecrito Master / Detail Flow; do lado desta tela à
direita tem outra tela de celular e dentro dela tem no topo uma barra
representando um browser e embaixo do lado esquerdo tem uma faixa cinza
algumas linhas brancas onduladas (representando escritas) e do lado direito tela
em branco.
Em seguida, é necessário criar uma chave API do Google Maps para configurar o
Google Play Services. Esta chave é obtida clicando-se no endereço:
<https://console.developers.google.com/flows/enableapi?
apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=17:8A:66:F5:C
7:FF:50:E3:77:FB:79:8A:79:3F:30:43:FC:D6:CE:61%3
(https://console.developers.google.com/flows/enableapi?
apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=17:8A:66:F5:C
7:FF:50:E3:77:FB:79:8A:79:3F:30:43:FC:D6:CE:61%3)>.
É necessário acessar este link e se inscrever em uma chave da API do Google Maps.
Não há custo para se inscrever e, quando receber uma chave desse site, você deve
voltar a esse arquivo e substituir YOUR_KEY_HERE pela nova chave.
Para demonstrar o processo, fizemos capturas de tela, que podem ser usadas como
referência.
Figura 2 - Criação de novo projeto do Google Maps console developers Google do Google API – etapa 1.
Fonte: Elaborada pelo autor, 2018 na ferramenta Google API.
2. A criação do novo projeto leva alguns segundos e ficará na tela que vemos
nafigura a seguir:
Figura 3 - Criação de novo projeto do Google Maps console developers Google do Google API – etapa 2.
Fonte: Elaborada pelo autor, 2018 na ferramenta Google API.
#PraCegoVer: Print da tela chamada Activities (1), abaixo escrito Create Project: My
Project e na frente o símbolo de carregando, abaixo escrito Create Project: My
Project e na frente o símbolo de tick verde, abaixo escrito Create Project: My Project
e na frente o símbolo de tick verde e abaixo escrito Create Project: My Project e na
frente o símbolo de tick verde.
Figura 5 - Criação de novo projeto do Google Maps console developers Google do Google API – etapa 4.
Fonte: Elaborada pelo autor, 2018 na ferramenta Google API.
<resources>
<string name=“google_maps_key_instructions”
templateMergeStrategy=“replace”>
https://console.developers.google.com/flows/enableapi?
apiid=maps_android_backend&keyType=CLIENT_SI
DE_ANDROID&r=17:8A:66:F5:C7:FF:50:E3:77:FB:79:8A:79:3F:30:43:FC:D6:CE:61%3B
string in file:
--></string>
<string name=“google_maps_key” templateMergeStrategy=“preserve”>
YOUR_KEY_HERE </string> </resources>
plugin: ‘com.android.application’
android{
compileSdkVersion 21
buildToolsVersion “21.0.2”
defaultConfig { applicationId
“EuEstouAqui” minSdk
Version 14 targetSdk Version
21 versionCode 1
versionName “1.0”
}
buildTypes { release { minifyEnabled false proguardFiles
getDefaultProguardFile(‘proguard-android.txt’).‘proguard-rules.pro’
}
}
}
dependencies {
compile fileTree(dir: ‘libs’.include: [‘*.jar’]) compile
‘com.android.support:appcompat-v7:21.0.2’ compile
‘com.google.android.gms:play-services:6.1.71’
}
<manifest xmlns:android=http://scheas.android.com/apk/res/android
package=“teamtreehouse.com.iamhere”>
<application android:allowBackup=“true”
android:icon=“@drawable/ic_laucher”
android:label=“@string/app_name”
android:theme=“@style/AppTheme”
<meta-data
android:name=“com.google.android.gms.version”
android:value=“@integer/google_play_services_version” />
<meta-data
android:name=“com.google.android.maps.v2.API_KEY”
android:value=“@string/google_maps_key” />
<activity android:name=“.MapsActivity”
android:value=“@string/google_maps_key” />
<intent-filter>
<action android:name=“android.intent.action.MAIN” />
</manifest>
Package EuEstouAqui;
import android.content.IntentSender; import
android.location.Location; import
android.os.Bundle; import
android.support.v4.app.FragmentActivity;
import android.util.Log;
@Override
Protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps); setUpMapIfNeeded();
mGoogleApiClient = new GoogleApiClientBuilder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API) .build();
// Create the LocationRequest object mLocationRequest
= LocatioRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(10 * 1000)
.setFasterInterval(1 * 1000);
}
@Override
protected void onResume() {
super.onResume();
setUpMaplfNeeded();
mGoogleApiClient.connect();
}
@Override
protected void onPause() { super.onPause();
if (mGoogleApiClietn.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient.
This); mGoogleApiClient.disconnect();
}
}
@Override
Public void onConnected(Bundle bundle) {
Location location =
Location.Services.FusedLocation.Api.get.LastLocation(mGoogleApiClient);
if (location == null) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGooogleApiClient,
mLocationRequest, this);
}
else {
handleNewLocation(location);
}
}
@Override
Public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(Connection Result connectionResult)
{ if (connectionResult.hasResolution()) { try {
connectionResult.startResolutionForResult(this,
CONNECTION_FAILURE_RESOLUTION_REUEST);
} catch (IntentSender.SendIntentException e) { e.prinStack
Trace();
}
} else{
Log.i(TAG, “Location services connection failed with code ” +
connectionResult.getErrorCode());
}
}
@Override
public void onLocationChanged(Location location) { handleNewLocation(location);
}
}
#PraCegoVer: print da tela do Android Studio na primeira linha está escrito public
class MapsActivity extends FragmentActivity implements. Embaixo da palavra
public class tem uma caixa com 5 opções: a primeira Implement Methods
selecionada em azul, segunda Make ‘MapsActivity’ abstract, terceira Create
Subclass, quarta Create Test e quinta Make package-local. Embaixo dessa caixa tem
outra caixa maior com o título Select Methods to Implement, embaixo tem a barra
com 4 botões, o segundo está selecionado, tem um bolinha azul clara e
dentro dela a letra c; embaixo tem uma barra escrito
com.google.android.gms.api.GoogleApiClient com os itens
onConnected(Bundle):void e onConnectionSuspended(int): void, ambos
selecionados na cor azul; embaixo tem uma barra escrito
com.google.android.gms.common.api.GoogleApiClient com o item
onConnectionFailled(ConnectionResult):void selecionado na cor azul; no final da
caixa tem duas opções CopyJavaDoc (não selecionado) e Insert @Override
(selecionado) e na frente dois botões: Cancel na cor branco acinzentado e OK na cor
azul para seleção.
Projeto
PROJETO DE APLICATIVO
Um desses paradigma está associada a internet dos Coisas (IoT). A internet das
coisas é conceito do presente e que estará fortemente sendo implementado no
futuro. A ideia é que todas as coisas (objetos) estejam conectados via internet e
enviando informações entre si. Essas informações são inputs (inseridas) no sistema
através de atuadores como sensores que captam informações do mundo externo,
processam, e tal forma, reagem ao mundo externo. Por exemplo, numa cidade
inteligente, smart city, a caixa de lixo pode mandar automaticamente uma
mensagem para o proprietário da casa solicitando que o saco de lixo esteja do lado
de fora às 15:45, pois será a hora que o caminhão de lixo estará passando para
recolher o saco.
Esse cenário só será possível, porque ao sair da base, caminhão envia mensagens
para todas as caixas de lixo, e as mesmas para seus respectivos donos. O caminhão,
a caixa de lixo e o dispositivo eletrônico do dono da residência, estão conectado via
Internet, resultando num único sistema.
Vamos Praticar
Agora é a hora de praticar. Após a leitura do texto sobre Internet das Coisas e a
importância dos sensores para captura de informação. Faço um convite a você a
pensar, analisar, e descrever a importância do uso dos sensores, existentes
principalmente nos smartphones, como um recurso de inovação de projeto de
uma aplicação móvel idealizada para resolver um problema proporcionando
melhorias (benefícios) a um usuário ou a uma empresa. Faço uma ressalva sobre a
necessidade compreensão do negócio para uma melhor eficiência do projeto com
uma solução inovadora. Compartilhe no fórum da disciplina o seu ponto de vista
com relação ao uso de recurso num texto discorrido de aproximadamente 15
linhas e problematizando a importância do mesmo, explore os benefícios
proporcionado pela aplicação ao usuário ou empresa. Lembre-se que o foco
está associado nas necessidades do usuário(empresa).