Você está na página 1de 75

Pontifcia Universidade Cat olica de Minas Gerais

Curso de Ciencia da Computacao


Android, Arquitetura e Desenvolvimento
Thiago de Souza Passos
Pocos de Caldas
Novembro de 2009
Thiago de Souza Passos
Android, Arquitetura e Desenvolvimento
Monograa - 2s/2009
Monograa apresentada ao Curso de Ciencia
da Computa cao da Pontifcia Universidade
Cat olica de Minas Gerais (Campus Pocos de
Caldas) como pre-requisito para a obtenc ao
do ttulo de bacharelado sob a orientacao do
professor Dr. Udo Fritzke Jr.
Pocos de Caldas
Novembro de 2009
FICHA CATALOGR

AFICA ELABORADA PELA


BIBLIOTECA DA PUC Minas (Campus Pocos de Caldas)
c
Trabalho apresentado `a disciplina de Trabalho de Diplomacao da Pontifcia Universi-
dade Catolica de Minas Gerais, Pocos de Caldas, 2009.
Prof. Dr. Udo Fritzke Jr (Orientador)
PUC Minas
Prof. MSc. Fabiano Costa Teixeira
PUC Minas
Prof. MSc. Paulo Muniz de

Avila
PUC Minas
Agradecimentos
Primeiramente agradeco a Deus. Ele tem me ajudado a superar as diculdades e tem me
abencoado `a cada dia.
Agradeco tambem ` a minha famlia, que contribuiu de uma maneira especial na
minha formacao pessoal e me deu a oportunidade de estudar. Nunca faltou nada que eu
realmente precisasse.
Agradeco aos amigos, com carinho especial pelo Fabrcio. Ele me ensinou algunas
coisas sobre a vida como por exemplo nao reclamar dela.
Por m, gostaria de agradecer o professor Dr. Udo Fritzke Jr. pela conanca
e orientacao de altssimo nvel. Obrigado a todo o corpo docente pelo ensino e pela
amizade.
e
Epgrafe
A maravilhosa disposicao e harmonia do universo so pode ter tido origem segundo o
plano de um Ser que tudo sabe e tudo pode. Isto ca sendo a minha ultima e mais
elevada descoberta.
Isaac Newton
f
Resumo
Este trabalho apresenta a arquitetura da plataforma Android, um sistema opera-
cional aberto e livre para celulares e dispositivos m oveis. A necessidade de se ter um
sistema operacional aberto e livre e crescente conforme aumenta o n umero de usu arios
de celulares pelo mundo. Com o aumento desse numero crescem tambem as iniciativas
no sentido de melhorar o processo de desenvolvimento e, assim, ter um ambiente cada
vez mais pr oximo dos sistemas para desktops. Os programas estao cada vez mais robus-
tos e complexos e e necess ario que haja bom entendimento das tecnicas e ferramentas
disponveis para tal m. Esta monograa visa elucidar algumas questoes nesse sentido.
Apresentadas as caractersticas principais da arquitetura sera proposta uma aplicacao ba-
seada em localizacao (LBA - Location Based Application) que ira utilizar os conceitos
estudados e demonstrar o uso das APIs do Google Maps na plataforma Android.
Abstract
This technical report presents the architecture of the Android Platform, an open-
source and free operational system projected by Google for handsets. The need for a free
and open operational system is growing as the number of handsetss users around the
world increases. With this increase, grows also the initiatives to improve the development
process and in order to an environment ever closer to desktops systems. The softwares
are increasingly more robust and complex and it is important the understanding of the
techniques and tools available for this purpose. This work aims to clarify some issues in
this context. After this, well propose an Android Location-based Application witch is
gonna use the explicated concepts and show the Maps APIs use in the Android platform.
Sumario
I Introducao ao Android 1
1 Introducao 2
1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Android 4
3 Arquitetura do Sistema 5
3.1 Kernel Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.1.1 Linux no Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.1 Bionic Libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.2 Bibliotecas de func oes . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.3 Servidores nativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.4 Bibliotecas de abstrac ao do hardware . . . . . . . . . . . . . . . . . 15
3.3 Android Runtime (Ambiente de execuc ao) . . . . . . . . . . . . . . . . . . 16
3.3.1 M aquina Virtual Dalvik . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3.2 Core Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4 Framework de aplicacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4.1 Activity Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4.2 Package Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4.3 Telephony Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
i
SUM

ARIO ii
3.4.4 Content Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 Aplicac oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.5.1 Componentes da aplicac ao . . . . . . . . . . . . . . . . . . . . . . . 20
Conclus oes sobre a arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
II Desenvolvimento 24
4 Fundamentos de programacao no Android 25
4.1 Linguagem e paradigma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2 Distribuic ao das aplica coes . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3 Independencia e estabilidade . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.4 Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5 Servicos Baseados em Localizacao 31
5.1 Aplicac oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 GPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.3 Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.4 Google Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.5 LBS no Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.5.1 O pacote Location . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6 Aplicacao Onde Estou 38
6.1 OndeEstou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Considerac oes sobre a aplicac ao . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Consideracoes nais 45
Apendices 46
SUM

ARIO iii
A Codigos-fonte 46
A.1 OndeEstou.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
A.2 Setup.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
A.3 MyProximityAlert.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
A.4 AndroidManifest.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A.5 main.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
B Interface da Aplicacao 59
Bibliograa 61
Lista de Figuras
3.1 Arquitetura do Sistema (fonte: Application Fundamentals) . . . . . . . . . 5
3.2 Kernel Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.3 Bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.4 Camada de abstracao de hardware . . . . . . . . . . . . . . . . . . . . . . 16
3.5 Android Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.6 Framework de aplicacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.7 Applicac oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1 Ciclo de vida de uma activity (fonte: Activity Android Developers) . . . . 28
4.2 Super classes de Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
B.1 Interface da Aplicacao Onde estou . . . . . . . . . . . . . . . . . . . . . . . 59
iv
Codigos-fonte
4.1 Principais metodos da classe Activity . . . . . . . . . . . . . . . . . . . . . 29
A.1 Classe OndeEstou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
A.2 Classe Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
A.3 Classe MyProximityAlert . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
A.4 Arquivo de conguracao da aplicacao AndroidManifest.xml . . . . . . . . . 57
A.5 Arquivo de layout main.xml . . . . . . . . . . . . . . . . . . . . . . . . . . 58
v
Lista de Abreviaturas
ANATEL - Agencia Nacional de Telecomunicacoes
API - Application Programming Interface
BSD - Berkeley Software Distribution
DVM - Dalvik Virtual Machine
FAQ - Frequently Asked Questions
GPL - General Public License
GPS - Global Positioning System
GUI - Graphical User Interface
JVM - Java Virtual Machine
KML - Keyhole Markup Language
LCD - Liquid Crystal Display
mp3 - MPEG Layer 3
MPGE - Moving Picture Experts Group
PDA - Personal Digital Assitent
SDK - Software Development Kit
XML - eXtensible Markup Language
Parte I
Introducao ao Android
1
1 INTRODUC

AO
Os celulares ja se consolidaram no meio comercial. Segundo os ultimos dados da ANATEL
(Agencia Nacional de Telocomunicacoes) ha, atualmente, cerca de 166 milhoes de celulares
habilitados no Brasil todo. Esse crescimento, n ao s o no Brasil mas no mundo inteiro, vem
abrindo espaco para pesquisas na area de desenvolvimento para dispositivos m oveis.
O hardware presente nos celulares e dispositivos m oveis em geral teve uma me-
lhora muito signicativa nos ultimos anos. Alem disso, as tecnologias de redes sem o e
internet banda larga tem crescido muito pelo mundo todo e tem proporcionado uma gama
de recursos aos dispositivos m oveis, recursos estes antes presentes apenas nos desktops.
Essa aproximac ao dos dispositivos m oveis em relacao aos desktops, nao s o em termos de
hardware, mas tambem nas tecnologias de banda larga, tem trazido `a tona diversas linhas
de pesquisa na area de desenvolvimento de software.
No desenvolvimento para celulares e dispositivos embarcados em geral e muito
importante considerarmos algumas caractersticas como por exemplo a capacidade de:
a) processamento, b) memoria, c) disco (armazenamento), d) bateria, etc.
Embora os celulares hoje em dia tenham um alto desempenho no quesito hardware,
ainda assim poderamos dizer que o hardware e muito limitado se comparado aos desktops.
Embora essa armac ao seja verdadeira, os softwares cada vez mais tem migrado, ou
melhor, tem estado presente tambem nos dispositivos moveis. Em outras palavras, os
softwares que est ao rodando atualmente nos desktops (muito mais potentes de que os
dispositivos moveis) est ao rodando nos celulares tambem.
Assim, nesse contexto, cabe aos produtores de hardware melhorar o hardware
dos dispositivos, buscando aproximar (na medida do possvel) os celulares dos desktops.
Aos desenvolvedores, cada vez mais eles precisam ser capazes de fazer softwares mais
compactos e otimizados, contribuindo assim para o crescimento da plataforma movel.
2
CAP

ITULO 1. INTRODUC

AO 3
Os ambientes atuais de programa cao para dispositivos m oveis sao criancas ainda
em termos de padr oes e metodologias de desenvolvimento. O que temos atualmente e uma
serie de plataformas onde h a desenvolvimento em paralelo, cada aplicacao e desenvolvida
para uma linha de celulares ou, as vezes, para um unico celular. Essa falta de padr oes e
prejudicial para os desenvolvedores.
Nesse contexto, foi criado um sistema operacional para celulares chamado Android.
O Android e um sistema de c odigo aberto que oferece aos fabricantes de dispositivos
m oveis um sistema completo que gerencie o hardware. Em outras palavras, o Android e
uma soluc ao em software criada para prover aos dispositivos moveis a) gerenciamento de
hardware (func ao de um sistema operacional), b) suporte `a drivers plugaveis, c) suporte
para desenvolvimento em linguagem nativa C e linguagens de alto-nvel como Java e XML,
d) frameworks e APIs de desenvolvimento, entre outros.
Aos desenvolvedores, o Android oferece suporte completo ` a programacao. Mais
adiante, no decorrer deste trabalho, serao mostradas em detalhes as caractersticas de
programac ao para a plataforma.
1.1 Objetivos
Hoje em dia, torna-se indispens avel aos desenvolvedores e especialistas da area de com-
putac ao conhecer as plataformas, tecnicas de programac ao e APIs disponveis para de-
senvolvimento de aplicac oes em ambientes moveis.
Este projeto tem como objetivo apresentar o Android, detalhando pontos impor-
tantes da sua arquitetura e o ciclo de vida das aplicacoes. Alem disso pretende-se mostrar
como iniciar a construc ao de um programa basico para o Android.
Pretende-se, ao nal deste trabalho, desenvolver uma aplicac ao baseada em loca-
lizac ao que ir a utilizar o servico GPS e mostrar a localizac ao do dispositivo atraves de
mapas utilizando a API do Google Maps. Atraves da aplicacao pretende-se mostrar os
recursos que a plataforma Android oferece ` as aplicacoes baseadas em localiza cao.
2 ANDROID
Android e uma pilha de softwares para dispositivos moveis que inclui sistema operacional,
middleware e aplica coes. Entende-se por pilha de software um conjunto de aplicac oes
que trabalham em conjunto para atingir determinado objetivo. Um Sistema Operacional,
por exemplo, e uma pilha de softwares. Ele contem diversas aplicac oes trabalhando em
conjunto para atingir seu objetivo, que e gerenciar o hardware. O termo pilha e usado
porque numa pilha um elemento depende de outro. Essa ideia de dependencia e o que se
quer deixar claro no termo Pilha de Softwares (em ingles Software Stack).
No Android, alem do Sistema Operacional ainda e oferecida uma gama de recursos
para programac ao e desenvolvimento. Esses recursos incluem ferramentas de desenvolvi-
mento (compiladores, emuladores, etc), classes re-escritas, bibliotecas, APIs e Frameworks
para tornar possvel a confec cao de softwares para o Android.
Todos esses recursos sao fornecidos utilizando a linguagem de programacao Java.
Vamos falar um pouco sobre os recursos mais importantes a seguir.
O pr oximo captulo deste documento ira descrever mais detalhadamente a arqui-
tetura do Android.
4
3 ARQUITETURA DO SISTEMA

E fundamental conhecer bem a arquitetura do Android e fazer uso desses conhecimentos


na hora da programac ao. O bom entendimento de todas as camadas da arquitetura per-
mitir a que o desenvolvedor tire proveito das vantagens que o sistema oferece nativamente,
podendo assim criar aplicac oes mais robustas e de alto-nvel.
A gura 3.1 mostra a arquitetura do sistema Android.
Figura 3.1: Arquitetura do Sistema (fonte: Application Fundamentals)
A seguir veremos em detalhes cada camada da arquitetura. A abordagem comecara
pela parte de baixo da pilha, no Kernel do Android.
5
CAP

ITULO 3. ARQUITETURA DO SISTEMA 6


3.1 Kernel Linux
O Android utiliza o Kernel Linux como camada de abstrac ao de hardware. Em outras
palavras, o Kernel Linux constitui o n ucleo do Android, realizando todas as fun coes
cabveis `a um sistema operacional.
A versao utilizada no Android e a 2.6 do Linux (a mesma utilizada pelos atuais
sistemas operacionais Linux) para todos os servicos do n ucleo do sistema, como seguranca,
gerenciamento de memoria, gerenciamento de processos, rede, drivers, entre outros.
Alem disso, foram feitas melhorias no Kernel para que ele tenha um melhor de-
sempenho em dispositivos m oveis.
Um pouco de historia
O Kernel Linux foi criado em 1991 por Linus Torvalds. Ele queria desenvolver um sistema
Unix-like que rodasse em processadores Intel 80386. Antes de desenvovler o Linux, Linus
chegou a estudar o Minix, o sistema de Andrew Tanenbaum, mas nao cou satisfeito com
a arquitetura deste e resolveu (por hobby, como ele mesmo disse) criar o seu proprio
sistema.
O sistema operacional Linux que utilizamos em nossos computadores e uma junc ao
do Kernel (criado por Linus) mais uma grande quantidade de outros utilit arios e aplicati-
vos abertos e fechados criados por diversas empresas e programadores espalhados pelo
mundo todo.
Assim, aliado ` a esses parceiros o Kernel escrito por Linus se tornou o poderoso
sistema operacional Linux como conhecemos hoje, um ambiente completo, seguro e est avel
para desktops, servidores e sistemas embarcados.
O Kernel do Linux n ao foi criado com o intuito de ser port avel, mas as coisas
evoluram nesse sentido. Hoje o kernel Linux e um dos Kernels mais port aveis que se
conhece. Ele tem sido utilizado em:
Computadores - PDAs, netbooks, notebooks, desktops, servidores e mainframes
Pequenos dispositivos eletronicos - Relogios, eletrodomesticos,
CAP

ITULO 3. ARQUITETURA DO SISTEMA 7


Celulares, vdeo-games, entre outros
Arquiteturas compatveis com o Linux
O site ocial da Debian GNU/Linux (atualmente umas das mais importantes distribui coes
Linux) possui uma FAQ
1
na qual s ao explicados, entre outros, alguns pontos sobre
compatibilidade do sistema Linux. Em resposta ` a questao sobre quais arquiteturas de
hardware rodam Linux, o site disponibiliza a seguinte resposta:
O Debian GNU/Linux inclui os codigos-fonte completos para todos os
programas inclusos, portanto, eles devem rodar em qualquer sistema que seja
suportado pelo kernel Linux; veja a FAQ do Linux para detalhes.
A versao atual do Debian GNU/Linux , a 5.0, contem uma completa
distribuic ao binaria para as seguintes arquiteturas:
i386: essa cobre os PCs baseados em Intel e processadores compatveis,
incluindo Intel 386, 486, Pentium, Pentium Pro, Pentium II (tanto Klamath
quanto Celeron), e Pentium III, e os processadores compatveis da AMD,
Cyrix e outros, compatveis com estes.
m68k: essa cobre as maquinas Amiga e Atari que possuem processadores
Motorola 680x0 (para x >= 2); com MMU.
alpha: sistemas Alpha da Compaq/Digital.
sparc: essa cobre os sistemas SPARC da Sun e a maioria dos sistemas
UltraSPARC.
powerpc: essa cobre algumas m aquinas IBM/Motorola PowerPC, incluindo
m aquinas CHRP, PowerMac e PReP.
arm: m aquinas ARM e StrongARM.
Trecho retirado do site da Debian GNU/Linux
1
Disponvel em http://www.debian.org/doc/manuals/debian-faq/ch-compat.pt-br.html
CAP

ITULO 3. ARQUITETURA DO SISTEMA 8


3.1.1 Linux no Android
O Linux tem se mostrado um sistema operacional bastante robusto e est avel, inclusive
sendo usado em servidores e, cada vez mais, em empresas. Se, no seu surgimento, o Linux
era usado praticamente s o em universidades e apenas por especialistas na area (geralmente,
no meio academico), cada vez mais o Linux tem ocupado um lugar de destaque em outras
areas, seja em ambientes comerciais ou para uso pessoal.
Alem do mais o sistema tem sido constantemente melhorado. Normalmente, a
cada seis meses sai uma atualizac ao com melhorias e correc oes de problemas encontrados
por usuarios no mundo todo. Assim, as falhas (ate os melhores sistemas tem falhas) s ao
encontradas e corrigidas mais rapidamente que em qualquer outro sistema operacional
que se conhe ca.
Essas e outras raz oes contriburam para que o Linux fosse usado no Kernel da
plataforma Android. O Kernel atua como uma camada entre o hardware e o restante dos
softwares.
A gura 3.2 apresenta o Kernel Linux e seus componentes.
Figura 3.2: Kernel Linux
Android nao e Linux
Embora o Kernel Android seja baseado no Kernel do Linux, ele nao e um sistema Linux,
pois:
N ao possui sistema nativo de janelas
N ao possui suporte ` a biblioteca glibc
N ao inclui o mesmo conjunto de utilit arios dos sistemas Linux (e.g., dbm do RedHat
ou Ubuntu)
CAP

ITULO 3. ARQUITETURA DO SISTEMA 9


Por que utilizar o Kernel do Linux?
Se o Android nao e um sistema Linux, porque ent ao utilizar o Kernel do Linux? Qualquer
conhecedor de sistemas operacionais poderia responder essa pergunta. O Linux oferece
recursos que o tornam o mais indicado para ser utilizado no Android.
Excelente gerenciamento de processos e mem oria - Segundo [Brady, 2008], O Linux
possui gerenciamento de processos e memoria, como nenhum outro sistema possui
Modelo de seguranca baseado em permissoes - Controle rgido de permiss oes na qual
cada usuario tem determinados privilegios sobre cada arquivo
Drivers - O Linux tem um modelo de drivers que permitiu aos desenvolvedores
da plataforma criar uma abstrac ao entre os dispositivos de hardware (e.g. LCDs,
TouchScreen, Keyboard, etc) e os software que eles utilizam
Suporte para bibliotecas compartilhdas -

E o que se costuma chamar de pluggable
architecture (arquitetura plug avel), quando um sistema permite plugar diversos
componentes com muita facilidade, etc . . .
Open-Source
Talvez a mais forte caracterstica do Linux e que ele e um sistema Open-source (i.e., de
c odigo aberto). A comunidade que mantem o Linux e bastante numerosa e tem acres-
centado in umeras qualidades que tornaram o Linux uma potencia em termos de sistema
operacional.
Melhorias do Kernel
Alguns programas foram acrescentados ao Kernel para que ele pudesse se adequar aos
dispositivos moveis. Dentre os principais programas, podemos destacar os seguintes:
Alarm - Driver para prover temporizadores e func oes b asicas de alarmes (e.g., ligar
ou desligar o aparelho)
Ashmem (Android shared memory) - Permite que as aplicacoes compartilhem memoria
CAP

ITULO 3. ARQUITETURA DO SISTEMA 10


Binder - Gerencia a intercomunicacao entre processos. No Android todas as aplica coes
rodam em processos diferentes e as vezes e necess ario que haja comunicacao entre
processos para compartilhar dados. Tipicamente, qualquer comunicacao entre pro-
cessos (IPC) pode causar um overhead signicativo e ainda, falhas de seguran ca. O
Binder foi criado para resolver estes problemas
Power Management - Gerenciador de energia - Baseado no projeto OpenBinder
2
,
entre outros
Mais informac oes
Informac oes sobre o Kernel Linux podem ser obtidas na p agina ocial dos desenvolvedores
do Kernel Linux
3
.
O c odigo-fonte do Kernel Android est a disponvel para an alise, estudos e cola-
borac ao no seguinte repositorio: http://git.android.com.
3.2 Bibliotecas
A proxima camada da arquitetura e a camada das bibliotecas. Todas elas foram escritas
em C e C++.
Figura 3.3: Bibliotecas
Segundo [Cleron, 2007c], deste nvel
e que vem todo o poder, ou melhor, a ro-
bustez da plataforma.
Como todas as classes foram escri-
tas em C / C++ iremos comecar falando
da biblioteca Libc ou melhor, Bionic Libc.
Assim iremos entender melhor como funcionam as bibliotecas de c odigo C da plataforma
Android.
[Brady, 2008] divide as bibliotecas em quatro partes. Sao elas:
2
www.open-binder.org
3
www.kernel.org
CAP

ITULO 3. ARQUITETURA DO SISTEMA 11


3.2.1 Bionic Libc
Bionic Libc e uma implementacao especca da biblioteca Libc, otimizada para uso em-
barcado. Novamente, que que claro que esta biblioteca e diferente dos ambientes de
programac ao em C encontrados em sistemas Linux, como Ubuntu ou Fedora.
Por que criar uma nova Libc?
Com certeza e um grande trabalho manter uma nova implementac ao de uma biblioteca
pr opria da linguagem C. Foram tres fatores fundamentais que contribuiram para a decis ao
de criar uma nova biblioteca.
1. Licenca - Libc utiliza licenca GPL. A licenca GPL e uma licensa de software livre.
Dentre as especicacoes da licenca GPL, podemos destacar uma delas como a mais
importante: todos os trabalhos derivados de projetos com licenca GPL tem que ser
licenciados sob a mesma licen ca (i.e. se 1% da sua aplica cao utilizar algum projeto
sob a licen ca GPL, ent ao a sua aplicac ao inteira ter a de ser GPL tambem).
Segundo a Free Software Foundation, essa medida e necess aria para proteger os
autores e desenvolvedores.
A biblioteca criada no projeto Android, a BionicC e distribuda sob a licenca BSD.
Os c odigos sob a licenca BSD podem ser utilizados em softwares livres ou softwares
propriet arios
4
. Embora o Android seja um projeto de software livre e importante
para algumas empresas ter a liberdade de ter seus softwares bem guardados, ou seja,
estas empresas terao a possibilidade de possuir c odigo-fechado mesmo junto com um
projeto de codigo aberto.

E o caso por exemplo da empresa Apple e da Microsoft,
que utilizam protocolos de rede abertos (nas suas aplicacoes de rede e servidores)
em seus sistemas operacionais. N ao faria sentido estes dois sistemas operacionais
serem obrigados a utilizar a licenca GPL apenas porque eles utilizam uma pequena
parte do software sob esta licenca.
Por nal, foi utilizada no Android a licensa BSD para n ao haver problemas de codigo
propriet ario.
2. Tamanho - Para um desktop com GBs de memoria RAM pouco importa o tamanho
4
Apenas com o conhecimento dos autores e pequenas restri coes
CAP

ITULO 3. ARQUITETURA DO SISTEMA 12


de aplicativos em C, mas para um dispositivo movel e diferente. A biblioteca Bionic
Libc e realmente muito pequena, tem 200K, aproximadamente metade do tamanho
da biblioteca GLibc. Isso representa um grande impacto se pensarmos em m ultiplos
processos rodando ao mesmo tempo num dispositivo m ovel. E isso realmente ir a
acontecer pois no Android cada aplica cao ir a rodar sobre uma inst ancia da biblioteca
Bionic libc.
3. Rapidez - Toda biblioteca deve ser r apida, principalmente nos dispositivos moveis.
Alem do tamanho e necessario que as bibliotecas sejam rapidas e ecientes mesmo
quando v arias inst ancias forem criadas. Mesmo para um dispositivo m ovel e comum
que uma aplicacao (inclusive o pr oprio sistema operacional) se utilize de centenas
de threads para realizar as mais diversas func oes.
Para aumentar a velocidade das aplicac oes que utilizam threads (praticamente to-
das hoje em dia) foi feita a re-implementac ao da biblioteca pthread. Enquanto a
biblioteca pthread convencional tem tamanho de cerca 12 KB a biblioteca re-escrita
tem apenas 4 KB.
Alem das vantagens acima citadas, tambem foram integrados ` a biblioteca func oes
para a utiliza cao de servicos especcos do Android:
Propriedades do sistema - atraves das func oes getprop e setprop e possvel obter
e modicar propriedades do sistema operacional ou trocar informacoes entre processos.
H a propriedades que sao visveis no sistema inteiro (algumas propriedades n ao podem ser
modicadas, elas comecam com as letras ro., de read-only). A seguir os prototipos das
func oes:
int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);
Onde: a) key = identicac ao da propriedade, geralmente algo como my.system.property
b) const = buer que ira guardar as informac oes e c) default value = valor padrao da
propriedade
CAP

ITULO 3. ARQUITETURA DO SISTEMA 13


Capacidades de Log - algumas funcoes para criar arquivos de log e tornar possvel
realizar o debbug das aplicac oes nativas.
LOGI(Logging a message with priority Info);
3.2.2 Bibliotecas de func oes
O Android possui varias bibliotecas, ent ao n ao iremos falar de todas (ate porque a maioria
j a e conhecida dos usu arios). [Cleron, 2007c] dene como sendo as mais importantes
bibliotecas:
WebKit
O WebKit e um engine (i.e., motor) de browsers. Ele e o respons avel por analisar o c odigo
das p aginas Web e criar a visualizac ao que os navegadores exibem (processo conhecido
por renderizac ao). Em outras palavras o WebKit e o motor que faz um browser funcionar.
Atualmente, os seguintes browsers utilizam o WebKit:
Safari, da Apple
Chrome, da Google
Epiphany, navegador padrao do Gnome
Midori
Arora
OmniWeb
iCab
Shiira
ABrowse
Desta lista, merecem destaque os navegadores da Google e da Apple, grandes
empresas hoje no ramo de software.
CAP

ITULO 3. ARQUITETURA DO SISTEMA 14


Media Framework
Esta biblioteca e respons avel por fornecer suporte a todo tipo de arquivos de mdia. Ela
e baseada no pacote de vdeos OpenCore. As bibliotecas oferecem suporte para visualizar
e gravar em diversos formatos de audio, vdeo e tambem imagens. Entre esses formatos
podemos destacar alguns mais populares:
MPEG4
H.264
MP3
AAC
AMR
JPG
PNG
Com esses codecs e possvel ter uma rica experiencia com audio e vdeo. Os desen-
volvedores nao precisam se preocupar em desenvolver ou importar codecs para estes tipos
de arquivo, pois o sistema operacional lhes oferece, nativamente, esse suporte.
SQLite
O SQLite e um banco de dados otimizado para dispositivos m oveis. Como sugere o nome,
e um banco de dados mais leve, apropriado para ambientes com menos recursos.
Com um banco dados relacional as aplicacoes tem mais recursos para armazenar
suas informacoes de forma estruturada e assim, criar aplicac oes mais robustas, rodando
com um banco de dados local.
3.2.3 Servidores nativos
S ao processos rodando em background para realizar tarefas para controlar os dispositivos
de entrada e sada do dispositivo.
CAP

ITULO 3. ARQUITETURA DO SISTEMA 15


Gerenciador de superfcies
Biblioteca e respons avel por desenhar na tela, ou melhor, apresentar todas as interfaces
gr acas das aplicac oes e do pr oprio sistema operacional. A troca de janelas e gerencia-
mento de tudo que for GUI (interface gr aca com o Usuario) cabe `a esta biblioteca.
OpenGL ES e SGL
Bibliotecas para gr acos 2D e 3D, que podem ser combinados numa mesma aplicacao. O
n uclo (core) dos gr acos e formado por essas duas bibliotecas, ambas livres.
Gerenciador de audio
Enquanto o gerenciador de superfcies e responsavel pelos dispositivos de display, o ge-
renciador de audio e o respons avel pelo gerenciamento de todos os dispositivos de sada
de audio.
O gerenciador de audio se encarrega de todas as formas de sada de audio do
dispositivo.
3.2.4 Bibliotecas de abstracao do hardware
Entre o hardware e o nveis superiores da arquitetura do Android se encontra a camada
de abstrac ao de hardware. Acima da camada do Kernel linux h a varios fabricantes de
hardware que irao fazer drivers para se comunicar com o software rodando no Android.
Para mostrar melhor o papel desta camada, a gura 3.4 mostra onde a camada de
abstrac ao de harware se encaixa dentro da gura 3.1 (Arquitetura do Android, p agina 5).
A camada de abstrac ao tem como objetivo denir as interfaces que o Android
requer que os drivers de hardware implementem para que se encaixar (plugar) ao sistema.
Essa camada separa a logica da plataforma do Android das interfaces de hardware.
[Brady, 2008] explica que a equipe tentou criar um padr ao, um conjunto de APIs
para denir como um hardware ir a se comunicar com o dispositivo. Da mesma forma que
o Android SDK fornece aos desenvolvedores classes e interfaces que possibilitam que ele
CAP

ITULO 3. ARQUITETURA DO SISTEMA 16


faca seu pr oprio c odigo e rode dentro da arquitetura, com o hardware vai acontecer de
maneira parecida.
3.3 Android Runtime (Ambiente de execucao)
Figura 3.4: Camada de abstrac ao de hardware
Este componente foi escrito ex-
clusivamente para o Android,
permitindo-lhe rodar programas
complexos em ambientes com
mem oria limitada, bateria limi-
tada, processamento limitado, en-
tre outros.
O ambiente de execucao do
Android e composto pela M aquina Virtual Dalvik, criada especialmente para o sistema
Android. Tambem temos as bibliotecas para se programar especicamente para essa
m aquina virtual. A seguir iremos falar sobre estes dois itens, a m aquina virtual e as suas
bibliotecas.
3.3.1 Maquina Virtual Dalvik
Figura 3.5: Android Runtime
A m aquina virtual Dalvik roda aplicac oes
no formato .dex (do acronimo em ingles
Dalvik Executable). As aplicac oes do An-
droid ir ao rodar no ambiente virtual Dal-
vik sempre. Isso signica que qualquer que
seja o dispositivo, o ambiente em que o pro-
grama roda ser a sempre o mesmo (mesmo sendo celulares completamente diferentes ou,
ainda, mesmo nao sendo celulares), dando portabilidade `as aplicac oes escritas para o
Android.
A m aquina virtual Dalvik nao roda bytecodes Java, ela roda apenas arquivos to
tipo .dex. Se o Android precisar executar um pacote .jar ele ir a primeiro converter as
classes para o formato .dex, que e menor e depois ir a rodar essas classes.
CAP

ITULO 3. ARQUITETURA DO SISTEMA 17


Cada aplicac ao no Android roda no seu pr oprio processo, com a sua pr opria
inst ancia da M aquina Virtual Dalvik. Em outras palavras um dispositivo rodando An-
droid pode rodar m ultiplas m aquinas virtuais de maneira eciente, e cada processo roda
em cima da sua propria m aquina virtual.
A m aquina virtual Dalvik depende do Kernel Linux para fornecer funcionalidades
como threading and gerenciamento de mem oria de baixo-nvel, isso melhora signicante-
mente o desempenho das aplicac oes [Brady, 2008].
3.3.2 Core Libraries
O Android conta com uma serie de bibliotecas para prover as mesmas funcionalidades
b asicas disponveis na linguagem Java. Observe na gura 3.1 (Arquitetura do Sistema,
p agina 5) que tudo o que esta em azul foi escrito em Java. Por isso as bibliotecas do core
est ao em azul.

E importante ressaltar que todas as classes em Java foram reescritas para uso
especco pela M aquina Virtual Dalvik. Apesar de algumas classes serem bem parecidas
(ou identicas) com as classes Java, elas foram reescritas. Portanto, o Android n ao usa as
mesmas classes Java.
Para se ter uma nocao das classes Java re-implementadas segue uma pequena lista
com as classes mais comuns, todas reescritas para o Android:
Classes Java
java.io
java.math
java.net
java.security
java.sql
java.util
Outras
junit.framework
CAP

ITULO 3. ARQUITETURA DO SISTEMA 18


org.apache.http
org.json
org.w3c.dom
org.xml, entre outras
O objetivo aqui n ao e falar das classes especicamente. Quem j a est a familiarizado
com as classes Java n ao ter a problemas para entender o funcionamento das classes do
Android.
3.4 Framework de aplicacao
Um nvel acima do ambiente de execu cao temos o Framework de aplica cao, totalmente
escrito em linguagem Java.
Um Framework e um conjunto de modulos integrados que visam o reaproveita-
mento de codigo, aumentando a produtividade na hora do desenvolvimento. A ideia
principal de um framework e proporcionar `a uma determinada linguagem uma serie de
recursos para elevar o nvel de abstra cao dessa linguagem.
No Android, esses frameworks s ao uma caixa de ferramentas (comumente chamados
de toolkit) que todas as aplicac oes utilizam. Estas aplicac oes incluem implementac oes do
celular (como por exemplo as aplicac oes Home e Phone), aplicacoes escritas pela equipe
do Android (Google) e aplica coes escritas por n os, programadores. Todas as aplicac oes
usam o mesmo framework e as mesmas APIs.
Figura 3.6: Framework de aplicac ao
Entre os frameworks, podemos destacar os frameworks de servico, aqueles cuja
existencia e fundamental para a plataforma inteira. Alguns desses frameworks trabalham
em background de maneira transparente para o programador.
A seguir ser ao descritos alguns dos mais importantes componentes desta camada:
CAP

ITULO 3. ARQUITETURA DO SISTEMA 19


3.4.1 Activity Manager
Estas atividades sao servi cos rodando em background que ir ao gerenciar todo o ciclo de
vida de uma aplicac ao Android
Todas as tarefas relativas a troca de contexto e gerenciamento de processos s ao
realizadas por esse componente.
3.4.2 Package Manager
Este componente e respons avel por gerenciar a instalac ao e atualizacao das aplicac oes no
Android. O package manager (gerenciador de pacotes) funciona de maneira parecida com
outros gerenciadores de pacotes de sistemas Linux como por exemplo:
Yum (Fedora)
Synaptics (Debian e Ubuntu)
Software Update (Mac OS)
3.4.3 Telephony Manager
Contem as APIs utilizadas na Aplicac ao Phone. Todas as aplicac oes relativas `a um
celular (conceito basico de um celular: fazer ligac ao) s ao fornecidas por este componente.
Assim, a aplica cao Phone do Android (padr ao do sistema) utiliza estas APIs e todos
os programadores que desejarem usar algum recurso ligado ` a telefonia poderao utilizar
tambem esta classe.
3.4.4 Content Providers
Os provedores de conte udo s ao uma exclusividade do Android. Este framework prove
recursos para que as aplicacoes compartilhem dados entre si. Os dados podem ser arma-
zenados no dispositivo atraves de arquivos ou do banco de dados SQLite.
Pode ser que, em determinado momento, uma aplicac ao crie dados e queira dis-
ponibilizar estes para uma aplicacao de terceiros. O contrario tambem pode ser verdade,
CAP

ITULO 3. ARQUITETURA DO SISTEMA 20


em determinado momento podemos precisar de dados gerados por uma outra aplicac ao.
Repare que este recurso enfatiza bem o signicado de framework, no sentido de
que as aplicacoes s ao mais integradas, visando escrever menos c odigo, com transparencia
para o programador.
Todos os contatos do Android sao gerenciados e armazenados pela aplicac ao Con-
tacts. Esta classe e um otimo exemplo de uma aplicacao provedora de conte udo. Todos
os objetos da classe (i.e., todos os contatos) sao disponibilizados atraves dos provedores
de conte udo para qualquer aplicac ao que queira utilizar esses contatos.
3.5 Aplicacoes
O Android vai rodar com varias aplica coes em seu n ucleo (core) incluindo cliente de e-
mail, programas de SMS, calend ario, mapas, navegador, contatos, entre outros. Todas
aplicac oes sao escritas em Java.
Figura 3.7: Applicacoes
As aplicac oes de terceiros tambem rodarao nesta camada, a camada mais alta da
plataforma. Nesta camada e que v ao estar todas as aplica coes de alto-nvel. Pode ser
necess ario implementar em qualquer uma das outras camadas, mas isso s o para casos
mais especcos (e.g., numa aplica cao CPU-Bound pode ser necessaria a utiliza cao da
linguagem C para se obter melhor desempenho).
3.5.1 Componentes da aplicacao
Uma caracterstica central nas aplicac oes do Android e o fato de elas poderem fazer uso
de elementos de outras aplica coes (claro que apenas se as outras aplicac oes permitirem
e disponibilizarem estes recursos). Para isso, sua aplicac ao nao precisa incorporar nem
linkar codigo de outras aplicacoes. Basta referenciar a activity da outra aplica cao que
voce necessita.
CAP

ITULO 3. ARQUITETURA DO SISTEMA 21


Para que isso funcione, o sistema deve ser capaz de iniciar uma aplicac ao quando
qualquer parte dela for requerida e instanciar os objetos Java para aquela parte. Diferen-
temente das aplicac oes de outros sistemas, as aplicac oes do Android nao possuem apenas
uma func ao de entrada do programa (entry point) que sempre ser a chamada quando a
aplicac ao rodar (e.g., a func ao main()). No Android as aplicac oes possuem componentes
essenciais que o sistema pode instanciar e rodar quando for preciso.
H a quantro tipos de componentes:
Activities (Atividades)
Uma atividade consiste num servi co visual oferecido ao usuario, que pode ser uma lista
de contatos, um vizualizador de fotos, um player mp3. Poderamos por exemplo ter
uma atividade para mostrar as m usicas do celular, uma outra atividade para tocar uma
m usica selecionada, e ainda uma outra atividade para enviar a m usica por bluetooth
para outro aparelho. Embora todas estas atividades estejam fortemente relacionadas e
componham uma so aplicac ao, elas sao independentes umas das outras. Isso signica que
em determinado momento poderamos usar apenas o player de m usicas por exemplo.
Services
Um servi co n ao possui interface gr aca, ao inves disso roda em background, por um
perodo de tempo indenido.
Um bom exemplo de um servico e um player que utiliza um servico para tocar as
m usicas. O player em si pode estar ativo ou nao. O usu ario pode estar fazendo outras
coisas e mesmo assim a m usica deve continuar tocando.
Broadcast Receivers
Um receptor por broadcast e um componente que apenas recebe an uncios tanto do
sistema quanto de outras aplicac oes.
O sistema pode querer avisar por exemplo que a hora mudou ou ainda que a bateria
esteja acabando. Uma aplicacao poderia avisar que acabou o download de um arquivo no
servidor e o arquivo est a disponvel.
CAP

ITULO 3. ARQUITETURA DO SISTEMA 22


Uma aplicac ao pode ter varios receptores esperando por informac oes que achar
relevante para a aplicac ao.
Estes receptores n ao exibem nenhuma interface. Eles apenas avisam o sistema que
algo est a acontecendo. Cabe ao sistema saber se avisa o usuario ou apenas toma alguma
decis ao baseada na mensagem recebida. Na maioria das vezes que um sistema precisa
avisar o usuario de algo, ele ira utilizar o NoticationManager.
Content Providers
Um provedor de conte udo e o componente respons avel por tornar um determinado con-
junto de dados de uma aplicac ao disponvel para outras aplicac oes. Isso e feito atraves
de permissoes de usu arios. Como cada processo e como se fosse um usuario, ent ao cada
processo vai enxergar apenas os seus arquivos.
CAP

ITULO 3. ARQUITETURA DO SISTEMA 23


Conclus oes sobre a arquitetura
Observando a arquitetura do Android (captulo 3.1, p agina 5), pode-se observar que todas
as camadas da arquitetura utilizam, ou melhor, reutilizam componentes ja existentes e de
c odigo aberto, possibilitando a realizac ao de melhorias, quando preciso (como foi o caso
das bibliotecas libc, WebKit e outras citadas anteriormente). A esta a importancia de
uma plataforma totalmente aberta e talvez da tenha surgido a necessidade da criac ao da
plataforma Android. Poderamos comparar o Android com o Linux em alguns pontos,
como codigo livre e portabilidade.
Um dos objetivos de Linus Torvalds (criador do Linux) era mostrar o codigo a
quem quisesse ver para que os outros usuarios pudessem contribuir com o seu projeto.
E ele acertou nisso. A comunidade cientca abracou esta ideia e contribuiu (contribui
ate hoje) de maneira imensur avel para o desenvolvimento do Sistema Operacional. O
Android esta seguindo os passos do Linux.
Parte II
Desenvolvimento
24
4 FUNDAMENTOS DE PROGRAMAC

AO NO ANDROID
Nos captulos anteriores abordamos diversos conte udos relacionados ao Android, mas
sempre de uma forma bastante teorica. Este captulo visa abordar de uma forma mais
pr atica os principais conceitos ` a respeito de uma aplicac ao para o Android.
Nesta secao, todos os trechos de c odigo e palavras comuns nas classes e nos com-
ponentes do Android n ao ser ao traduzidos. Essa medida foi tomada exatamente para nao
confundir os leitores, j a que a documentac ao ocial encontra-se em ingles.
4.1 Linguagem e paradigma
Para desenvolver uma aplica cao basica (custom application) no Android e preciso conhecer
Java, XML e Programac ao Orientada `a Objetos. Segue uma breve descric ao de cada uma:
A linguagem Java e uma linguagem de programac ao orientada ` a objetos criada na
decada de 90 por uma equipe de programadores da Sun Microsystems. As caractersticas
mais marcantes da linguagem Java s ao as seguintes:
orienta cao `a objetos e
portabilidade, independencia de plataforma (write once, run anywhere),
A Programacao Orientada `a Objetos (POO) e um paradigma de programac ao que
surgiu ainda na decada de 60. Nessa epoca, a complexidade do hardware e software
estavam crescendo e em contra-partida a qualidade dos softwares comecava a diminuir.
Nesse contexto, a orienta cao `a objetos surgiu trazendo melhorias na forma de se modelar
um sistema. Nao iremos entrar em detalhes ou explicar melhor como funciona o paradigma
de orientac ao ` a objetos, pois iramos estar nos distanciando muito do foco. Espera-se que
25
CAP

ITULO 4. FUNDAMENTOS DE PROGRAMAC



AO NO ANDROID 26
o leitor tenha algum conhecimento previo de POO, nao s o para o bom entendimento desta
sec ao, mas tambem pra se desenvolver qualquer software no Android.
A linguagem de marcacao XML (do acronimo em ingles eXtensible Markup Language),
trata-se de uma linguagem de marcac ao para representar qualquer tipo de dado e trocar
esses dados entre qualquer tipo de aplicacao. O objetivo principal do XML e ser port avel,
n ao s o quanto `a plataforma como tambem quanto `a aplicacao. Em outras palavras, um do-
cumento XML deve poder ser lido em qualquer plataforma computacional e por qualquer
aplicac ao capaz de ler e processar texto.
Existem muitos derivados de XML como, por exemplo: a) XHTML, b) MathML,
c) MusicXML, d) SVG (para criac ao de gr acos), e) Atom, f) RSS, entre outros. Cada
formato precisa ter uma estrutura conhecida para poder trocar informac oes com outras
plataformas/aplica coes.
No Android as aplicac oes s ao escritas utilizando a linguagem de programacao Java
e XML. Conforme vimos nos par agrafos anteriores, estas duas linguagens proporcionam
algumas caractersticas importantes que zeram delas linguagens conhecidas e utilizadas
no mundo inteiro para os mais diversos ns.
4.2 Distribuicao das aplicacoes
Tanto os arquivos Java quanto os demais (arquivos de recursos, imagens, etc) s ao em-
pacotados, atraves de um programa chamado aapt tool, para um formato de pacotes
do Android, cuja extensao e .apk (de Android Package). Estes arquivos (pacotes na
verdade) s ao o meio de se distribuir e instalar programas em dispositivos m oveis com o
sistema Android.
4.3 Independencia e estabilidade
Cada aplicac ao rodando no Android e totalmente independente das outras aplica coes.
Isso proporciona estabilidade para as aplica coes.
CAP

ITULO 4. FUNDAMENTOS DE PROGRAMAC



AO NO ANDROID 27
Entre as principais caractersticas das aplicacoes do Android, destacam-se as se-
guintes:
Por padr ao cada aplicac ao roda no seu pr oprio processo Linux
Cada processo roda na sua pr opria m aquina virtual java (VM)
A seguranca e garantida atraves de um id de usuario Linux (i.e., cada aplicac ao
recebe um id de usuario Linux), assim, as permiss oes sao conguradas de modo
que os arquivos de uma aplicac ao ser ao visveis apenas para aquele usu ario, ou seja,
apenas para a propria aplica cao
Conforme citado na secao 3.5 (p agina 20), ha quantro tipos de componentes prin-
cipais nas aplicac oes do Android. A seguir sera dada uma descric ao mais detalhada do
componente Activity.
4.4 Activities
Todo componente do sistema que interagir de alguma forma com o usu ario dever a ter pelo
menos uma activity, um processo gerenciado pelo sistema operacional.
Como todo processo, as activities possuem um ciclo de vida. A gura 4.1 (Ciclo
de vida de uma activity) mostra o ciclo de vida completo de uma activity.
Na linguagem Java utilizamos o metodo est atico main() para representar o ponto
de partida da aplicac ao (i.e., o primeiro metodo que ser a chamada quando o programa
for iniciado). No Android n ao e diferente, precisamos de uma referencia para dizer ao
sistema qual classe queremos chamar quando o programa for iniciado.
O Android ainda possui a caracterstica de poder ter uma ou n activities. Isso lhe
d a a possibilidade de denir v arias classes-chave do sistema, classes estas que podem
ser instanciadas independente umas das outras. Em outras palavras, o Android n ao tem
apenas um ponto de entrada para suas aplicac ao, ao inves disso ele possui v arias activities,
como se fosse um programa convencional com varios metodos main(). Isso e pertinente
porque no Android uma aplicac ao tem a possibilidade de chamar uma activity de outra
aplicac ao.
CAP

ITULO 4. FUNDAMENTOS DE PROGRAMAC



AO NO ANDROID 28
Um exemplo pratico poderia ser uma aplicac ao de m usica que em determinado
momento queira mostrar a capa do album da m usica que est a tocando. Se alguma outra
aplicac ao (especializada em fotograas) fornecer uma activity, o programa de m usica
podera invocar essa activity como se zesse parte do pr oprio programa.
Ciclo de vida de uma Activity
A gura 4.1 mostra o ciclo de vida de uma activity do ponto de vista do sistema opera-
cional.
Figura 4.1: Ciclo de vida de uma activity (fonte: Activity Android Developers)
CAP

ITULO 4. FUNDAMENTOS DE PROGRAMAC



AO NO ANDROID 29
O Android inicia o processo quando uma aplicac ao solicita e ele mesmo destroi o
processo quando o processo n ao est a mais em uso e outra aplicacao necessita de recursos
do sistema (de forma parecida com o Garbage Collector, do Java). A aplicac ao libera
mem oria e recursos e o Android salva o seu contexto para que ela possa ser executada
do mesmo ponto onde estava quando foi fechada. Isso tudo de forma transparente para o
usu ario.
Uma classe activity
Para ser uma activity, uma classe deve extender a classe android.app.activity. Uma ac-
tivity deve obrigatoriamente implementar o metodo onCreate(Bundle savedInstanceState)
e pode ainda re-implementar os outros metodos herdados da classe android.app.Activity.
Figura 4.2: Super classes de Activity
A gura 4.2 mostra as super clas-
ses da classe Activity. V arias classes uti-
lizam o metodo getApplicationContext()
(android.content.ContextWrapper) para ob-
ter uma inst ancia da aplica cao.
Quando duas classes compartilham recursos ou informac oes, uma classe precisa en-
viar uma referencia dela para a outra. Vamos supor que uma classe SistemaDeInformacoes
precise mostrar informacoes na tela. Para isso ela chama outra classe MostraInformacoes.
A classe mostra informac oes precisa de uma activity para mostrar as informac oes, por
isso ela precisa de uma referencia da classe SistemaDeInformacoes. Essa referencia tem
de ser passada por par ametro quando uma classe chama a outra, atraves do metodo
getApplicationContext(). Assim, a aplicac ao que receber esta referencia podera exibir
dados na tela da activity principal.
O codigo-fonte 4.1 mostra os metodos relacionados ao ciclo de vida de uma aplicac ao
que podem ser re-implementados na sua activity.
C odigo-fonte 4.1: Principais metodos da classe Activity
1 public cl ass Ac t i vi t y extends Appl i cati onContext {
2 protected void onCreate ( Bundle s avedI ns t anceSt at e ) ;
3 protected void onStart ( ) ;
4 protected void onRestart ( ) ;
CAP

ITULO 4. FUNDAMENTOS DE PROGRAMAC



AO NO ANDROID 30
5 protected void onResume ( ) ;
6 protected void onPause ( ) ;
7 protected void onStop ( ) ;
8 protected void onDestroy ( ) ;
9 }
Assim, as activities s ao fundamentais na tarefa de identica cao dos principais
metodos e classes do sistema, criando componentes essenciais que podem ser invocados
sempre que necess ario.
Isso tudo traz desacoplamento de c odigo e reutilizac ao de componentes atraves de
activities denidas pelo seu programa ou, ainda, por programas de terceiros.
5 SERVIC OS BASEADOS EM LOCALIZAC

AO
A seguir iremos falar um pouco sobre servi cos baseados em localizacao (LBS, do acronimo
em ingles Location Based Services).

E importante ressaltar que na literatura tambem
encontramos o termo LBA (Location Based Applications) que, na pr atica, tem o mesmo
signicado.

E muito comum encontrar os dois termos se referindo ` a mesma coisa.
LBS e um termo abrangente usado para descrever diferentes tecnologias usadas
para encontrar a atual posic ao de um dispositivo [Meier, 2009].
Para entender melhor quais as fun coes de um LBS, pode-se fazer as seguintes
quest oes:
Onde estou?
O que est a perto de mim? (ou Do que estou perto?)
Como eu vou para . . . ?
Um servico baseado em localiza cao deve ser capaz de responder todas ou pelo
menos uma destas quest oes.
As aplicac oes baseadas em localizacao podem ser usadas em v arios contextos, desde
aplicac oes pessoais de entretenimento ate aplicac oes comerciais mais relevantes, como
em programas do governo, ou quest oes de seguranca, aplica coes onde a localizac ao e um
fator realmente importante (questao de vida ou morte).
5.1 Aplicacoes
Alguns exemplos de aplicac oes baseadas em localizac ao:
Navega cao num lugar desconhecido
31
CAP

ITULO 5. SERVIC OS BASEADOS EM LOCALIZAC



AO 32
Procura de servicos especcos baseado na localiza cao do usu ario que est a procu-
rando
Restreamento de pessoas ou objetos
Propaganda baseada em localizac ao
5.2 GPS
O GPS (do aconimo em ingles Global Positioning System) e um sistema de localizac ao
global baseado em satelites. Este sistema, criado pelo Departamento de Defesa dos Esta-
dos Unidos, permite informar `a um dispositivo a sua localizac ao exata em qualquer ponto
do globo terrestre, 24 horas por dia e independente de condic oes clim aticas.
O sistema de GPS funciona fazendo uma triangulac ao entre tres componentes:
1. satelites espalhados por toda orbita terrestre, estac oes terrestres e dispositivos re-
ceptores GPS (espacial)
2. estacoes terrestres (de controle)
3. dispositivos receptores GPS (utilizador)
Os satelites enviam sinais por broadcast para os dispositivos receptores. Estes
dispositivos processam o sinal recebido e fazem um calculo da dist ancia entre o satelite
e o receptor atraves do tempo que o sinal demorou para chegar ate o aparelho receptor.
Este calculo e feito com rel ogios de alta precis ao. Quando o receptor realiza o c alculo,
ele obtem um permetro onde o seu aparelho pode estar. Ent ao ele calcula sua posic ao
baseando-se nos dados de tres salelites para poder fazer a triangulac ao dos pontos. Assim,
atraves da intersecc ao de mais de um satelite e possvel obter a sua localizac ao exata no
globo terrestre (coodernadas latitude e longitude). O GPS ainda utiliza um quarto satelite
para obter a altitude do receptor.
Hoje em dia temos sistemas GPS embracados em rel ogio, celulares, carros e diversos
tipos de objetos. Os servi cos baseados em localizac ao tem utilizado o GPS para criar
aplicac oes mais especcas, baseadas na localizac ao do usuario.
CAP

ITULO 5. SERVIC OS BASEADOS EM LOCALIZAC



AO 33
5.3 Mapas
Um mapa constitui uma representac ao virtual de uma area real.
H a especulacoes ` a respeito da real data do surgimento dos mapas. Mas sabe-se
que h a muito tempo os mapas tem sido usados como referencia por diversas civilizac oes
e culturas pelo mundo todo. Mesmo hoje em dia, quando j a conhecemos cada parte
do planeta (ou pensamos conhecer), os mapas nao deixaram de ser um artefato muito
importante nas nossas vidas, pelo contrario.
A palava mapa vem do Latim medieval mappa, que literalmente signicava, lenco
de papel. Quando os mapas come caram a ser desenhados em pequenos papeis, surgiu
a palavra mappa mundi, designando O mundo num lenco. Posteriomente a palavra
mappa passou a ser utilizado como representac ao gr aca do mundo.
A modernizac ao dos mapas gerou o que chamamos de servicos baseados em mapas,
ou MBS (do acr onimo em ingles Maps Based Services). A maioria destes servicos oferece
mapas da terra toda ou de algumas cidades e localidades em especco, como lugares
tursticos ou rotas ares, por exemplo.
H a uma relac ao forte entre os servicos baseados em localiza cao e os mapas. En-
quanto os servi cos de localizacao nos oferecem ferramentas de apoio (e.g., navegacao, to-
manda de decisao, escolha inteligente de rotas, etc), os mapas vem reforcar esses servicos,
permitindo aos servicos baseados em localizacao fornecer uma representa cao mais clara e
realista dos objetos e pessoas do mundo real.
Os mapas nao s ao necessariamente servicos baseados em localizac ao, mas seria
praticamente invi avel ter servicos de localizac ao sem os mapas.
Entre os servicos baseados em mapas mais conhecidos podemos citar o Google
Maps. A seguir iremos falar um pouco sobre ele.
5.4 Google Maps
O Google Maps e um servi co de pesquisa e visualizacao de mapas da Terra (e tambem
da Lua, de Marte, do Oceano e do Ceu) disponvel gratuitamente na web e desenvolvido
pela emprega Google (a mesma que desenvolveu o Android).
CAP

ITULO 5. SERVIC OS BASEADOS EM LOCALIZAC



AO 34
Na mensagem de lancamento, intitulada Mapeando seu caminho (Mapping your
way
1
), Bret Taylor (Gerente de Produtos) escreveu assim:
N os achamos que mapas podem ser uteis e divertidos, por isso decidimos
criar o Google Maps pra simplicar como chegar do ponto A ao ponto B . . .
Embora seja um programa com pouco tempo de vida (disponvel desde o dia 8
fevereiro de 2005), o Maps impressiona pela quantidade de recursos oferecidos tanto `a
usu arios comuns que ir ao utilizar de maneira mais simplista o servi co ate usu arios
avancados, que poder ao criar servicos utilizando as APIs disponibilizadas pelo Google
Maps.
5.5 LBS no Android
O Android prove um framework de localizac ao que pode ser usado na criac ao de aplicac oes
baseadas em localizacao. O Android tambem possui uma biblioteca do Google Maps
nativamente instalada que permite a criac ao de servicos baseados em mapas. Em outras
palavras, o Android prove todos os recursos necessarios para a criac ao de sosticados
sistema de localizac ao utilizando mapas.
A seguir estaremos entrando em detalhes sobre o pacote Location e o add-on Google
Maps API.
5.5.1 O pacote Location
O Android possui um pacote chamado Location que dene aplicac oes baseadas em loca-
lizac ao e servicos relacionados no Android (package android.location
2
).
Ate o momento da escrita desta monograa (novembro de 2009), as classes do
pacote sao:
Address
1
Dsponvel em http://googleblog.blogspot.com/2005/02/mapping-your-way.html
2
http://developer.android.com/reference/android/location/package-summary.html
CAP

ITULO 5. SERVIC OS BASEADOS EM LOCALIZAC



AO 35
Criteria
Geocoder
GpsSatellite
GpsStatus
Location
LocationManager
LocationProvider
A seguir alguns pacotes serao explicados:
LocationManager
Como o nome sugere, esta classe prove acesso ao sistema de servi cos de localiza cao.
Atraves da classe LocationManager os servicos baseados em localizac ao podem obter a
posic ao atual do dispositivo e se cadastrar para obter atualizac ao quando o aparelho
estiver em movimeno. Outra funcao interessante e que se pode resgistrar umas ou mais
coordenadas para que o dispositivo realize alguma ac ao quando entrar na circunferencia
do(s) ponto(s).
N ao se pode instanciar a classe LocationManager diretamente. Como se trata de
uma func ao do sistema, o proprio sistema oferece um metodo para se obter uma instancia
dessa classe:
Context.getSystemService(Context.LOCATION SERVICE).
Context.LOCATION SERVICE trata-se de uma constante utilizada para receber atu-
alizac oes de localizac ao. Ela esta denida na classe android.content.Context e o seu
valor e location.
CAP

ITULO 5. SERVIC OS BASEADOS EM LOCALIZAC



AO 36
LocationProvider
Depois de termos uma instancia do gerenciador de localizacao e necess ario escolher o
provedor de conte udo. Atraves de uma instancia da classe LocationManager, utiliza-se o
seguinte metodo para se obter a localizac ao imediata do dispositivo:
locationManager.getLastKnownLocation(provider)
A classe LocationManager possui duas constantes para passar como par ametro
provider: GPS PROVIDER e NETWORK PROVIDER. O servico pode ser baseado em GPS ou
na rede de telefonia celular.
Location
Tendo obtido provedor de localizacao, agora podemos solicitar ao provedor a localizacao
do dispositivo. Essa localizac ao pode ser dada de duas formas: imediata e periodica.
Para se obter a localizac ao imediata devemos chamar o metodo:
getLastKnownLocation(String provider).
Para se obter a localizac ao periodicamente devemos chamar o metodo:
requestLocationUpdates(String provider, long minTime, float minDistance,
LocationListener listener).
Estes dois metodos retornam uma inst ancia da classe Location. A classe Location
possui a localizac ao propriamente dita, ou seja, informac oes de latitude, longitude, alti-
tude. Ainda e possvel obter o tempo, velocidade, toler ancia dos dados obtidos (bearing
em ingles), etc.
GeoCoder e Address
Quando temos a localizac ao (objeto da classe Location) muitas vezes queremos traduzir
isso para o modo como entendemos a nossa posic ao na terra, atraves de enderecos. Essa
convers ao e chamada de geocoding.

E um termo tecnico que poderia ser traduzido de
forma livre para geo-codicac ao ou codicac ao geograca.
A classe GeoCoder do pacote Location cuida dessa codica cao. Para instanciar a
CAP

ITULO 5. SERVIC OS BASEADOS EM LOCALIZAC



AO 37
classe devemos invocar o construtor:
Geocoder(Context context, Locale locale)
Onde: Context e a classe herdada pela
Locale e a classe java.util.Locale, que determina a linguagem do dispositivo atraves
das seguintes constantes: a) CANADA b) CANADA FRENCH c) CHINA, d) CHINESE,
e) ENGLISH, f) FRANCE, g) FRENCH (frances em outros pases), h) GERMAN, i) GER-
MANY, j) ITALIAN, k) ITALY, l) JAPAN, m) JAPANESE, n) KOREA, o) KOREAN,
p) PRC, q) SIMPLIFIED CHINESE, r) TAIWAN, s) TRADITIONAL CHINESE, t) UK
e u) US .
6 APLICAC

AO ONDE ESTOU
Este captulo ir a apresentar uma aplicacao baseada em localizac ao chamada Onde Es-
tou. Para uma melhor compreensao dos estudos realizados ate aqui iremos comentar
todo o c odigo-fonte, mostrando as principais classes e conceitos e uma aplicac ao baseada
em localizacao para o Android.
A aplicac ao proposta e um LBS que se baseia em coordenadas GPS para mostrar
a localiza cao do dispositivo. A aplica cao rastreia o movimento do dispositivo (atraves do
GPS do mesmo) e mostra um mapa na tela contendo a sua posic ao em tempo real (para
isso, foi utilizada a API Google Maps).
Atraves desta aplicac ao iremos simular o movimento de um dispostivo rodando
Android andando pela Rua Sete de Setembro da cidade Curitiba.
Foi utilizado um arquivo .kml (Keyhole Markup Language) para criar um caminho
(composto de coordenadas e tempo) e fazer a simulacao de uma aplicac ao funcionando com
um GPS real. Para simular as funcionalidades de GPS o Android possui uma ferramenta
chamada DDMS (Dalvik Debug Monitor Service).
O arquivo possui dezessete coordenadas. Serao cadastrados dois pontos (coorde-
nadas 1 e 10) para que o sistema emita um alerta de aproximacao.
A seguir ser ao mostradas as quatro classes da aplicacao e descritos os principais
conceitos por tr as das mesmas.
38
CAP

ITULO 6. APLICAC

AO ONDE ESTOU 39
6.1 OndeEstou
A classe principal do programa, OndeEstou.java tem a func ao de um mapa mostrar na
tela e mostrar a atual posic ao do dispositivo, atraves de GPS.
O codigo completo da classe segue em anexo no apendice A.1, pagina A.1.
A instanciac ao do mapa e do seu controlador e feita da seguinte maneira:
41 myMapView = (MapView) fi ndVi ewById (R. i d . myMapView) ;
42 mapControl l er = myMapView. ge t Cont r ol l e r ( ) ;
Para que a declara cao funcione o objeto myMapView deve estar previamente de-
clarado no arquivo de layout:
10 <com. googl e . androi d . maps . MapView
11 andr oi d: i d=@+i d /myMapView andr oi d: l ayout wi dt h= f i l l p a r e n t

12 andr oi d: l ayout he i ght= f i l l p a r e n t andr oi d: enabl ed= t r ue


13 a ndr o i d: c l i c ka bl e= t r ue androi d: api Key=0
vVwwkcqB1Z whY4IYxwrT3eEVaYN6I9llTD7sQ />
Como a API do Maps e uma biblioteca externa, ela deve ser referenciada no arquivo
de congurac ao e solicitar acesso ` a internet:
11 <usesl i br a r y androi d: name=com. googl e . androi d . maps />
14 <usesper mi s s i on androi d: name= androi d . per mi s s i on . INTERNET />
Depois que o objeto myMapView e instanciado, podem ser adicionados controles que
permitem denir o tipo de mapa e os controles b asicos do mapa:
45 myMapView. s e t S a t e l l i t e ( f al se ) ;
46 myMapView. s e t Tr a f f i c ( true ) ;
50 myMapView. setBui l tI nZoomControl s ( true ) ; // mostra o c ont r ol e
de zoom
51 myMapView. di spl ayZoomControl s ( f al se ) ;
CAP

ITULO 6. APLICAC

AO ONDE ESTOU 40
Depois de desenhar o mapa na tela, e hora de comecar a pensar em localizac ao.
Para isso e feita uma requisicao do servico do sistema e a denicao do nosso provedor de
conte udo (GPS neste caso):
54 l ocati onManager = ( Locati onManager ) get Sys t emSer vi ce ( Context .
LOCATION SERVICE) ;
57 St r i ng pr ovi der = Locati onManager . GPS PROVIDER;
Nesse ponto, a aplicac ao tem acesso ao dispositivo de GPS do aparelho. Agora
e preciso requisitar as informac oes vindas do GPS. Para isso deve ser feita a primeira
requisic ao e cadastrar a activity existente (a classe OndeEstou estende MapActivity)
para receber atualiza coes de localiza cao:
60 Locati on l o c a t i o n = l ocati onManager . getLastKnownLocati on (
pr ovi der ) ;
63 updateMap( l o c at i o n ) ;
67 l ocati onManager . requestLocati onUpdates ( provi der , 2000 , 10 ,
68 l o c a t i o nLi s t e ne r ) ;
Agora a localizacao no mapa deve ser mostrada. A fun cao updateMap(Location
location) j a foi chamada na linha 63. O metodo updateMap atualiza o mapa cada vez
que o dispositivo mudar sua localiza cao. Cada vez que isso acontece ele realiza o processo
de geocoding para mostrar na tela o endereco onde o aparelho se encontra. Alem disso, o
metodo mostra as coordenadas na parte de cima do mapa:
107 / At ual i z a o mapa com a nova l o c a l i z a c a o /
108 private void updateMap( Locati on l oc at i on ) {
109
110 myLocationText = ( TextView) fi ndVi ewById (R. i d . myLocationText )
;
111
112 St r i ng l at LongSt r i ng ;
113 St r i ng addr e s s St r i ng = Endereco nao encontrado ;
114
115 i f ( l oc a t i on != nul l ) {
CAP

ITULO 6. APLICAC

AO ONDE ESTOU 41
116
117 // Def i ne a l o c a l i z a c a o at ual
118 Double geoLat = l o c a t i o n . get Lat i t ude ( ) 1E6 ;
119 Double geoLng = l o c at i on . getLongi tude ( ) 1E6 ;
120 GeoPoint poi nt = new GeoPoint ( geoLat . i ntVal ue ( ) , geoLng .
i nt Val ue ( ) ) ;
121
122 // At ual i z a o mapa
123 mapControl l er . s et Cent er ( poi nt ) ;
124
125 // Formata as coordenadas
126 Double l a t = l oc a t i on . get Lat i t ude ( ) ;
127 Double l ng = l o c a t i o n . getLongi tude ( ) ;
128 l at LongSt r i ng = Lat : + F. roundSi xDeci mal s ( l a t ) + ,
Long :
129 + F. roundSi xDeci mal s ( l ng ) ;
130
131 // Mostra as coordenadas na par t e de cima da t e l a
132 myLocationText . setText ( Minhas coordenadas : \ n +
l at LongSt r i ng ) ;
133
134 // Busca o endereco at r aves do GeoCoder
135 // Geocoder gc = new Geocoder ( t hi s , Local e . g e t De f aul t ( ) ) ;
136 Geocoder gc = new Geocoder ( this , Local e . ENGLISH) ;
137 try {
138 Li s t <Address> addr es s es = gc . getFromLocati on ( l at , l ng
, 1) ;
139 St r i ngBui l de r sb = new St r i ngBui l de r ( ) ;
140 i f ( addr es s es . s i z e ( ) > 0) { // se houver pel o menos
um endereco
141 Address addr es s = addr es s es . get ( 0) ;
142
143 // Formata o endereco
144 for ( i nt i = 0; i < addr es s .
CAP

ITULO 6. APLICAC

AO ONDE ESTOU 42
getMaxAddressLi neIndex ( ) ; i ++) {
145 i f ( i == ( addr es s . getMaxAddressLi neIndex ( )
1) )
146 sb . append ( addr es s . getAddressLi ne ( i ) ) ;
147 el se
148 sb . append ( addr es s . getAddressLi ne ( i ) ) .
append ( ) ;
149 }
150 }
151 addr e s s St r i ng = sb . t oSt r i ng ( ) ;
152 } catch ( IOExcepti on e ) {
153 }
154 } el se {
155 l at LongSt r i ng = Local i z acao nao encontrada ;
156 }
157
158 // Mostra na t e l a o endereco ob t i do at r aves do GeoCoder
159 Toast . makeText ( OndeEstou . this , addr es s St r i ng , Toast .
LENGTHLONG) . show( ) ;
160 }
Para que a aplicac ao funcione corretamente falta apenas mostrar como funciona
o listener (func ao que espera por eventos). Na lina 67 e passado por par ametro uma
vari avel chamada locationListener. Essa variavel e uma instancia de uma interface. Toda
instancia de interface deve implementar todas as func oes que a interface declarar. Neste
caso, foi implementado o metodo onLocationChanged(Location location) e o metodo
onProviderDisabled(String provider) (chamado quando o GPS do aparelho e desli-
gado). A implementacao destes dois metodos apenas chama a mesma func ao que atualiza
o mapa explicada anteriormente:
91 private f i nal Loc at i onLi s t e ne r l o c a t i o nLi s t e ne r = new
Loc at i onLi s t e ne r ( ) {
92 public void onLocati onChanged ( Locati on l oc a t i o n ) {
93 updateMap( l o c at i o n ) ;
94 }
CAP

ITULO 6. APLICAC

AO ONDE ESTOU 43
95
96 public void onProvi derDi sabl ed ( St r i ng pr ovi der ) {
97 updateMap( nul l ) ;
98 }
99
100 public void onProvi derEnabl ed ( St r i ng pr ovi der ) {
101 }
102
103 public void onStatusChanged ( St r i ng provi der , i nt s t at us ,
Bundle e xt r as ) {
104 }
105 };
CAP

ITULO 6. APLICAC

AO ONDE ESTOU 44
Considerac oes sobre a aplicacao
A aplicac ao Onde Estou foi criada com o intuito de mostrar as tecnicas de programac ao
de um LBS no Android.
Conforme o usu ario se movimenta, o aparelho interage com ele. Baseado na sua
localizac ao, o aparelho emite informac oes relevantes para o usu ario. Aqui nao estamos
entrando na quest ao de qual informa cao e importante para qual tipo de usuario. Estamos
apenas apresentando um software b asico que implenta funcionalidade de alertas baseados
em localizacao atraves de GPS.
Aplicac oes deste tipo poderiam ser utilizadas para emitir alertas enquanto o usu ario
est a dirigindo (algum tipo de alerta que seja interessante ao motorista, como por exemplo
o fato de que tenha ocorrido um acidente logo ` a frente, ou condic oes climaticas).
Entenda que o quesito localiza cao e o fator principal nestas aplicac oes. Com a
informac ao de localizac ao as aplicacoes podem realizar tarefas mais especcas e mais
interessantes para o usu ario. Imagine se voce estivesse indo pra a praia, e um sistema
lhe enviasse uma mensagem avisando que ocorreu um grave acidente na estrada rural de
uma cidade do interior. Esta informac ao nao tem importancia para quem est a indo pra
praia. Por outro lado seria muito interessante pra um cidad ao que est a viajando saber
que aconteceu algum tipo de problema e poder tomar alguma atitude.
Outro cen ario interessante pode ser o seguinte: uma aplicacao que mostra os pontos
da cidade onde o motorista deve diminuir a velocidade (estes podem podem ser radares,
escolas, areas em obras, etc).
O apendice B mostra a interface da aplicac ao Onde Estou.
Considerac oes nais
Os ambientes m oveis, principalmente os de telefonia celular tem causado um grande im-
pacto na area de desenvolvimento de software e podemos dizer que o crescimento e certo,
um caminho sem volta. O potencial das aplicacoes baseadas em localiza cao e grande e
ainda pouco explorado, mas com certeza num futuro breve essas aplica coes estar ao por
todo lugar (literalmente). O n umero de celulares no mundo j a e tres vezes maior que o de
computadores. Logo, n ao e pretencao dizer que o futuro do celular e um mercado solido
para quem quiser investir nele.

E essencial aos prossionais da area de tecnologia da informacao conhecer bem as


tecnologias m oveis e utiliza-las da melhor forma possvel, para atender as necessidades do
mercado e tornar estas tecnologias cada vez mais robustas e pr aticas.
. . . quem quiser investir em celulares e torn a-los mais adaptados ` a Internet
ter a sucesso. (Nelson Mattos - Vice-presidente de Engenharia da Google)
O objetivo inicial deste trabalho era, basicamente, fazer um estudo da plataforma
do Android e criar uma aplicac ao baseada em localizac ao. A escolha do sistema Android
foi baseada na gama de recursos que o mesmo possibilita aos programadores e no potencial
que o mesmo tem apresentado. Como se trata de um sistema novo, um estudo bem
detalhado sobre o sistema ser a muito util aos desenvolvedores e pessoas que desejarem
conhecer melhor a arquitetura e alguns conceitos b asicos do sistema. Este trabalho foca
nas caractersticas do sistema e nas vantagens oferecidas aos desenvolvedores.
Este trabalho visa contribuir com projetos futuros dentro da Universidade.
45
A C

ODIGOS-FONTE
Este captulo contem o c odigo-fonte completo da aplica cao proposta.
A.1 OndeEstou.java
C odigo-fonte A.1: Classe OndeEstou
1 package org . t hi agos ouza . ondeestou ;
2
3 import j ava . i o . IOExcepti on ;
4
5 import j ava . u t i l . Li s t ;
6 import j ava . u t i l . Local e ;
7
8 import com. googl e . androi d . maps . GeoPoint ;
9 import com. googl e . androi d . maps . MapActi vi ty ;
10 import com. googl e . androi d . maps . MapControl l er ;
11 import com. googl e . androi d . maps . MapView;
12 import com. googl e . androi d . maps . MyLocati onOverl ay ;
13
14 import androi d . content . Context ;
15 import androi d . l o c a t i o n . Address ;
16 import androi d . l o c a t i o n . Geocoder ;
17 import androi d . l o c a t i o n . Locati on ;
18 import androi d . l o c a t i o n . Loc at i onLi s t e ne r ;
19 import androi d . l o c a t i o n . Locati onManager ;
20
21 import androi d . os . Bundle ;
22
46
AP

ENDICE A. C

ODIGOS-FONTE 47
23 import androi d . wi dget . TextView ;
24 import androi d . wi dget . Toast ;
25
26 public cl ass OndeEstou extends MapActi vi ty {
27
28 Locati onManager l ocati onManager = nul l ;
29 MapControl l er mapControl l er ;
30 public stati c MapView myMapView;
31
32 TextView myLocationText ;
33 TextView myAppl i cati onFooter ;
34
35 @Override
36 public void onCreate ( Bundle i c i c l e ) {
37 super . onCreate ( i c i c l e ) ;
38 setContentVi ew(R. l ayout . main) ;
39
40 // I nt anci acao da c l a s s e MapView ( do mapa propri ament e di t o )
41 myMapView = (MapView) fi ndVi ewById (R. i d . myMapView) ;
42 mapControl l er = myMapView. ge t Cont r ol l e r ( ) ;
43
44 // Conf i gura opcoes de v i s ua l i z a c a o do mapa
45 myMapView. s e t S a t e l l i t e ( f al se ) ;
46 myMapView. s e t Tr a f f i c ( true ) ;
47
48 // Conf i gura o zoom no mapa (211)
49 mapControl l er . setZoom( 16) ;
50 myMapView. setBui l tI nZoomControl s ( true ) ; // mostra o c ont r ol e
de zoom
51 myMapView. di spl ayZoomControl s ( f al se ) ;
52
53 // Obtem uma i ns t anc i a do s e r v i c o ger enci ador de l o c a l i z a c a o
54 l ocati onManager = ( Locati onManager ) get Sys t emSer vi ce ( Context .
LOCATION SERVICE) ;
AP

ENDICE A. C

ODIGOS-FONTE 48
55
56 // Def i ne como provedor o GPS do aparel ho
57 St r i ng pr ovi der = Locati onManager . GPS PROVIDER;
58
59 // Obtem a l o c a l i z a c a o ( i medi at ament e )
60 Locati on l o c a t i o n = l ocati onManager . getLastKnownLocati on (
pr ovi der ) ;
61
62 // Mostra o mapa na t e l a
63 updateMap( l o c at i o n ) ;
64
65 // I ns cr eve a at ual a c t i v i t y para r eceber no t i f i c a c o e s de
l o c a l i z a c a o
66 // ( peri odi cament e )
67 l ocati onManager . requestLocati onUpdates ( provi der , 2000 , 10 ,
68 l o c a t i o nLi s t e ne r ) ;
69
70 // Chama a f uncao para conf i gur ar os a l e r t a s de proxi mi dade
71 s et Pr oxi mi t yAl e r t s ( ) ;
72
73 // Cria um over l ay mostrando a pos i cao do d i s p o s i t i v o
74 Li s t <com. googl e . androi d . maps . Overl ay> ove r l ays = myMapView
75 . get Over l ays ( ) ;
76 MyLocati onOverl ay myLocati onOverl ay = new MyLocati onOverl ay (
this ,
77 myMapView) ;
78
79 // Mostra o over l ay com a l o c a l i z a c a o at ual do d i s p o s i t i v o
80 ove r l ays . add( myLocati onOverl ay ) ;
81
82 // Hab i l i t a at ual i z ac oe s do sensor
83 myLocati onOverl ay . enableCompass ( ) ;
84
85 // Hab i l i t a o ponto az ul na t e l a
AP

ENDICE A. C

ODIGOS-FONTE 49
86 myLocati onOverl ay . enabl eMyLocati on ( ) ;
87
88 }
89
90 / I nt e r f ac e Locat i onLi s t ener /
91 private f i nal Loc at i onLi s t e ne r l o c a t i o nLi s t e ne r = new
Loc at i onLi s t e ne r ( ) {
92 public void onLocati onChanged ( Locati on l oc a t i o n ) {
93 updateMap( l o c at i o n ) ;
94 }
95
96 public void onProvi derDi sabl ed ( St r i ng pr ovi der ) {
97 updateMap( nul l ) ;
98 }
99
100 public void onProvi derEnabl ed ( St r i ng pr ovi der ) {
101 }
102
103 public void onStatusChanged ( St r i ng provi der , i nt s t at us ,
Bundle e xt r as ) {
104 }
105 };
106
107 / At ual i z a o mapa com a nova l o c a l i z a c a o /
108 private void updateMap( Locati on l oc at i on ) {
109
110 myLocationText = ( TextView) fi ndVi ewById (R. i d . myLocationText )
;
111
112 St r i ng l at LongSt r i ng ;
113 St r i ng addr e s s St r i ng = Endereco nao encontrado ;
114
115 i f ( l oc a t i on != nul l ) {
116
AP

ENDICE A. C

ODIGOS-FONTE 50
117 // Def i ne a l o c a l i z a c a o at ual
118 Double geoLat = l o c a t i o n . get Lat i t ude ( ) 1E6 ;
119 Double geoLng = l o c at i on . getLongi tude ( ) 1E6 ;
120 GeoPoint poi nt = new GeoPoint ( geoLat . i ntVal ue ( ) , geoLng .
i nt Val ue ( ) ) ;
121
122 // At ual i z a o mapa
123 mapControl l er . s et Cent er ( poi nt ) ;
124
125 // Formata as coordenadas
126 Double l a t = l oc a t i on . get Lat i t ude ( ) ;
127 Double l ng = l o c a t i o n . getLongi tude ( ) ;
128 l at LongSt r i ng = Lat : + F. roundSi xDeci mal s ( l a t ) + ,
Long :
129 + F. roundSi xDeci mal s ( l ng ) ;
130
131 // Mostra as coordenadas na par t e de cima da t e l a
132 myLocationText . setText ( Minhas coordenadas : \ n +
l at LongSt r i ng ) ;
133
134 // Busca o endereco at r aves do GeoCoder
135 // Geocoder gc = new Geocoder ( t hi s , Local e . g e t De f aul t ( ) ) ;
136 Geocoder gc = new Geocoder ( this , Local e . ENGLISH) ;
137 try {
138 Li s t <Address> addr es s es = gc . getFromLocati on ( l at , l ng
, 1) ;
139 St r i ngBui l de r sb = new St r i ngBui l de r ( ) ;
140 i f ( addr es s es . s i z e ( ) > 0) { // se houver pel o menos
um endereco
141 Address addr es s = addr es s es . get ( 0) ;
142
143 // Formata o endereco
144 for ( i nt i = 0; i < addr es s .
getMaxAddressLi neIndex ( ) ; i ++) {
AP

ENDICE A. C

ODIGOS-FONTE 51
145 i f ( i == ( addr es s . getMaxAddressLi neIndex ( )
1) )
146 sb . append ( addr es s . getAddressLi ne ( i ) ) ;
147 el se
148 sb . append ( addr es s . getAddressLi ne ( i ) ) .
append ( ) ;
149 }
150 }
151 addr e s s St r i ng = sb . t oSt r i ng ( ) ;
152 } catch ( IOExcepti on e ) {
153 }
154 } el se {
155 l at LongSt r i ng = Local i z acao nao encontrada ;
156 }
157
158 // Mostra na t e l a o endereco ob t i do at r aves do GeoCoder
159 Toast . makeText ( OndeEstou . this , addr es s St r i ng , Toast .
LENGTHLONG) . show( ) ;
160 }
161
162 / Conf i gura os a l e r t a s de aproximacao /
163 private void s et Pr oxi mi t yAl e r t s ( ) {
164
165 // Al ert a no pront o 1
166 MyProxi mi tyAl ert proxi mi tyAl ertPonto1 = new MyProxi mi tyAl ert (
167 25. 443195 , 49. 280977 , 100 , Al er t a pe r s onal i z ado ) ;
168
169 // Al ert a no pront o 10
170 MyProxi mi tyAl ert proxi mi tyAl ertPonto10 = new MyProxi mi tyAl ert
(
171 25. 442595 , 49. 279444 , 100) ;
172
173 Setup . addProxi mi tyAl ert ( proxi mi tyAl ertPonto1 ) ;
174 Setup . addProxi mi tyAl ert ( proxi mi tyAl ertPonto10 ) ;
AP

ENDICE A. C

ODIGOS-FONTE 52
175
176 // Hab i l i t a os a l e r t a s
177 Setup setup = new Setup ( ) ;
178 setup . s et Pr oxi mi t yAl er t ( get Appl i cat i onCont ext ( ) ,
l ocati onManager ) ;
179
180 }
181
182 / Impl ementacao do metodo ab s t r at o da c l a s s e MapAct i vi t y /
183 protected boolean i s Rout eDi s pl ayed ( ) {
184 return f al se ;
185 }
186
187 }
AP

ENDICE A. C

ODIGOS-FONTE 53
A.2 Setup.java
C odigo-fonte A.2: Classe Setup
1 package org . t hi agos ouza . ondeestou ;
2
3 import j ava . u t i l . ArrayLi st ;
4 import j ava . u t i l . Li s t ;
5
6 import androi d . app . Pendi ngI ntent ;
7 import androi d . content . Broadcast Recei ver ;
8 import androi d . content . Context ;
9 import androi d . content . I nt ent ;
10 import androi d . content . I nt e nt Fi l t e r ;
11 import androi d . gr aphi cs . drawabl e . Drawable ;
12 import androi d . l o c a t i o n . Locati onManager ;
13 import androi d . wi dget . Toast ;
14
15 import com. googl e . androi d . maps . GeoPoint ;
16 import com. googl e . androi d . maps . Overl ay ;
17 import com. googl e . androi d . maps . Overl ayItem ;
18
19 /
20 Cl ase de conf i guracao dos a l e r t a s de proxi mi dade
21 /
22 public cl ass Setup {
23
24 private stati c St r i ng TREASURE PROXIMITY ALERT = org . t hi agos ouza
. alertacommensagem ;
25
26 stati c ArrayLi st <MyProximityAlert> pr oxi mi t yAl er t s = new
ArrayLi st <MyProximi tyAlert >() ;
27
28 public stati c void addProxi mi tyAl ert ( MyProxi mi tyAl ert pa ) {
29 pr oxi mi t yAl er t s . add( pa ) ;
AP

ENDICE A. C

ODIGOS-FONTE 54
30 }
31
32 public void s et Pr oxi mi t yAl er t ( Context context ,
33 Locati onManager l ocati onManager ) {
34
35 Li s t <Overlay> ove r l ays = OndeEstou . myMapView. get Over l ays ( ) ;
36
37 long e xpi r at i on = 1; // nao e s pi r a
38
39 I nt ent i nt e nt = new I nt ent (TREASURE PROXIMITY ALERT) ;
40
41 Pendi ngI ntent pr oxi mi t yI nt ent = Pendi ngI ntent . getBroadcast (
context , 1,
42 i nt ent , 0) ;
43
44 for ( i nt i = 0; i < pr oxi mi t yAl er t s . s i z e ( ) ; i ++) {
45 // para cada a l e r t a de proxi mi dade
46 MyProxi mi tyAl ert paTemp = pr oxi mi t yAl er t s . get ( i ) ;
47
48 Drawable drawabl e = cont ext . get Res our ces ( ) . getDrawabl e (
49 R. drawabl e . androi dmarker ) ;
50
51 MyOverlays tempOverlay = new MyOverlays ( drawabl e ) ;
52
53 // Def i ne um GeoPoint com a l o c a l i z a c a o at ual
54 Double geoLat = paTemp. l a t 1E6 ;
55 Double geoLng = paTemp. l ng 1E6 ;
56 GeoPoint tempPoint = new GeoPoint ( geoLat . i ntVal ue ( ) ,
geoLng
57 . i nt Val ue ( ) ) ;
58
59 Overl ayItem overl ayI t em = new Overl ayItem( tempPoint ,
t e s t e ,
60 t e s t e ) ;
AP

ENDICE A. C

ODIGOS-FONTE 55
61 tempOverlay . addOverl ay ( overl ayI t em ) ;
62 ove r l ays . add( tempOverlay ) ;
63
64 // chama o metodo da c l a s s e Locat i on para adi ci onar os
pont os
65 l ocati onManager . addProxi mi tyAl ert (paTemp. l at , paTemp. l ng ,
66 paTemp. radi us , expi r at i on , pr oxi mi t yI nt ent ) ;
67 }
68
69 // r e g i s t r a o cont ext ( parametro ) para r eceber a l e r t a s de
proxi mi dade
70 I nt e nt Fi l t e r f i l t e r = new I nt e nt Fi l t e r (
TREASURE PROXIMITY ALERT) ;
71 cont ext . r e g i s t e r Re c e i ve r (new Pr oxi mi t yI nt ent Recei ver ( ) ,
f i l t e r ) ;
72
73 }
74
75 / Cl asse para r eceber os i nt e nt s de proxi mi dade /
76 public cl ass Pr oxi mi t yI nt ent Recei ver extends Broadcast Recei ver {
77 @Override
78 public void onRecei ve ( Context context , I nt ent i nt e nt ) {
79 St r i ng key = Locati onManager . KEY PROXIMITY ENTERING;
80
81 Bool ean e nt e r i ng = i nt e nt . getBool eanExtra ( key , f al se ) ;
82
83 i f ( e nt e r i ng )
84 Toast . makeText ( context , Al er t a , Toast .LENGTHLONG) .
show( ) ;
85 }
86 }
87 }
AP

ENDICE A. C

ODIGOS-FONTE 56
A.3 MyProximityAlert.java
C odigo-fonte A.3: Classe MyProximityAlert
1 package org . t hi agos ouza . ondeestou ;
2
3 /
4 Cl ase dos a l e r t a s de proxi mi dade
5 /
6 public cl ass MyProxi mi tyAl ert {
7
8 Double l a t = 0 . 0 ;
9 Double l ng = 0 . 0 ;
10 f l oat r adi us = 0;
11 St r i ng msg = ;
12
13 MyProxi mi tyAl ert ( Double l at , Double l ng , f l oat radi us , St r i ng msg
) {
14
15 thi s . l a t = l a t ;
16 thi s . l ng = l ng ;
17 thi s . r adi us = r adi us ;
18 thi s . msg = msg ;
19 }
20
21 MyProxi mi tyAl ert ( Double l at , Double l ng , f l oat r adi us ) {
22 thi s ( l at , l ng , radi us , ) ;
23 }
24
25 }
AP

ENDICE A. C

ODIGOS-FONTE 57
A.4 AndroidManifest.xml
C odigo-fonte A.4: Arquivo de congurac ao da aplicacao AndroidManifest.xml
1 <?xml version= 1. 0 encodi ng= utf 8?>
2 <mani f es t xml ns: androi d= ht t p: //schemas . androi d . com/apk/ r e s / androi d
3 package= org . t hi agos ouza . ondeestou andr oi d: ver s i onCode=1
androi d: versi onName= 1. 0 >
4 <appl i c at i on andr oi d: i c on=@drawable/ i con a ndr o i d: l a be l= @stri ng
/app name>
5 <a c t i v i t y androi d: name= . OndeEstou a ndr o i d: l a be l= @stri ng /
app name>
6 <i nt ent f i l t e r>
7 <ac t i on androi d: name= androi d . i nt e nt . act i on . MAIN />
8 <cat egor y androi d: name= androi d . i nt e nt . cat egor y .
LAUNCHER />
9 </ i nt ent f i l t e r>
10 </ a c t i v i t y>
11 <usesl i br a r y androi d: name=com. googl e . androi d . maps />
12 </ appl i c at i on>
13 <usessdk androi d: mi nSdkVersi on=3 />
14 <usesper mi s s i on androi d: name= androi d . per mi s s i on . INTERNET />
15 <usesper mi s s i on androi d: name= androi d . per mi s s i on .
ACCESS FINE LOCATION />
16 </ mani f es t>
AP

ENDICE A. C

ODIGOS-FONTE 58
A.5 main.xml
C odigo-fonte A.5: Arquivo de layout main.xml
1 <?xml version= 1. 0 encodi ng= utf 8?>
2 <Li nearLayout xml ns: androi d= ht t p: //schemas . androi d . com/apk/ r e s /
androi d
3 andr oi d: or i e nt at i on= v e r t i c a l andr oi d: l ayout wi dt h= f i l l p a r e n t
4 andr oi d: l ayout he i ght= f i l l p a r e n t >
5
6 <TextView andr oi d: i d=@+i d /myLocationText
7 andr oi d: l ayout wi dt h= f i l l p a r e n t andr oi d: l ayout he i ght=
wrap content
8 andr oi d: t e xt= @stri ng / he l l o />
9
10 <com. googl e . androi d . maps . MapView
11 andr oi d: i d=@+i d /myMapView andr oi d: l ayout wi dt h= f i l l p a r e n t

12 andr oi d: l ayout he i ght= f i l l p a r e n t andr oi d: enabl ed= t r ue


13 a ndr o i d: c l i c ka bl e= t r ue androi d: api Key=0
vVwwkcqB1Z whY4IYxwrT3eEVaYN6I9llTD7sQ />
14 <! Googl e Maps API Key >
15 </ Li nearLayout>
B INTERFACE DA APLICAC

AO
Figura B.1: Interface da Aplicac ao Onde estou
59
Referencias Bibliogracas
[Brady, 2008] Brady, P. (2008). Anatomy and Physiology of an Android. http://
sites.google.com/site/io/anatomy--physiology-of-an-android. Apresentac ao
no evento Google I/O Sessions Videos and Slides.
[Cleron, 2007a] Cleron, M. (2007a). Androidology - APIs. http://www.youtube.com/
androiddevelopers. Cana ocial do Youtube reservado aos desenvolvedores do An-
droid.
[Cleron, 2007b] Cleron, M. (2007b). Androidology - Application Lifecycle. http:
//www.youtube.com/androiddevelopers. Cana ocial do Youtube reservado aos de-
senvolvedores do Android.
[Cleron, 2007c] Cleron, M. (2007c). Androidology - Architecture Overview. http:
//www.youtube.com/androiddevelopers. Cana ocial do Youtube reservado aos de-
senvolvedores do Android.
[Foundation, 2007] Foundation, F. S. (2007). GNU General Public License. http://www.
gnu.org/licenses/gpl.html. Site ocial do projeto GNU.
[Google, 2009a] Google (2009a). Android developer. http://developer.android.com.
Site ocial de desenvolvimento do Android.
[Google, 2009b] Google (2009b). Whats is android? http://developer.android.com/
guide/basics/what-is-android.html. Introduc ao ao Android e ` a Arquitetura do
Sistema.
[Lecheta, 2009] Lecheta, R. R. (2009). Aprenda a criar aplicacoes para dispositivos moveis
com o Android SDK. Novatec, S ao Paulo, Brasil.
[Loytana, 2009] Loytana, K. (2009). JSR 179: Location API for J2ME
TM
. http://www.
jcp.org/en/jsr/detail?id=179. Site ocial do projeto Java Community Process -
Community Development of Java Technology Specications.
60
REFER

ENCIAS BIBLIOGR

AFICAS 61
[Meier, 2009] Meier, R. (2009). Android
TM
Application Development. Wiley Publishing,
Indianapolis, Indiana, Estados Unidos.
[Morrill, 2008] Morrill, D. (2008). Android development. http://sites.google.com/
site/io/android-development. Apresentacao no evento Google I/O Sessions Videos
and Slides.
[Rabello, 2009] Rabello, R. R. (2009). Construindo aplicacoes baseadas em localiza cao
no android. WebMobile 2.0, Ed. 20.
[Raub and Hoetmer, 2009] Raub, S. and Hoetmer, K. (2009). Maps APIs and Mobile.
http://sites.google.com/site/io/maps-api-and-mobile. Apresentac ao no evento
Google I/O Sessions Videos and Slides.

Você também pode gostar