Você está na página 1de 124

Desenvolvimento Android

Bsico
(por Maurcio Salamon - http://mauriciosalamon.com.br)



Android


2


Contedo

1. Introduo plataforma J ava ................................................................................................................. 4
1.1. Comandos bsicos ........................................................................................................................ 6
1.2. Tipos de dados .............................................................................................................................. 7
1.3. Operadores ................................................................................................................................... 8
1.4. Operadores relacionais ................................................................................................................. 9
1.5. Comentrios ............................................................................................................................... 10
1.6. Pacotes, Classes e Objetos ......................................................................................................... 11
1.7. Modificadores de acesso e encapsulamento ............................................................................... 17
1.8. Colees ..................................................................................................................................... 19
1.9. Padro de projeto Observer, Eventos e Listeners ....................................................................... 21
1.10. Threads e Excees ................................................................................................................ 25
2. Introduo ao sistema operacional Android ......................................................................................... 28
2.1. Desenvolvimento Android ............................................................................................................ 30
2.2. Preparao do Ambiente de Desenvolvimento ............................................................................. 32
2.3. HelloWorld! .................................................................................................................................. 34
2.4. Estrutura de um projeto e XML .................................................................................................... 36
2.5. Compilao, execuo e depurao .............................................................................................. 39
2.6. Empacotamento, publicao e instalao do app .......................................................................... 45
3. Conceitos Bsicos ................................................................................................................................. 49
3.1. Activity, Intent e IntentFilter ......................................................................................................... 50
3.2. Service ........................................................................................................................................... 54
3.3. ContentProvider ............................................................................................................................ 58
3.4. Processo e Thread ......................................................................................................................... 61
3.5. Manifesto ....................................................................................................................................... 63
4. Interface Grfica ................................................................................................................................... 65
4.1. Layouts .......................................................................................................................................... 67
4.2. Componentes de tela ..................................................................................................................... 74
4.3. Menus ............................................................................................................................................ 81
4.4. J anelas de Dilogo ......................................................................................................................... 84
4.5. Notificaes ................................................................................................................................... 86
4.6. Drag and Drop ............................................................................................................................... 91
4.7. Recursos ........................................................................................................................................ 94
5. Conceitos Avanados ........................................................................................................................... 96
5.1. Permisses e Segurana ................................................................................................................ 97
5.2. Preferncias de Usurio ............................................................................................................... 100
Android


3
5.3. Persistncia em Banco de Dados (SQLite) ................................................................................. 102
5.4. Cmera e Arquivos ...................................................................................................................... 105
5.5. GPS e Mapas ............................................................................................................................... 108
5.6. Bluetooth ..................................................................................................................................... 111
5.7. Sensores ....................................................................................................................................... 114
5.8. OpenGL, games, redes sociais e tendncias ................................................................................ 117
4. Exerccios ............................................................................................................................................ 120
Anotaes ................................................................................................................................................ 123



Android


4
1. Introduo plataforma J ava

Java mais que uma linguagem de programao, uma plataforma. Partindo
deste conceito, consegue-se analisar o histrico, as principais utilidades, vantagens e
desvantagens de trabalhar com o Java, utilizando exemplos de cdigo e explorando os
principais comandos.
Criada no incio dos anos 90 pela Sun Microsystems com o objetivo de ser uma
linguagem independente de plataforma de execuo, Java segue os paradigmas de
linguagem Orientada a Objetos (OO), o que era uma tendncia no desenvolvimento de
software na poca de seu surgimento. Diferentemente de outras linguagens, cujos
cdigos eram compilados para cdigo-nativo, Java compilado em bytecode, sendo este
interpretado e executado por uma mquina virtual, no caso a JVM (Java Virtual
Machine). Isto permite que o mesmo programa desenvolvido em Java seja executado em
sistemas operacionais diferentes (como Windows e Linux, por exemplo).

A Sun disponibiliza a maioria das extenses e distribuies Java de forma gratuita,
obtendo receita com softwares especializados e mais robustos. Dentre as diversas
extenses e distribuies Java, pode-se destacar:
JSE (Standard Edition): a plataforma Java de utilizao mais comum,
possui todos os recursos para o desenvolvimento de uma aplicao de
ambiente de trabalho completa, como bibliotecas de cdigo, compilador,
mquina virtual e ferramentas e APIs auxiliares;
JEE (Enterprise Edition): a plataforma Java mais completa, possui todos
os recursos da JSE e mais ferramentas e recursos especficos para o
ambiente coorporativo (servidores) e web, como novas APIs de acesso a
dados e segurana;
Android


5
JME (Micro Edition): a plataforma Java mais reduzida, especfica para
utilizao em sistemas embarcados e mveis, contm menos recursos que a
JSE, mas com APIs especficas, como de gerenciamento de MIDIs,
Bluetooth, Wireless, GPS, etc;
JSP (Server Pages): a tecnologia utilizada para a criao de pginas web,
tem um comportamento semelhante ao ASP da Microsoft e o PHP e
normalmente utilizada em combinao com o JEE (com Servlets,
componentes de integrao Java, HTML e XML);
JRE (Runtime Edition): o conjunto de ferramentas necessrias para a
execuo de aplicaes Java, como a JVM (mquina virtual), algumas
bibliotecas de execuo e outros utilitrios;
Em 2006, Java foi parcialmente liberado como software livre sob a licena GNU
(General Public License), sendo completamente licenciado como livre em 2007. A Sun foi
comprada pela Oracle em 2009, o que no interferiu na licena de distribuio Java.
Dessa forma, Java possui uma comunidade muito grande de desenvolvedores, o que d
linguagem a vantagem de possuir uma enorme gama de frameworks (alguns pagos, mas
a maioria gratuita), teis para diversas ocasies de desenvolvimento, e IDEs (Integrated
Development Environment), ou seja, ambientes de desenvolvimento. A ferramenta mais
utilizada para o desenvolvimento Java at 2011 o IDE Eclipse.
Orientado ao desenvolvimento baseado em plugins, o Eclipse uma ferramenta de
cdigo-fonte livre robusta, capaz de executar as principais operaes de produo de
software (codificao, compilao, depurao, modelagem, persistncia, teste,
publicao, etc.). Os diversos plugins disponveis do ao Eclipse a capacidade de
produzir cdigos no s Java, mas tambm PHP, Python, Ruby, Action Script, dentre
outros, alm de agregar funcionalidades diversas na codificao dessas linguagens. Um
dos plugins mais conhecidos do Eclipse o ADT (Android Development Tools), que
combinado com o SDK (Standard Development Kit), biblioteca de desenvolvimento
Android disponibilizada de forma gratuita pela Google, d ao desenvolvedor o poder de
no s programar Java para Android, mas tambm emular dispositivos para testes e
depurao.
As verses mais robustas de Java possuem bibliotecas de suporte interface
grfica, como a Swing, que possui elementos de controle de layout (em tabela, em
camadas, etc.) e componentes de tela, alm de suporte a controle de eventos para
tratamento desses componentes.
Android


6

1.1. Comandos bsicos

A capacitao Android focada no desenvolvimento a partir de Java. Assim,
importante o conhecimento dos principais comandos utilizados na linguagem, sendo aqui
apresentados de forma sintetizada.
Ao estudar Java, fala-se de Classes e Objetos. Resumidamente, Classe a
generalizao de uma espcie e objeto um representante nico desta espcie. Classes
possuem atributos (informaes/propriedades) e mtodos (aes/funes).
Exemplo de cdigo Java:
publ i c cl ass Hel l oWor l d {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Syst em. out . pr i nt l n( " Hel l o, Wor l d! " ) ;
}
}

Toda classe Java, quando executada diretamente, iniciada atravs do mtodo
main. Desta forma, no exemplo acima, ao executar a classe HelloWorld, o
programa exibir em console, atravs do mtodo System.out.println();, a frase
Hello, World!.

Android


7

1.2. Tipos de dados

Tipo Bits Bytes Mnimo Mximo Ex.:
byte 8 1 -2
7
2
7
-1 99
short 16 2 -2
15
2
15
-1 9999
int 32 4 -2
31
2
31
-1 999999999
long 64 8 -2
63
2
63
-1 99999999999999
float 32 4 - - 99999999.99
double 64 8 - - 9999999999999.99
boolean verdadeiro/falso true/false - - True
char caractere 1 - - a
String caracteres - - - abc

O tipo String no um tipo primitivo, mas sim uma Classe. Diferentemente de
outras Classes, String no necessita de instanciao (uso do comando new), apenas
atribuio normal. Porm, ao ser atribudo, um String pode ser modificado apenas
pela utilizao de mtodos ou alguns operadores especficos.


Android


8

1.3. Operadores

Operador Descrio Ex.:
= Atribuio int x = 1; // x 1
+ Adio int x = 9+1; // x 10
- Subtrao int x = 4-3; // x -1
/ Diviso int x = 4/2; // x 2
* Multiplicao int x = 1*5; // x 5
% Mdulo int x = 4%2; // x 0
+= Adio seguida de atribuio int x = 1;
x+= 10; // x 11
-= Subtrao seguida de atribuio int x = 10;
x-= 5; // x 5
++ Adio prpria int x = 1;
x++; // x 2
-- Subtrao prpria int x = 1;
x--; // x 0



Android


9

1.4. Operadores relacionais

Operador Descrio Ex.:
== Igual if(x == 1)
!= ou <> Diferente if(x != 1) ou if(x <> 1)
&& E if(x != 1 && x != 0)
|| Ou if(x != 1 || x == 0)
< Menor if(x < 1)
> Maior if(x > 1)
<= Menor ou igual if(x <= 1)
>= Maior ou igual if(x <= 1)

Para comparao de String, necessria a utilizao de mtodos especficos da
prpria classe, como o equals. Ex.:
St r i ng x = abc;

i f ( x. equal s( abc) ) {
Syst em. out . pr i nt l n( " abc. " ) ;
}


Android


10

1.5. Comentrios

Os comentrios em Java podem ser escritos em linha:
/ / i st o umcoment r i o

Ou em blocos:

/ * est e umcoment r i o embl ocos
* ut i l i zado par a coment r i os l ongos
* ou ger ao de document ao aut omt i ca */

Os comentrios em Java podem ser teis para documentao automtica de cdigo
(Javadoc). Para isso, deve ser respeitado um modelo de comentrio em blocos e este
adicionado antes de declaraes de Classes, atributos e mtodos. Ex.:

/**
*
* Valida a incluso de um pedido.
*
* @param numeroPedido Nmero do pedido a ser finalizado
* @param valor Valor total to pedido
* @param codigoCliente Referencia ao cliente do pedido
* @param data Data do pedido
*
* @return verdadeiro se o pedido foi includo e falso se houve erro
*
* @author Joo Primeiro
* @author Z Segundo
*
**/

bool ean f i nal i zaPedi do ( i nt numer oPedi do, doubl e val or , i nt
codi goCl i ent e, Dat e dat a)
{
}
Android


11

1.6. Pacotes, Classes e Objetos

O conceito de Classes e Objetos define que uma Classe define um conjunto de
elementos com caractersticas em comum. Cada um desses elementos possui uma
identidade prpria, assim como suas caractersticas peculiares, sendo chamados de
Objetos. Cada Classe possui, alm das caractersticas (atributos), mtodos, que
representam o comportamento, as aes e funes realizadas pelos Objetos.
Objetos, ento, so a interpretao em programao de um elemento do mundo
real, sendo ele representante pertencente de uma Classe em especfico. Cada objeto
possui valores de caractersticas prprios, conforme o conjunto de caractersticas
definido em sua Classe. Por exemplo, seguindo a anlise do cdigo abaixo:
publ i c cl ass Pessoa {
publ i c St r i ng nome;
publ i c i nt i dade;
publ i c f l oat al t ur a;
publ i c f l oat peso;

/ / const r ut or padr o
publ i c Pessoa( ) {}

/ / const r ut or at r i bui ndo nome
publ i c Pessoa( St r i ng nome) {
t hi s. nome = nome;
}

publ i c voi d f al ar ( ) {
Syst em. out . pr i nt l n( Ol , meu nome + t hi s. nome + . ) ;
}
}


A classe Pessoa define um conjunto de atributos e aes em comum entre todos
os representantes deste grupo (Objetos). Alm disso, esto definidos dois mtodos
construtores. Para criar uma nova instncia de objeto do tipo Pessoa, utilizado o
comando new. Este commando realiza uma chamada ao mtodo construtor definido
conforme os parmetros passados a ele. Caso no sejam passados parmetros,
realizada a chamada ao construtor padro.

Android


12
publ i c cl ass Mai n {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Pessoa pessoa1 = new Pessoa( ) ;
pessoa1. nome = J o;

pessoa1. f al ar ( ) ;
/ / exi be no consol e Ol , meu nome J o.
}
}


ou
publ i c cl ass Mai n {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Pessoa pessoa1 = new Pessoa( J o) ;

pessoa1. f al ar ( ) ;
/ / exi be no consol e Ol , meu nome J o.
}
}


importante observar que Java case-sensitive, ou seja, h diferenciao de
cdigo entre letras minsculas e maisculas. O padro de escrita de cdigo utilizado
deve ser o adotado pela equipe de desenvolvimento do programa. Nesta apostila, foi
adotada a conveno sugerida pela Sun:
Mtodos e Atributos: iniciam com letra minscula e palavras compostas utilizam
letra maiscula para troca. No devem ser utilizados espaos nem acentos e caracteres
especiais, alm de no ser comum utilizar artigos e preposies. Ex.: nome, idade,
nomePai, quantidadeItens, realizaCompra(), finalizaPedido();
Variveis e Classes: todas palavras iniciam com letra maiscula, inclusive na
troca para palavras compostas. No devem ser utilizados espaos nem acentos e
caracteres especiais, alm de no ser comum utilizar artigos e preposies. Ex.: Pessoa,
Animal, Pedido, ItemPedido, CarinhoCompras.
Pacotes, por sua vez, so colees de Classes e cdigos responsveis por conceitos
em especfico. Por exemplo, alguns dos Pacotes utilizados em Java so:
Android


13
java.lang; - inclui no cdigo referncias s Classes principais para codificao,
como String, Math, Thread, Object, etc.;
java.util; - inclui no cdigo referncias s principais Classes auxiliares para
codificao, como Collection, List, Date, etc.;
A chamada de incluso de Pacotes feita sempre no incio do arquivo de cdigo,
nas primeiras linhas, podendo ser includas Classes e divises especficas de um Pacote,
ou o Pacote inteiro. Ex.:
i mpor t j ava. i o. *; / / i mpor t a t odo o pacot e j ava. i o;

i mpor t j ava. ut i l . r egex. *;
/ / i mpor t a t oda a di vi so r egex do pacot e j ava. ut i l ;

Dentre as principais Classes Java pode-se considerar:
String: classe responsvel pela construo e manipulao de textos. Seus
principais mtodos so:
- charAt(): Obtm o caracter localizado na posio especificada;
- startsWith(): informa se o texto inicia com o prefixo fornecido;
- endsWith(): informa se o texto termina com o sufixo fornecido;
- equals() : Compara contedo, caracter-a-caracter;
- equalsIgnoreCase() : Compara contedo, caracter-a-caracter
ignorando o aspecto maiscolo/minscolo
- indexOf(): obtm a posio da primeira ocorrncia do argumento;
- intern(): retorna uma referncia para um objeto String correspondente
armazenado no "pool";
- lastIndexOf(): obtm a posio da ltima ocorrncia do argumento;
- length(): obtm a quantidade de caracteres;
- substring(): obtm o trecho desejado;
- split(): quebra o texto em pedaos;
- toLowerCase(): obtm o texto equivalente em letras minsculas;
- toUpperCase(): obtm o texto equivalente em letras maisculas;
- trim(): obtm o texto equivalente sem espaos laterais;
- valueOf(): obTm o valor textual do dado de tipo primitivo fornecido.


Android


14
Math: classe responsvel pela construo e manipulao de equaces e clculos
matemticos;

Array: principal classe responsvel pela construo e manipulao de colees de
objetos (funcionamento semelhante a listas e vetores);

Thread: classe responsvel pela construo e manipulao de processamentos
paralelos;

System: classe responsvel pela manipulao e exibio de comportamentos de
sistema, como trabalhos com data e hora, propriedades de sistema, etc.;

Existe em Java, tambm, a abstrao de Classes. Uma Classe Abstrata uma
classe que serve de modelo para as classes filhas na sua hierarquia, com estas herdando
mtodos e atributos da Abstrata pai. Por exemplo, pode-se ter uma Classe abstrata
Eletrodomestico com os atributos bsicos em comum entre todos os eletrodomsticos,
assim como seus mtodos, e ter as classes respectivas a cada tipo de eletrodomstico,
como TV, contendo dados referentes aos mesmos. Classes abstratas no podem ser
instanciadas diretamente (atravs do new). O mesmo vale para mtodos abstratos,
valem as declaraes realizadas nas classes filhas.



publ i c abst r act cl ass El et r odomest i co {
publ i c bool ean l i gado;
publ i c i nt vol t agem;

/ / obr i gat r i ament e i mpl ement ados nas cl asses der i vadas
Android


15
publ i c abst r act voi d l i gar ( ) ;
publ i c abst r act voi d desl i gar ( ) ;
}

publ i c cl ass TV ext ends El et r odomest i co {
publ i c i nt t amanho;
publ i c i nt canal ;

publ i c voi d l i gar ( ) {
t hi s. l i gado = t r ue; }
publ i c voi d desl i gar ( ) {
t hi s. l i gado = f al se; }
}


Java conta, tambm, com Interface, um tipo de Classe que no possui contedo
implementado, apenas chamadas de declaraes. Interfaces so, em partes, uma soluo
encontrada para a emulao de herana mltipla, recurso no implementado em Java.
Dessa forma, uma Casse Java pode herdar itens da Classe pai e ainda possuir itens de
uma outra Classe modelo. A Interface mais comum utilizada em Java a Runnable,
utilizada em threads e que possui a chamada de mtodo run(), implementado na classe
implementada. Por exemplo:
publ i c cl ass Rel ogi o i mpl ement s Runnabl e {
/ / mt odo de i mpl ement ao obr i gat r i a der i vado do Runnabl e
publ i c voi d r un( ) {
/ / passa as hor as
}
}



Por fim, existem ainda as Classes Internas, declaradas internamente a outras
classes, com acesso a atributos e mtodos da externa e no instanciveis diretamente.


Por exemplo:


Android


16
publ i c cl ass Ext er na {
publ i c cl ass I nt er na {
publ i c voi d most r aRef er enci a( ) {
Syst em. out . pr i nt l n( A r ef er nci a + t hi s) ;
}
}
}

publ i c st at i c voi d mai n( St r i ng [ ] ar gs)
{
Ext er na ex = new Ext er na( ) ;
Ext er na. I nt er na i = ex. new I nt er na( ) ;
i . most r aRef er enci a( ) ;
}
Android


17

1.7. Modificadores de acesso e encapsulamento

Trabalhar com Classes na Orientao a Objetos torna-se mais interessante
quando utiliza-se o encapsulamento. Esta tcnica consiste em agrupar e proteger trechos
de cdigo a fim de adicionar maior integridade de dados e do programa, alm de manter
uma organizao de cdigo e dados conforme padres de desenvolvimento.
O exemplo mais comum de encapsulamento em Java a utilizao de mtodos
get e set para acesso a atributos com modificadores no pblicos. Os principais
modificadores de atributos so:
public: utilizado de forma livre para atribuio ou chamada pelas instncias da
Classe;

protected: tem atribuio ou chamada realizadas apenas nas classes derivadas;

private: tem atribuio ou chamada realizadas apenas na instncia da prpria
classe ou atravs da utilizao de mtodos get e set;

static: define um nico armazenamento em memria de um valor ou chamada de
mtodo, no podendo ser alterado;

final: define o primeiro valor atribudo como o ultimo, no podendo ser alterado,
mais utilizado como definio de constantes;

publ i c cl ass Pessoa {
publ i c St r i ng nome;
pr i vat e f l oat peso;

/ / const r ut or padr o
publ i c Pessoa( ) {}

/ / const r ut or at r i bui ndo nome
publ i c Pessoa( St r i ng nome) {
t hi s. nome = nome; }

publ i c voi d set Peso( f l oat peso) {
t hi s. peso = peso; }

publ i c f l oat get Peso( ) {
Android


18
r et ur n t hi s. peso; }
}

publ i c cl ass Mai n {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Pessoa pessoa1 = new Pessoa( ) ;
pessoa1. nome = J o;
/ / pessoa1. peso = 70; - no f unci ona
pessoa1. set Peso( 70) ; / / f unci ona

Syst em. out . pr i nt l n( Ol , meu peso +
pessoa1. get Peso( ) . t oSt r i ng( ) + . ) ;
}
}

Android


19

1.8. Colees


Tipo de Coleo Classe Tipo de Mtodo Mtodo
Genrico Collection Adio add(Object elemento)
Remoo remove(Object elemento)
clear()
Acesso iterator()
Pesquisa contains(Object elemento)
Atributos size()
Lista
Vector
ArrayList
LinkedList
Adio add(int index, Object elemento)
Remoo remove(int index)
Acesso get(index)

listIterator
(iterador que pode andar para trs)
Pesquisa indexOf(Object elemento)
Conjunto
HashSet
TreeSet
Nenhum mtodo a mais
Mapa
HashMap
TreeMap
Adio put(Object key, Object value)
Remoo remove(Object key)
clear()
Acesso
get(Object key)
(Isso tambm "pesquisa")

Set entrySet()
(retorna os itens como conjunto)

Set keySet()
(retorna as chaves como conjunto)

Collection values()
(retorna os valores como Collection)
Pesquisa
get(Object key)
(Isso tambm "acesso")

Existem alguns tipos de colees em Java que se aplicam melhor a situaes
especficas. Pode-se destacar as Listas, os Conjuntos e os Mapas.
Listas: uma lista uma arrumao de elementos em uma ordem linear, podendo os
elementos serem facilmente ordenados e reorganizados. Pode ser utilizado em formato
de vetor ou de lista encadeada.
Android


20
Conjuntos: so arrumaes de elementos em forma no linear e no ordenadas,
porm sem elementos duplicados. As formas mais comuns de utilizao so como tabelas
hash ou rvores.
Mapas: so arrumaes de elementos em forma de pares (chave e valor),
chamados itens. O grande destaque dos Mapas em Java que tanto os valores quanto as
chaves podem ser de qualquer tipo. Mapas so normalmente utilizados para pesquisa
rpida em grande quantidade de dados.
Android


21

1.9. Padro de projeto Observer, Eventos e Listeners


A utilizao do padro Observer tem como objetivo realizar a conversao
de objetos em tempo real (tempo de execuo) sem a necessidade de prever tal
comportamento em tempo de compilao. Para isso, necessria a utilizao de alguns
elementos em Java.
Source: o Objeto responsvel pela alterao a ser notificada para os Objetos
interessados (listener);
Listener: so os objetos interessados nas modificaes ocorridas no Objeto de
interesse (source).

Como exemplo, identificar uma caixa de e-mails. Imagina-se que um remetente
deseja saber quando seu e-mail chegou na caixa de entrada do destinatrio e este deseja
ser avisado quando h novos e-mails no lidos. Identifica-se um Source (e-mail) e dois
Listeners (remetente e destinatrio). Primeiramente, deve ser criada uma Classe para
o evento de modificao.

Android


22
publ i c cl ass Emai l Event ext ends Event Obj ect {
publ i c Emai l Event ( Obj ect sour ce) {
super ( sour ce) ;
}
}

Em seguida, necessria a criao de uma Classe que ir receber as notificaes
de alterao e ser implementada pelos interessados, no caso remetente e destinatrio.
publ i c i nt er f ace Emai l Li st ener {
publ i c voi d emai l Recebi do ( Emai l Event emai l Event ) {}
publ i c voi d emai l Li do ( Emai l Event emai l Event ) {}
}

Depois, criada a Classe do Objeto a ser modificado.
publ i c cl ass Emai l {
pr i vat e Col l ect i on<Emai l Li st ener > emai l Li st ener = new
Ar r ayLi st <Emai l Li st ener >( ) ;

publ i c voi d envi ar ( ) {
di spar aEmai l Recebi do( ) ;
di spar aEmai l Li do( ) ;
}

publ i c voi d emai l Recebi do( ) {
t hi s. di spar aEmai l Recebi do( ) ;
}

publ i c voi d emai l Li do( ) {
t hi s. di spar aEmai l Li do( ) ;
}

publ i c synchr oni zed voi d addEmai l Li st ener ( Emai l Li st ener
emai l Li st ener ) {
t hi s. emai l Li st ener s. add( emai l Li st ener ) ;
}

publ i c synchr oni zed voi d r emoveEmai l Li st ener ( Emai l Li st ener
emai l Li st ener ) {
t hi s. emai l Li st ener s. r emove( emai l Li st ener ) ;
}
pr i vat e voi d di spar aEmai l Li do( ) {
Android


23
Emai l Event event = new Emai l Event ( t hi s) ;
f or ( Emai l Li st ener l i st ener : emai l Li st ener s) {
l i st ener . emai l Li do( event ) ;
}
}

pr i vat e voi d di spar aEmai l Recebi do( ) {
Emai l Event event = new Emai l Event ( t hi s) ;
f or ( Emai l Li st ener l i st ener : emai l Li st ener s) {
l i st ener . emai l Recebi do( event ) ;
}
}
}

Em seguida, as classes responsveis pelo remetente e pelo destinatrio devem
implementar a classe de escuta das modificaes.
publ i c cl ass Dest i nat ar i o i mpl ement s Emai l Li st ener {
publ i c voi d emai l Li do ( Emai l Event emai l Event ) {
Emai l emai l = ( Emai l ) emai l Event . get Sour ce( ) ;
Syst em. out . pr i nt l n( Voc acabou de l er o e- mai l ! ) ;
}

publ i c voi d emai l Recebi do ( Emai l Event emai l Event ) {
Emai l emai l = ( Emai l ) emai l Event . get Sour ce( ) ;
Syst em. out . pr i nt l n( Voc acabou de r eceber o e- mai l ! ) ;
}
}

publ i c cl ass Remet ent e i mpl ement s Emai l Li st ener {
publ i c voi d emai l Li do ( Emai l Event emai l Event ) {
Emai l emai l = ( Emai l ) emai l Event . get Sour ce( ) ;
Syst em. out . pr i nt l n( O e- mai l + emai l + acabou de ser
l i do! ) ;
}

publ i c voi d emai l Recebi do ( Emai l Event emai l Event ) {
Emai l emai l = ( Emai l ) emai l Event . get Sour ce( ) ;
Syst em. out . pr i nt l n( ( O e- mai l + emai l + acabou de ser
r ecebi do! ) ;
}
}

Android


24
Para simular a execuo, cria-se uma classe gerenciadora da caixa de entrada.
publ i c cl ass Cai xaEnt r ada {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Emai l emai l 1 = new Emai l ( ) ;
Emai l emai l 2 = new Emai l ( ) ;

Dest i nat ar i o dest i nat ar i o = new Dest i nat ar i o( ) ;
Remet ent e r emet ent e = new Remet ent e( ) ;

emai l 1. addEmai l Li st ener ( dest i nat ar i o) ;
emai l 1. addEmai l Li st ener ( r emet ent e) ;
emai l 2. addEmai l Li st ener ( dest i nat ar i o) ;
emai l 2. addEmai l Li st ener ( r emet ent e) ;

/ / aes de modi f i cao a ser emnot i f i cadas aos
i nt er essados
emai l 1. envi ar ( ) ;
emai l 2. emai l Recebi do( ) ;
}
}

O tratamento de Eventos em Java funciona de maneira semelhante. Atravs de
Listeners, ou seja, handlers que ficam esperando por notificaes de evento, estes so
disparados e executam as aes previstas no cdigo.
Android


25

1.10. Threads e Excees


Um dos grandes diferenciais do Java a qualidade do trabalho com programao
concorrente, as Threads. Em Java muito simples criar concorrncia com bom
gerenciamento de memria e rpido processamento.


Basicamente, existem duas formas de se trabalhar com Threads em Java.
A primeira, consiste em criar uma Classe filha da Classe nativa Thread. Em
seguida, devem ser criados mtodos (ou utilizados comandos avulsos) a serem chamados
dentro do mtodo derivado run().
A segunda forma consiste em, ao invs de extender a Classe nativa Thread,
implementar a Interface nativa Runnable. Desta forma, permitido que seja realizado
um trabalho com Classes derivadas de uma hierarquia e estas possuam trabalhos
concorrentes (lembrando que Java no possui herana mltipla).
A grande diferena de codificao que, aps instanciar uma Runnable, deve
ser criado um objeto do tipo Thread para execuo, passando como parmetro a
referncia quela.
Android


26
publ i c cl ass Exempl oRunnabl e i mpl ement s Runnabl e {
publ i c voi d r un( ) {
i nt t ot al = 0;

whi l e ( ( i nt ) ( Mat h. r andom( ) *100) ! = 50) {
t ot al ++;
}
}
}

publ i c cl ass Mai n {
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Exempl oRunnabl e r = new Exempl oRunnabl e( ) ;

Thr ead t = new Thr ead( r , " Thr ead 1" ) ;

t . st ar t ( ) ;
}
}

Dessa forma, a API Java referente a Threads se encarregar de fazer a
execuo concorrente a partir de chamadas como start(), stop(), interrupt(),
suspend(), yield() e resume().
O tratamento de Excees em Java tambm realizado de forma simples. Baseado
no conceito try-catch, onde um comando executado com erro dispara uma informao
de exceo e esta recuperada por um techo de cdigo, possvel criar tratamentos de
exceo especficos para cada caso ou utilizar os tratamentos genricos.
publ i c cl ass Cal cul ador a {
publ i c i nt di vi de( i nt a, i nt b) t hr ows Di vi saoZer o {
i f ( b == 0) t hr ow new Di vi saoZer o( ) ;
r et ur n a/ b;
}
}

No exemplo acima, foi implementada a funo de diviso de uma calculadora. No
mtodo responsvel pelo clculo, testado se o segundo parmetro zero e, caso
positivo, dispara a exceo DivisaoZero. Esta, uma Classe personalizada, que
deriva da Classe nativa Exception e sobrescreve o mtodo toString().
Android


27
publ i c cl ass Di vi saoZer o ext ends Except i on {

publ i c St r i ng t oSt r i ng( ) {
r et ur n " Di vi so por zer o. " ;
}
}
Para utilizar esta exceo, basta realizar a chamada ao mtodo dentro do bloco
try e o cdigo de tratamento dentro do bloco catch.


Cal c cal c = new Cal c( ) ;
t r y {
i nt di v = cal c. di v( x, y) ;
Syst em. out . pr i nt l n( di v) ;
} cat ch ( Di vi saoZer o e) {
Syst em. out . pr i nt l n( e) ;
}


Java dispe, tambm, do comando finally, responsvel por executar o bloco
mesmo aps o tratamento da exceo.

Android


28
2. Introduo ao sistema operacional Android

A Android Inc. uma empresa adquirida pela Google em 2005. Naquela poca, a
empresa possua a ideia em papel de um sistema operacional para dispositivos mveis,
posteriormente realizado pela compradora.
Android o Sistema Operacional para smartphones e tablets colocado em prtica
e continuado pela Google, em comunidade com a Open Handset Alliance, conjunto de
mais de trinta empresas, dentre elas operadoras de telefonia e fabricantes de
dispositivos. Alm disso, a Google fornece uma biblioteca gratuita para desenvolvimento
de aplicativos Android em Java, cuja comunidade muito grande, o que possibilita uma
grande variedade de aplicativos no Google Play. Esta, por sua vez, a loja e
distribuidora oficial de aplicativos Android, tambm gerenciada pela Google.
Em dezembro de 2011, o Android chegou incrvel marca de mais de 700 mil
aparelhos ativados por dia, ou seja, est em uma crescente de utilizadores, nmeros que
devem aumentar a partir da finalizao da compra parcial da Motorola (uma das
principais fabricantes de aparelhos com Android) pela Google, iniciada em agosto de
2011. Esta presena de uma comunidade forte e o crescente interesse das fabricantes no
sistema operacional o grande diferencial do Android contra os fortes concorrentes da
atualidade (iOS e Windows Phone). Mais aplicativos diferenciados, interfaces
customizadas por operadora e fabricante agradam novos consumidores e at mesmo os
hardcore.
Tecnicamente falando, Android construdo sobre o ncleo Linux. Por ser uma
plataforma em cdigo aberto, possui distribuies em kernel diferentes, o que deixa o
sistema operacional mais personalizvel. Alm disso, um sistema muito robusto,
possuindo recursos nativos como a mquina virtual Dalvik (baseada na JVM), banco de
dados SQLite, touch screen, GPS, grficos 3D, acelermetro, giroscpio e outros.


Android


29
At dezembro de 2011, foram desenvolvidas 7 verses de Android, tendo o
percentual de ativaes conforme o quadro a seguir:
1.5 Cupcake 1,1%
1.6 Donut 1,4%
2.1 Eclair 11,7%
2.2 Froyo 45,3%
2.3.x Gingerbread 38,7%
3.x.x Honeycomb 1,8%
4.0 Ice Cream Sandwich 0%

As verses 3 e 4 so oficialmente licensiadas para tablets.
O mercado tende mobilidade e esta age cada vez mais integrada com a web, com
produtos e servios de empresas, atuando como um mediador e uma nova ferramenta de
comunicao. cada vez mais comum aplicativos com interfaces grficas melhores,
compatveis com diversos dispositivos com recursos de tela diferentes, e a arte para
aplicaes mveis uma das reas de tecnologia e comunicao que mais crescem.
Android


30

2.1. Desenvolvimento Android

Por ser uma plataforma de cdigo aberto codificada em C++ e Java, Android
possui bibliotecas de desenvolvimento oficiais nessas linguagens e outras formas de
desenvolvimento criadas pela comunidade. A grande parte dos aplicativos Android hoje
so desenvolvidos em Java atravs do SDK (Standard Development Kit) e do plugin
oficial para o IDE Eclipse, o ADT, fornecidos gratuitamente pela Google.
http://developer.android.com/sdk/index.html
Apesar disso, a Google oferece, ainda, o NDK (Native Development Kit),
biblioteca de desenvolvimento em cdigo nativo (C/C++), utilizado para desenvolver
aplicativos que requerem maior manipulao dos recursos fornecidos pela GPU Android
e que no so suportados no SDK (como OpenGL).
http://developer.android.com/sdk/ndk/index.html
Aplicativos desenvolvido para Android so compilados e convertidos em um
pacote APK (Android Application Package). Este pacote um arquivo compactado
(como ZIP) baseado no formato JAR (Java Archive, pacote de execuo Java), que
possui arquivos de referncia, de estrutura e arquivos DEX (Dalvik Executable), capazes
de serem executados pela mquina virtual do Android (a Dalvik).
O Android possui, ainda, um navegador de Internet nativo, construdo em cima da
plataforma Webkit (Chrome, Safari). Por isso, possvel construir aplicativos em
HTML5, executados diretamente no navegador. Existem alguns frameworks, como o
PhoneGap que utilizam tags HTML e as converte e em elementos grficos do prprio
SDK, tornando, assim, o desenvolvimento HTML para Android mais robusto e
compatvel com o Google Play (o framework capaz de gerar um APK com um elemento
navegador web interno na aplicao). No entando, este desenvolvimento ainda no
homologado pela Google e no oferecido suporte pela mesma.
Nos links acima, est includa a documentao completa do SDK Android, que
usado como base para o estudo nesta apostila.

Android


31

Android


32

2.2. Preparao do Ambiente de Desenvolvimento

Para iniciar o desenvolvimento Android em Java em ambiente Windows so
necessrias trs ferramentas. importante observar que, ao atualizar cada ferramenta,
pode ser necessrio atualizar as demais.
IDE Eclipse: http://www.eclipse.org/downloads/packages/eclipse-ide-java-
developers/indigor
Android SDK: http://developer.android.com/sdk/index.html
Plugin ADT: http://developer.android.com/sdk/eclipse-adt.html
Primeiramente, necessrio instalar o SDK. Aps a instalao, necessrio
entrar na pasta onde foi instalado e executar o SDK Manager.exe.

Android


33
Nesta tela possvel escolher quais pacotes sero baixados e instalados.
recomendvel baixar todos, pois em momentos especficos pode ser necessrio
desenvolver aplicaes para aparelhos mais antigos, que no suportam as API novas.
Alm do que, existem pacotes de exemplos e add-ons de outros fornecedores.
Aps esta instalao possvel, no menu Tools -> Manage AVDs, configurar
um emulador, selecionando opes de configurao como tipo e tamanho de tela e outros
componentes hardware, ou selecionando um emulador pr-definido.
No Eclipse, no menu de ajuda, existe a opo de instalar novos recursos. Basta
inserir o link para procura disponibilizado pela Google e instalar o pacote completo.
https://dl-ssl.google.com/android/eclipse/

Android


34

2.3. HelloWorld!

Como primeiro projeto e para ambientao no Eclipse, cria-se o projeto padro
Hello World. Na rea esquerda do ambiente existe o explorador de projetos. Basta
abrir o menu flutuante do projeto e selecionar a opo New -> Android Project.

Em seguida, coloca-se o nome do projeto (no caso HelloWorld) e seleciona-se,
em Build Target a verso de API a ser utilizada (no caso, mais atual). interessante
observar que para cada verso de API existe uma opo bsica e uma opo Google
API, que inclui cdigos de integrao entre servios Google.
Na seo Properties, necessrio preencher o nome da aplicao
(HelloWorld), o nome do pacote (hello.world), a principal Activity
(HelloWorldActivity) e a verso mnima de API (a mesma selecionada no Build
Target, como por exemplo 8). Por fim, basta finalizar a criao.
Android


35
Conforme configurado, o prprio SDK se encarrega de criar a atividade principal
(HelloWorld Activity), cujo cdigo pode-se conferir em src -> hello -> world ->
HelloWorldActivity.java.

Uma Activity (atividade) , basicamente, uma Classe com escopo de execuo.
Possui o mtodo onCreate que responsvel por executar o primeiro cdigo da
Classe. Dessa forma, quando define-se uma Activity principal de incio, executa-se sua
criao em primeiro lugar.

Android


36

2.4. Estrutura de um projeto e XML

Conforme pode-se analisar no navegador de projetos do Eclipse, uma aplicao
Java para Android dividida em diversos componentes. Cada pasta e sub-pacotes do
projeto responsvel por alguma funo na aplicao e pode-se destacar alguns
elementos:

assets: a pasta utilizada para armazenamento de mdias diversas, como imagens,
vdeos, msicas, que no so utilizadas como elementos de layout, mas de contedo;
bin: pasta onde fica armazenado o cdigo compilado das classes Java;
gen: pasta de arquivos gerados automaticamente pelo SDK. Esta pasta, assim
como seus arquivos, no deve ser modificada, pois qualquer alterao pode
comprometer a integridade do cdigo gerado automaticamente. A Classe R muito
importante, pois ela armazena referncias hexadecimais a todos componentes globais da
aplicao, como elementos de layout;
Android


37
res: pasta de recursos. Possui subpastas drawable-* responsvel por armazenar
as imagens para elementos de tela (layout) em diversas resolues (ldpi, mdpi e
hdpi referenciam baixa, mdia e alta qualidade, respectivamente). A pasta layout
possui os arquivos XML de layout, onde cada um destes arquivos formado por tags que
respresentam os elementos de tela (como campos de texto, botes e grades de
alinhamento) e so utilizados em Classes Activity. Por fim, h a pasta values, que
por sua vez possui arquivos XML diversos, mais utilizados para definies de constantes
globais, como o strings.xml;
src: pasta responsvel por armazenar todas as classes do projeto, podendo ser
separadas por pacotes secundrios ou no.
Existe, ainda, o arquivo AndroidManifest.xml, responsvel pelas principais
definies da aplicao, como nmero da verso de cdigo, verso de SDK, referncias
a cone e nome da aplicao, permisses de acesso e recursos necessrios, declarao
de atividades, servios e demais componentes da aplicao, etc.
Para melhor interpretao da estrutura de arquivos de uma aplicao Java para
Android, interessante conhecer o funcionamento da linguagem XML. Extensible
Markup Language (Lnguagem de Marcao Extensvel) um recurso recomendado pela
W3C (consrcio internacional regulamentador da web) para manipulao de dados de
forma especfica. Com o XML, possvel montar estruturas de dados baseadas em tags,
realizando agrupamentos de tags e adicionando atributos e valores a elas. Dessa forma,
possvel compartilhar dados especficos, com uma quantidade ilimitada de tags
diferentes, em uma linguagem compreensvel tanto por computadores quanto por
humanos.
Exemplo de cdigo XML:
<?xml ver si on=" 1. 0" encodi ng=" I SO- 8859- 1" ?>
<r ecei t a nome=" po" t empo_de_pr epar o=" 5 mi nut os"
t empo_de_cozi ment o=" 1 hor a" >
<t i t ul o>Po si mpl es</ t i t ul o>
<i ngr edi ent es>
<i ngr edi ent e quant i dade=" 3"
uni dade=" x car as" >Far i nha</ i ngr edi ent e>
<i ngr edi ent e quant i dade=" 7"
uni dade=" gr amas" >Fer ment o</ i ngr edi ent e>
<i ngr edi ent e quant i dade=" 1. 5" uni dade=" x car as"
est ado=" mor na" >gua</ i ngr edi ent e>
<i ngr edi ent e quant i dade=" 1" uni dade=" col her es de
ch" >Sal </ i ngr edi ent e>
Android


38
</ i ngr edi ent es>
<i nst r ucoes>
<passo>Mi st ur e t odos os i ngr edi ent es, e di ssol va
bem. </ passo>
<passo>Cubr a comumpano e dei xe por uma hor a emuml ocal
mor no. </ passo>
<passo>Mi st ur e novament e, col oque numa bandej a e asse num
f or no. </ passo>
</ i nst r ucoes>
</ r ecei t a>

A partir de um arquivo XML possvel construir um interpretador em diversas
linguagens, muitas das quais possuem API com suporte especfico a leitura deste tipo de
arquivo. Assim, diversas aplicaes podem partilhar de uma mesma fonte de dados. O
grande exemplo a utilizao de arquivos XML em WebServices (recursos de
compartilhamento de informaes e integraes entre servios na web), como o
fornecimento de dados do Twitter.
Android


39

2.5. Compilao, execuo e depurao

O SDK Android conta com um emulador de plataformas Android, chamado de AVD
(Android Virtual Device). No diretrio de instalao do SDK existe um programa
chamado AVD Manager.exe, onde possvel configurar diversos emuladores, para as
diversas verses do sistema Android.
Na tela principal, possvel visualizar, modificar, remover ou inicializar um
dispositivo.

Nas opes de criao ou modificao de um dispositivo existente, possvel
configurar opes bastante flexveis para emulao, como tamanho da tela, tamanho de
espao para o carto SD (carto de memria), modelo do processador, etc.
Android


40

Assim, possvel emular praticamente qualquer dispositivo lanado oficialmente
no mercado, tanto smartphones quanto tablets.
No ambiente Eclipse, possvel compilar e executar uma aplicao Android
diretamente nos emuladores criados pelo AVD Manager. No menu flutuante do projeto,
em Run As -> Run Configurations... possvel gerenciar a execuo da aplicao. Na
opo de criar uma nova configurao, possvel selecionar na aba Android o projeto
a ser executado e a Activity a ser executada (inicialmente seleciona a Activity
padro, definida no AndroidManifest.xml ou na criao do projeto). Na aba Target,
selecionado qual o dispositivo emulado a ser executado e algumas opes para ele,
como a alocao de banda de Internet disponvel para ele. O ideal manter o padro
para selecionar o dispositivo manualmente no momento da execuo do app (aplicativo).
Por fim, na aba Commons existem configuraes diversas, como o endereo de
armazenamento da configurao, configuraes de I/O e execuo.
Android


41

Feito isso, basta utilizar a opo Run ou finalizar e selecionar a partir do menu
suspenso, em Run As, a configurao recm criada.

Android


42
Alm do dispositivo emulado, pode-se trabalhar com um dispositivo real conectado
via porta USB. Para isso, o dispositivo deve estar configurado com a opo Depurao
USB ativada e ele aparecer na tela de seleo de destino de execuo (mesma dos
emuladores) do app.
O projeto compilado automaticamente no momento da execuo e o IDE acusar
no console uma informao de erro no cdigo, quando houver. Para apenas compilao
manual, necessrio utilizar a opo do menu principal Project -> Build Project.
interessante observar que, quando ocorrem muitas incluses de arquivos internos e
modificaes de cdigo seguidas sem compilao, pode ocorrer uma m formao dos
arquivos gerados automaticamente. Para corrigir isso, basta utilizar a opo do menu
principal Project -> Clean... e, logo aps, executar ou utilizar o Build no projeto.
O processo de depurao muito semelhante ao de execuo. Ao invs de utilizar
o menu Run As, utiliza-se o Debug As. O processo de depurao monta a mquina
virtual com opes para execuo passo-a-passo, o que ajuda muito no diagnstico de
problemas runtime (em tempo de execuo). Os erros de cdigo so filtrados em tempo
de compilao, ao realizar o Build do projeto, porm os erros lgicos no tratados
podem gerar falhas em tempo real de execuo (como o caso da diviso por zero). Neste
caso, pode-se observar no console a linha de cdigo responsvel pela mensagem de
falha. Com o cursor marcado nesta linha de cdigo da Classe especfica, pode-se utilizar
os comandos de debug, encontrados no menu principal Run -> Toogle Breakpoint. Ao
executar a aplicao, na parte referente ao trecho de cdigo sinalizado, a mquina
virtual realizar uma pausa e o IDE redireciona para o ambiente de depurao, onde
possvel realizar alteraes ou sinalizar novas paradas.
Android


43

Neste ambiente, possvel analisar os processos realizados pela mquina virtual
na interpretao do programa, analisar variveis e propriedades atribudas da mesma
maneira que em um teste de mesa, visualizar o console e visualizar passo a passo a
interpretao do cdigo.
Os principais comandos de depurao so encontrados no menu principal Run:
Step Into: avana para a primeira linha de processamento aps a linha atual,
considerando a entrada em mtodos, ou seja, caso a linha atual seja uma chamada de
mtodo, o depurador avana para a primeira linha do escopo deste mtodo;
Step Return: avana para a primeira linha de processamento aps sair do mtodo
atual, frequentemente utilizado para sair de um Step Into;
Step Over: avana para a primeira linha de processamento aps a linha atual, sem
entrar no mtodo chamado, quando for o caso.
Para depurao mais avanada, como anlise de gerenciamento de memria,
armazenamento e processamento, existe o ambiente DDMS (Dalvik Debug Monitor
Service). Todos ambientes disponibilizados no IDE podem ser alternados pelos seus
botes de atalho (por definio no canto superior direito) ou atravs do menu principal
Window -> Open Perspective.
Android


44

Com a utilizao do DDMS possvel enviar para o emulador, mudanas de sinal
(como, por exemplo, a perda de conexo de dados 3G), mudana de localizao GPS,
simulao de entrada de chamada, etc. importante entender que este funcionamento
est relacionado apenas dispositivos emulados, e no funciona com dispositivos reais
conectados e depurados. Alm disso, na guia Allocation Tracker, possvel monitorar
a alocao de objetos em memria, selecionando na guia Devices qual o aplicativo a
ser monitorado (no caso, o HelloWorld). Atravs do File Explorer, possvel
controlar a entrada e sada de elementos no sistema de arquivo do emulador, assim
como do seu carto SD simulado, o que pode ser muito til em aplicaes que gerenciam
arquivos (por exemplo, uma cmera). Por fim, pode-se analisar o LogCat, responsvel
pela exibio de mensagens de mais baixo nvel, diretamente da mquina virtual, com a
possibilidade de realizar filtros de busca.

Android


45

2.6. Empacotamento, publicao e instalao do app

Aps uma aplicao Android ser bem arquitetada, codificada, enfim produzida,
necessrio realizar o empacotamento para instalao nos dispositivos, alm da
publicao no Google Play. Um arquivo executvel de uma aplicao Android
exportado em formato APK, que compacta as informaes necessrias para
interpretao do programa.
Para gerar um APK a partir do Eclipse relativamente simples. Com o menu
suspenso Android Tools -> Export Application Package possvel escolher entre duas
opes, Signed ou Unsigned. Para eventuais testes e distribuio no oficial (como
verses beta), possvel gerar um pacote no assinado (unsigned). J para publicao
no Google Play, obrigatrio que o aplicativo seja digitalmente assinado (signed). Para
isso, necessrio criar uma chave de assinatura digital criptografada, contendo um
encapsulamento por usurio e senha e dados informativos, como validade do certificado
e nome e localizao da empresa produtora do app.


Android


46
Com o APK gerado e digitalmente assinado, possvel envi-lo para publicao
no Google Play.
https://play.google.com/apps/publish/
Acessando o endereo acima, devidamente autenticado com uma conta Google,
possvel enviar um arquivo APK, informando dados de publicao, como nome do app,
verso atual, descritivo do produto, categoria, vdeos e imagens de divulgao, logo, etc.

Android


47




Android


48
interessante observar algumas opes disponveis na publicao. A principal
delas a opo de proteger o aplicativo contra cpias, o que faz com que o aplicativo
tenha que ser baixado atravs do Play, no podendo ser copiado para outros
dispositivos. Em uma aplicao gratuita onde a necessidade a distribuio em larga
escala, pode ser um bom recurso a desativao da proteo contra cpias.
possvel, ainda, definir um valor de venda do aplicativo. O recebimento dos
valores realizado atravs da conta Google configurada no Google Checkout, o
mesmo sistema de recebimentos utilizado pelo Google AdSense. A Google realiza
pagamentos acima de U$ 100,00, atravs de transferncia por bancos internacionais,
portanto necessrio ter uma conta que suporte tal recebimento.
Aps a aprovao dos regulamentos e diretrizes impostas pela Google, o
aplicativo est imediatamente disponvel nos pases optados atravs do cadastro. Outro
diferencial do sistema da Google sobre os concorrentes a publicao, onde a avaliao
de integridade realizada aps a publicao, fazendo com que esta seja instantnea.

Android


49

3. Conceitos Bsicos

Para construir um aplicativo alm do HelloWorld necessrio conhecer um
pouco mais sobre os componentes fundamentais do Android.
Activities: classes (Activity) responsveis pelo cdigo back-end de uma
interface grfica, onde tudo comea na aplicao;
Services: classes (Service) responsveis por cdigos a serem executados por
tempo maior, em segundo plano, sem a necessidade de interveno por parte do usurio;
Content Provider: no Android, no possvel acessar contedo de outros
aplicativos diretamente a partir de um aplicativo terceiro. Para resolver isso, existe esta
classe que fornece os contedos como, por exemplo, o acesso galeria de fotos ou
agenda de contatos, atravs de chamadas e URI (Uniform Resource Identifier)
especficos. possvel, ainda, implementar provedores de contedo prprios para acesso
externo;
Intent e IntentFilter: a classe Intent funciona (como nome sugere, inteno)
como uma chamada permisso de execuo de ao. Toda ao solicitada ao Android
para executar um Intent, como a transio entre Activity, realizao de uma
chamada telefnica ou acesso a um ContentProvider. IntentFilter, por sua vez,
serve para predefinir chamadas para Intents especficos atravs de constantes,
indicando quais recursos a atividade tem interesse em utilizar;
Processos e Threads: por padro, o sistema Android gerencia toda a aplicao em
um nico processo. Em alguns momentos pode ser interessante criar processos
separados para algumas atividades, a fim de que a quebra dela no interfira na quebra
do sistema. J a concorrncia de cdigo (Thread) funciona como uma nica
concorrncia de interface, podendo ser necessrio separar alguns processamentos dela.

Android


50

3.1. Activity, Intent e IntentFilter

Partindo do conceito de que uma atividade (Activity) Android funciona como
um gerenciador back-end de uma interface grfica, pode-se entender que esta possui
um ciclo de vida, e que cada fase deste ciclo possui suas prprias funes e
caractersticas.



Android


51
Pode-se notar que a utilizao de chamadas de espera (pause) de uma atividade
para exibio de outra um processo muito comum e prtico, porm importante
observar que o gerenciamento de memria em uma aplicao mvel bastante delicado.
necessrio possuir a certeza de que o processo no ser interrompido ao executar uma
espera, caso contrrio o contedo do processo anterior poder ser perdido.
Quando realiza-se a transio entre atividades (e esta pode ser feita com suporte a
transies grficas de UI, User Interface), a atividade nova passa ao estado de
execuo, enquanto a anterior passa ao estado de espera, caso no haja despejo de
memria. Desta forma, a atividade em execuo consegue se comunicar com a atividade
em espera. A maneira mais comum de realizar transio entre atividades a partir da
criao de um Intent.
publ i c cl ass Mai n ext ends Act i vi t y {
@Over r i de
publ i c voi d onCr eat e( Bundl e savedI nst anceSt at e) {
super . onCr eat e( savedI nst anceSt at e) ;
set Cont ent Vi ew( R. l ayout . mai n) ;

f i nal But t on addBut t on = ( But t on) f i ndVi ewByI d( R. i d. bAdd) ;
addBut t on. set OnCl i ckLi st ener ( add_l i st ener ) ;
}

OnCl i ckLi st ener add_l i st ener = new OnCl i ckLi st ener ( ) {
@Over r i de
publ i c voi d onCl i ck( andr oi d. vi ew. Vi ew v) {
I nt ent myI nt ent = new
I nt ent ( get Appl i cat i onCont ext ( ) , AddCl ass. cl ass) ;
myI nt ent . put Ext r a( " i d_i t em" , 0) ;
st ar t Act i vi t y( myI nt ent ) ;
}
}
}


Vale pena observar o tratamento de eventos em uma interface Android. No
exemplo acima, foi criado um Objeto OnClickListener e atribudo ao boto
addButton. Desta forma, ao acion-lo na aplicao, criado um novo Intent
referente Activity AddClass, passado um parmetro de referncia id_item
como 0 (em uma edio, pode-se passar o ID do item, por exemplo) e iniciada a
atividade.
Outro cdigo importante referente criao do boto addButton. possvel
notar que o parmetro passado ao mtodo findViewById R.id.bAdd. Isso porque a
Android


52
classe R, responsvel por armazenar referncias em hexadecimal dos elementos de
layout possui subclasses, dentre elas a id, responsvel por referenciar diretamente
elementos grficos. Imaginado que existe um arquivo de layout correspondente
atividade (no caso, R.layout.main representa o arquivo main.xml), entende-se que
existe um elemento com ID bAdd, neste arquivo.

Aps a utilizao do putExtra() para passar parmetros ao Intent, possvel,
na inicializao da atividade chamada recuperar estes parmetros atravs do seguinte
cdigo.

Bundl e ext r as = get I nt ent ( ) . get Ext r as( ) ;
i nt i d_i t em= ext r as. get I nt ( i d_i t em) ;

possvel buscar o contedo do armazenamento de parmetros a partir de
mtodos como getInt(), tambm utilizado com String (getString()) ou qualquer tipo
primitivo, dependendo do parmetro passado no putExtra().

Dentre os principais mtodos da classe Activity, pode-se destacar:

onCreate() - o primeiro mtodo a ser executada quando uma Activity
instanciada. Geralmente o mtodo responsvel por carregar os layouts (XML).
executada somente uma vez durante o ciclo de vida;

onStart() - chamado imediatamente aps a criao, mas tambm quando uma
Activity em background volta a ter foco;

onResume() - assim como onStart(), chamado na inicializao e na
reinicializao da Activity. A diferena que onStart() s chamado quando a
Activity no mais visvel na tela volta a ter foco, enquanto onResume() sempre
chamado;

onPause() - o primeiro mtodo a ser invocado quando a Activity perde o foco
(ou seja, uma outra Activity entrou em execuo);

onStop() - anloga onPause(), s chamada quando a Activity fica
completamente encoberta por outra Activity (no mais visvel).

onDestroy() ltimo mtodo do ciclo de vida a ser executado. Depois, a
Activity considerada morta, ou seja, no podendo ser reiniciada;

onRestart() - chamado imediatamente antes de onStart(), quando uma
Activity volta a ter o foco aps estar em background.

Android


53
Como j visto anteriormente e utilizado no exemplo, um Intent (no sentido
literrio, inteno), a informao de chamada de execuo especfica do sistema a
realizar. Na anlise do cdigo, nota-se o uso simples de um Intent, utilizando o
contexto atual da aplicao e passando a referncia de uma Classe a ser utilizada como
atividade. Isso faz com que a atividade chamada entre em plano principal.

Com a utilizao de IntentFilter possvel informar quais recursos estaro
disponveis para a atividade (no confundir com permisses) para que esta possa ser
mais enxuta possvel. Para cada atividade, necessrio definir no manifesto a utilizao
deste filtro, assim como criar as categorias disponveis (ao menos uma necessria).

Dentro da tag <application/>, devem ser definidas todas as atividades do
programa (sempre) e os filtros de intenes das respectivas atividades.

<act i vi t y
andr oi d: name=" . Mai n"
andr oi d: l abel =" @st r i ng/ app_name" >
<i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. MAI N" / >
<cat egor y andr oi d: name=" andr oi d. i nt ent . cat egor y. LAUNCHER"
/ >
</ i nt ent - f i l t er >
</ act i vi t y>


No caso, a atividade referente classe Main possui os interesses em ser a
principal atividade (MAIN) e poder ser inicializada pelo app launcher
(LAUNCHER).

A lista completa de filtros pode ser encontrada no endereo:

http://developer.android.com/reference/android/content/Intent.html

Android


54

3.2. Service

Um servio (Service), semelhantemente a uma atividade, tambm possui um
ciclo de vida, porm este vlido at o sistema necessitar de memria, caso no haja um
pedido de interrupo previsto.

Servios so utilizados normalmente para executar algum processo em segundo
plano, onde no seja necessria a interveno por parte do usurio. Um exemplo comum
o download de apps do Google Play. Ao solicitar o download, criado um cone na
barra de notificao que indica que o app est sendo baixado. Este processo de
download executado em segundo plano e no necessita interveno por parte do
usurio para ser concludo.
Existem dois tipos de servios, os locais e os remotos. Servios locais so aqueles
executados dentro do processo da aplicao, sem necessidade de nenhuma interferncia
remota. Poderiam ser substitudos por Thread, porm, em processamentos mais
complexos, uma Thread pode gerar problemas, enquanto um Service tem
propriedades especficas de processamentos mais complexos. J os servios remotos so
executados em um processamento em separado da aplicao principal, totalmente
independente, podendo ser executado em segundo plano sem a aplicao principal estar
em execuo (como uma quebra de memria). Geralmente, so utilizados para
construo de webservices, onde a dependncia de uma conexo de Internet alta e
torna-se interessante a excluso do processamento. O que diferencia estes dois tipos
sua declarao no manifesto (AndroidManifest.xml).
Android


55
Alm disso, existem dois tipos de implementao de um servio Android. A
primeira consiste no Unbounded ou Started, onde o servio iniciado e somente
ser interrompido quando for solicitada sua parada atravs de cdigo prprio ou de
outra aplicao que tenha poder de interferncia nele (o que declarado no manifesto).
A segunda consiste no Bounded, onde o servio fica permanentemente amarrado
aplicao que o iniciou, sendo o servio finalizado por cdigo explicitou ou
encerramento da aplicao que o iniciou. A diferena est nos mtodos utilizados para
codificao. Enquanto um servio Started executado a partir do startService(),
um servio Bounded iniciado pelo bindService().




Android


56
publ i c cl ass Hel l oSer vi co ext ends Ser vi ce {
i nt mSt ar t Mode; / / i ndi ca o compor t ament o do ser vi o
I Bi nder mBi nder ; / / i nt er f ace par a os cl i ent es amar r ados
bool ean mAl l owRebi nd; / / i ndi ca que o ser vi ce pode ser amar r ado

@Over r i de
publ i c voi d onCr eat e( ) {
/ / ser vi o cr i ado
}
@Over r i de
publ i c i nt onSt ar t Command( I nt ent i nt ent , i nt f l ags, i nt st ar t I d)
{
/ / ser vi ce i ni ci ado pel o st ar t Ser vi ce( )
r et ur n mSt ar t Mode;
}
@Over r i de
publ i c I Bi nder onBi nd( I nt ent i nt ent ) {
/ / cl i ent e conect ado ao ser vi o pel o bi ndSer vi ce( )
r et ur n mBi nder ;
}
@Over r i de
publ i c bool ean onUnbi nd( I nt ent i nt ent ) {
/ / t odos os cl i ent es so desamar r ados pel o unbi ndSer vi ce( )
r et ur n mAl l owRebi nd;
}
@Over r i de
publ i c voi d onRebi nd( I nt ent i nt ent ) {
/ / cl i ent e conect ado ao ser vi o novament e at r avs do
bi ndSer vi ce( ) , depoi s que o onUnbi nd( ) f oi chamado
}
@Over r i de
publ i c voi d onDest r oy( ) {
/ / o ser vi ce f i nal i zado e dest r u do
}
}










Dentre os principais mtodos de Service, pode-se destacar:
Android


57

onStartCommand() - mtodo chamado quando outro componente, como uma
atividade, faz a requisio para que o servio seja iniciado chamando startService().
O servio iniciado e pode rodar em background indefinidamente. Se for implementado
isso, responsabilidade do cdigo parar o servio, uma vez que o trabalho feito
chamando stopSelf() ou stopService();

onBind() - mtodo chamado quando outro componente quer fazer o bind com o
servio (para realizar um RPC, Remote Procedure Call) chamando bindService(). Na
implementao deste mtodo, deve ser provida uma interface onde os clientes podero
comunicar-se com o servio, retornando um IBinder;

onCreate() - mtodo chamado quando o servio criado pela primeira vez, para
realizar procedimentos de configurao iniciais (antes mesmo de executar ou o
onStartCommand() ou onBind());

onDestroy() - mtodo chamado quando o servio est sendo destrudo. Mtodo que
deve ser implementado para limpar os recursos instanciados, como threads, listeners
registrados, receivers, etc. a ltima chamada que o servio recebe.

Android


58

3.3. ContentProvider

ContentProvider uma das partes mais importantes no estudo de arquitetura
de aplicaes Android, pois ele responsvel pela comunicao saudvel entre apps. O
sistema operacional da Google foi construdo com base em algumas normas de boas
prticas, dentre as quais consta que o ideal que a persistncia de um programa seja
transparente, tanto ao cdigo-fonte de negcio do prprio programa quanto a
programas externos. Dessa forma, no possvel acessar um banco de dados de uma
aplicao externa diretamente e a que entram os provedores de contedo.

A comunicao entre aplicaes e provedores de contedo se torna simples,
realizada a partir de um endereo URI, onde possvel realizar aes como incluso,
excluso e, principalmente, consulta de dados. Cada Content Provider possui uma
estrutura de URI prpria, baseada na estrutura geral. Por exemplo, para acessar o
contedo da caixa de mensagens de texto, possvel solicitar o ContentProvider
compartilhado do aplicativo de mensagens atravs a URI content://sms/inbox.
possvel ainda realizar a passagem de parmetros para esta URI.
content://pacote.app.nomeDoCP/nomeEntidade/ID
Da mesma forma que o utilizado por Activity e Service, para criar um
provedor de contedo, basta derivar uma Classe da ContentProvider, implementando
seus mtodos, e realizar a incluso referente no manifesto.

Android


59
publ i c cl ass Hel l oPr ovi der ext ends Cont ent Pr ovi der {
publ i c st at i c f i nal Ur i CONTENT_URI = Ur i
. par se( " cont ent : / / hel l o. wor l d. hel l opr ovi der " ) ;

@Over r i de
publ i c i nt del et e( Ur i ur i , St r i ng sel ect i on, St r i ng[ ]
sel ect i onAr gs) {
r et ur n 0;
}

@Over r i de
publ i c St r i ng get Type( Ur i ur i ) {
r et ur n nul l ;
}

@Over r i de
publ i c Ur i i nser t ( Ur i ur i , Cont ent Val ues val ues) {
r et ur n nul l ;
}

@Over r i de
publ i c bool ean onCr eat e( ) {
r et ur n f al se;
}

@Over r i de
publ i c Cur sor quer y( Ur i ur i , St r i ng[ ] pr oj ect i on, St r i ng
sel ect i on,
St r i ng[ ] sel ect i onAr gs, St r i ng sor t Or der ) {
r et ur n nul l ;
}

@Over r i de
publ i c i nt updat e( Ur i ur i , Cont ent Val ues val ues, St r i ng
sel ect i on,
St r i ng[ ] sel ect i onAr gs) {
r et ur n 0;
}
}

Dessa, forma possvel realizar a chamada de contedo a partir de outro app,
atravs da URI content://hello.world.helloprovider.

Dentre os principais mtodos da classe ContentProvider, pode-se destacar:
query() - usado para recuperar dados;
Android


60
insert() usado para inserir dados;
update() usado para atualizar dados;
delete() - usado para excluir dados;
getType() usado para obter o MIME type de certo dado;

Android


61

3.4. Processo e Thread

Cada aplicao possui um processo nico de execuo e todos os elementos pr-
definidos dela so executados dentro deste processo. Em alguns casos, pode ocorrer
sobrecarga de memria e processamento. Para resolver isso, existem algumas
artimanhas, como a utilizao de servios remotos (visto anteriormente). J para
processamentos em menor escala, mas que necessitam de execuo concorrente, pode
ser utilizada uma implementao da classe Thread (ou Runnable), como uma
aplicao Java comum.

publ i c cl ass Pr ogr essDi al ogExampl e ext ends Act i vi t y i mpl ement s
Runnabl e {
pr i vat e St r i ng pi _st r i ng;
pr i vat e Text Vi ew t v;
pr i vat e Pr ogr essDi al og pd;

@Over r i de
publ i c voi d onCr eat e( Bundl e savedI nst anceSt at e) {
super . onCr eat e( savedI nst anceSt at e) ;
set Cont ent Vi ew( R. l ayout . mai n) ;

t v = ( Text Vi ew) t hi s. f i ndVi ewByI d( R. i d. mai n) ;
t v. set Text ( " Pr ess any key t o st ar t cal cul at i on" ) ;
}

@Over r i de
publ i c bool ean onKeyDown( i nt keyCode, KeyEvent event ) {

pd = Pr ogr essDi al og. show( t hi s, " Wor ki ng. . " ,
" Cal cul at i ng Pi " , t r ue, f al se) ;

Thr ead t hr ead = new Thr ead( t hi s) ;
t hr ead. st ar t ( ) ;

r et ur n super . onKeyDown( keyCode, event ) ;
}

publ i c voi d r un( ) {
pi _st r i ng = Pi . comput ePi ( 800) . t oSt r i ng( ) ;
handl er . sendEmpt yMessage( 0) ;
}



pr i vat e Handl er handl er = new Handl er ( ) {
Android


62
@Over r i de
publ i c voi d handl eMessage( Message msg) {
pd. di smi ss( ) ;
t v. set Text ( pi _st r i ng) ;
}
};
}

O exemplo acima calcula o valor do PI com 800 comutaes e o escreve na tela. O
processo disparado por um simples aperto de tecla (caso teclado fsico, seno toque) e,
caso o evento de tecla ocorra durante o processamento, disparada uma mensagem
informando o no trmino dele.

O objeto Handler muito importante, pois ele que faz a comunicao entre os
processos concorrentes.

http://developer.android.com/reference/android/os/Handler.html

Android


63

3.5. Manifesto

Conhecidos os principais elementos de uma estrutura de cdigo Android, pode-se
estudar o arquivo de manifesto da aplicao. Este arquivo responsvel por definir as
informaes vitais para o app, como identificadores, verses, permisses de acesso
externo e definir quais elementos so presentes nesta aplicao, como atividades,
servios, provedores de contedo e filtros de intenes.

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<mani f est >

<uses- per mi ssi on / >
<per mi ssi on / >
<per mi ssi on- t r ee / >
<per mi ssi on- gr oup / >
<i nst r ument at i on / >
<uses- sdk / >
<uses- conf i gur at i on / >
<uses- f eat ur e / > <suppor t s- scr eens / >
<compat i bl e- scr eens / >
<suppor t s- gl - t ext ur e / >

<appl i cat i on>
<act i vi t y>
<i nt ent - f i l t er >
<act i on / >
<cat egor y / >
<dat a / >
</ i nt ent - f i l t er >
<met a- dat a / >
</ act i vi t y>

<act i vi t y- al i as>
<i nt ent - f i l t er > . . . </ i nt ent - f i l t er >
<met a- dat a / >
</ act i vi t y- al i as>

<ser vi ce>
<i nt ent - f i l t er > . . . </ i nt ent - f i l t er >
<met a- dat a/ >
</ ser vi ce>

<r ecei ver >
<i nt ent - f i l t er > . . . </ i nt ent - f i l t er >
<met a- dat a / >
Android


64
</ r ecei ver >

<pr ovi der >
<gr ant - ur i - per mi ssi on / >
<met a- dat a / >
</ pr ovi der >

<uses- l i br ar y / >

</ appl i cat i on>
</ mani f est >

Cada tag de utilizao prevista no AndroidManifest.xml possui diversos
atributos que podem ser utilizados e sofrem constantes mudanas devido s novas
verses do Android. A relao completa de atributos mais atual pode ser encontrada
seguinte endereo:

http://developer.android.com/guide/topics/manifest/manifest-intro.html

Como exemplo de um manifesto de aplicao HelloWorld, tem-se:

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<mani f est xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
package=" hel l o. wor l d"
andr oi d: ver si onCode=" 1"
andr oi d: ver si onName=" 1. 0" >

<uses- sdk andr oi d: mi nSdkVer si on=" 15" / >

<appl i cat i on
andr oi d: i con=" @dr awabl e/ i c_l auncher "
andr oi d: l abel =" @st r i ng/ app_name" >
<act i vi t y
andr oi d: name=" . Hel l oWor l dAct i vi t y"
andr oi d: l abel =" @st r i ng/ app_name" >
<i nt ent - f i l t er >
<act i on andr oi d: name=" andr oi d. i nt ent . act i on. MAI N" / >

<cat egor y
andr oi d: name=" andr oi d. i nt ent . cat egor y. LAUNCHER" / >
</ i nt ent - f i l t er >
</ act i vi t y>
</ appl i cat i on>

</ mani f est >
Android


65

4. Interface Grfica

Com os aplicativos de smartphones e tablets cada vez mais integrados web, a
catlogos e ao conceito de armazenamento de informaes em nuvem, um dos principais
elementos de um app a apresentao grfica. Tanto em jogos, quanto em catlogos e
em aplicativos coorporativos ou de produtividade, a direo de arte converge para
elementos mais limpos e de navegao mais intuitiva, atingindo diversos nveis de
usurios, desde os mais novatos aos mais experientes.

O Android SDK combinado com o ADT possui recursos e bibliotecas de enorme
qualidade para construo de uma arquitetura de layout moderna e representativa. A
construo a partir destes recursos como uma mistura entre as interfaces Swing e
HTML (web), suportando a construo de layouts em tabela, em camadas e atributos de
posicionamento, controle de bordas, imagens, cores, e diversos componentes visuais.

Como j visto, a arquitetura de um aplicativo Android Java possui elementos de
layout em XML, carregados, geralmente, a partir de uma atividade. Ao editar um
arquivo desse tipo com o Eclipse, com o ADT, possvel visualizar tanto o cdigo texto
(XML), quanto a edio visual, onde possvel adicionar componentes e controlar os
layouts a partir de drag and drop.




Android


66
possvel notar basicamente trs blocos principais para arquitetura de tela no ADT.
A parte principal, o editor, composta de uma aba para edio visual (Graphic
Layout) e outra de cdigo (nomeDoArquivo.xml). Na guia de edio visual,
possvel observar uma barra de componentes visuais e uma rea de montagem de tela.
possvel, ento, arrastar um componente para a rea de montagem. Cada modificao
feita no editor visual automaticamente carregada no editor de texto e vice e versa.

Alm disso, possvel observar uma barra lateral contendo a exibio de hierarquia
de componentes em rvore e um bloco, talvez o principal, de edio de propriedades do
componente. Ao selecionar um componente especfico, so exibidas neste bloco as
propriedades referentes a ele, como alinhamento, posicionamento, cores, textos e o ID do
componente.

Por padro, a propriedade ID do componente composta de um valor em sequncia
(ex.: @+id/button1). importante manter o valor at a primeira barra (/),
alterando apenas o contedo final, o ID em si ( button1, no caso). Isto faz com que, no
componente de referncias gerado automaticamente (R.class), seja adicionada uma
referncia a este objeto, podendo ser utilizada a chamada direta (como R.id.button1).

Cada componente de layout derivado de View(widgets) ou ViewGroup, sendo
que um ViewGroup pode ser composto de View ou de outros ViewGroup, na
quantidade que for necessria para construir um layout.




Android


67

4.1. Layouts

Existem diversos tipos de arquitetura de layouts em Java e em HTML, e algumas
das principais esto presentes no desenvolvimento Android.Os containers de layout so
componentes derivados de ViewGroup. Dentre os principais tipos de layout de uma
arquitetura de tela Android, pode-se destacar os seguintes:

LinearLayout o layout utilizado por padro nos componentes XML criados.
Seu principal objetivo montar os elementos em forma corrente, sendo da esquerda para
a direita em layout horizontal e de cima para baixo em layout vertical. A orientao do
layout definida pela propriedade orientation.



Este estilo de layout pode ser til em casos de design de tela simples, com
elementos ocupando reas completas de largura ou altura (dependendo da orientao
especificada), pois ele respeita automaticamente as margens e os alinhamentos perante
outras View. possvel definir o alinhamento dos componentes na edio dos layouts
Android, atravs da propriedade gravity. Atravs da propriedade layout_weight
possvel organizar os elementos por pesos (prioridades), a fim de algumas Views
ocuparem maior ou menor espaamento em tela (o padro 0).

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<Li near Layout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" f i l l _par ent "
andr oi d: or i ent at i on=" ver t i cal " >

<Text Vi ew
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" @st r i ng/ hel l o" / >

<But t on
andr oi d: i d=" @+i d/ bAdd"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
Android


68
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" I ni ci ar Thr ead" andr oi d: l ayout _wei ght =" 0" / >

<Text Vi ew
andr oi d: i d=" @+i d/ t v"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" " / >

</ Li near Layout >

FrameLayout - organiza o elemento em pilhas conforme sua adio, onde os
elementos adicionados por ltimo so mostrados na camada mais acima, podendo estes
elementos ser reordenados atravs da rvore de hierarquias. normalmente utilizado
como container para troca de componentes de mesmo tipo. Por exemplo se existe uma
imagem a ser trocada temporariamente (ou em algum evento especfico, como um toque
em um boto), possvel colocar todas as imagens em um FrameLayout, ocultando as
inutilizadas a partir da propriedade visibility.






<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<Fr ameLayout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: i d=" @+i d/ f r ameLayout 1"
andr oi d: l ayout _wi dt h=" mat ch_par ent "
andr oi d: l ayout _hei ght =" f i l l _par ent " >

<But t on
andr oi d: i d=" @+i d/ but t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" But t on 1" andr oi d: vi si bi l i t y=" i nvi si bl e" / >

<But t on
Android


69
andr oi d: i d=" @+i d/ but t on2"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" But t on 2" andr oi d: vi si bi l i t y=" i nvi si bl e" / >

<But t on
andr oi d: i d=" @+i d/ but t on3"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" But t on 3" / >

</ Fr ameLayout >

AbsoluteLayout - este container derivado da programao HTML, onde
possvel definir camadas de posicionamento x,y absoluto sobre outros elementos,
como um plano cartesiano. A coordenada x medida da esquerda para a direita e a
camada y de cima para baixo. Por padro, os elementos adicionados em um
AbsoluteLayout possuem coordenadas (0,0), ficando no topo esquerdo da tela. Este
tipo de layout comum na exibio de mensagens personalizadas sobre a tela (e sobre
outros componentes). importante cuidar ao construir um layout absoluto, pois alm de
elementos poderem ser sobrepostos por descuido no posicionamento, possvel que
ocorra muita diferena entre resolues diferentes (as medidas so absolutas).





<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<Absol ut eLayout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: i d=" @+i d/ absol ut eLayout 1"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" f i l l _par ent " >

<Edi t Text
andr oi d: i d=" @+i d/ edi t Text 1"
andr oi d: l ayout _wi dt h=" 248dp"
Android


70
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _x=" 39dp"
andr oi d: l ayout _y=" 58dp" >

<r equest Focus / >
</ Edi t Text >

<But t on
andr oi d: i d=" @+i d/ but t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _x=" 208dp"
andr oi d: l ayout _y=" 119dp"
andr oi d: t ext =" But t on" / >

</ Absol ut eLayout >

Apesar de possuir vantagens, as falhas devido m construo fizeram com que o
layout absoluto fosse depreciado no Android, tendo sua implementao descontinuada.

RelativeLayout - os layouts relativos servem para posicionar componentes com
relacionamentos entre eles, podendo um elemento ser posicionado abaixo de outro, por
exemplo.


o tipo de container mais utilizado e recomendado, pois com ele possvel
realizar amarraes de elementos s bordas da tela, ficando o layout ntegro e
robusto, independente da resoluo. Alm disso, possvel definir posicionamentos
relativos outros elementos do layout, podendo ser especificada uma margem a partir
da amarrao, novamente mantendo o layout ntegro e robusto.

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<Rel at i veLayout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: i d=" @+i d/ r el at i veLayout 1"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
Android


71
andr oi d: l ayout _hei ght =" f i l l _par ent " >

<Ti mePi cker
andr oi d: i d=" @+i d/ t i mePi cker 1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _al i gnPar ent Top=" t r ue" / >

<Text Vi ew
andr oi d: i d=" @+i d/ t ext Vi ew1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ t i mePi cker 1"
andr oi d: t ext =" Text Vi ew" / >

<Edi t Text
andr oi d: i d=" @+i d/ edi t Text 1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ t ext Vi ew1" >

<r equest Focus / >
</ Edi t Text >

<But t on
andr oi d: i d=" @+i d/ but t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ edi t Text 1"
andr oi d: t ext =" But t on" / >

</ Rel at i veLayout >


TableLayout - este container utilizado da mesma forma que tabelas em HTML ou
que o container de tabelas em Swing. A partir dele, podem ser criados TableRow,
que funcionam, basicamente, como o LinearLayout. Cada View adicionado
considerado uma clula e o nmero de colunas da tabela definido pela linha que
contem mais clulas.

Android


72


<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<Tabl eLayout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: or i ent at i on=" ver t i cal "
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" f i l l _par ent " >

<Tabl eRow>
<Text Vi ew andr oi d: t ext =" Nome: " / >
<Edi t Text andr oi d: t ext =" " / >
</ Tabl eRow>

<Tabl eRow>
<Text Vi ew andr oi d: t ext =" Dat a Nasc. : " / >
<Edi t Text andr oi d: t ext =" " / >
</ Tabl eRow>

<Tabl eRow>
<But t on andr oi d: t ext =" Cadast r ar " / >
</ Tabl eRow>

</ Tabl eLayout >

A partir dos diversos tipos de layout existentes, possvel realizar diversos
aninhamentos, a fim de realizar a melhor arquitetura de tela para a aplicao.
importante que um designer de interface tenha conhecimentos, alm das suas
ferramentas, do funcionamento dos containers de layout, para poder agregar os
elementos da melhor forma possvel e no complicar o trabalho dos engenheiros de
software.

Alm da utilizao padro dos arquivos de layout, referenciados no contexto da
atividade a ser executada, possvel a utilizao de um componente chamado
LayoutInflater, utilizado para a criao de layouts personalizados em objetos com
visualizao padro de componente. Um exemplo muito comum a utilizao do
Android


73
LayoutInflater para a criao de notificaes, como visto na seo de notificaes e
Toaster desta apostila.

A documentao completa do LayoutInflater pode ser encontrada em:

http://developer.android.com/reference/android/view/LayoutInflater.html

Android


74

4.2. Componentes de tela

Os componentes visuais disponibilizados pelo SDK Android so derivados de
View e, por isso, possuem propriedades em comum, alm de suas especficas. Dentre
as principais propriedades em comum, pode-se destacar as referentes ao layout, como
posicionamento, tamanho em largura e altura (x,y) e margens.

O objetivo desta apostila apresentar as possibilidades de componentes existentes
no Android SDK e como podem ser utilizados entre si. A documentao completa da
biblioteca de componentes visuais pode ser encontrada no seguinte endereo:

http://developer.android.com/guide/topics/ui/index.html

Existem alguns componentes que so aninhamentos de containers de layout,
pronto para executarem alguma funo especfica.


Componente Descrio
Gallery Contm uma lista de imagens (suportando roalgem para direita e
esquerda)
GridView Contm uma grade com rolagem e esta contm linhas e colunas
ListView Possui uma lista de View (coluna nica)
ScrollView Coluna nica de elementos (View ou ViewGroups) com rolagem
vertical
Spinner Semelhante uma caixa de seleo, realiza rolagem horizontal ou
vertical, exibindo um nico item por vez, como uma linha de texto
SurfaceView Container semelhante a uma superfcie de desenho, utilizado para
desenhar pixels ao invs de widgets, mesmo assim suportando
componentes dispostos acima
TabHost Componente armazenador de abas, pronto para receb-lascom
suporte a eventos das mesmas
ViewFlipper /
ViewSwitcher
Lista de exibio nica (um item por vez) que pode ser configurado
para trocar componentes, como um slideshow

muito interessante este tipo de componente, pois, mesmo sendo agrupadores de
outros componentes, tem dependncia total e podem ser facilmente implementados. Por
exemplo, para criar uma lista de planetas selecionvel, pode ser utilizado um Spinner.

No arquivo de layout:

<Spi nner
Android


75
andr oi d: i d=" @+i d/ spi nner 1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _al i gnPar ent Top=" t r ue" / >

No arquivo de constantes (strings.xml):

<st r i ng name=" pl anet _pr ompt " >Sel eci one</ st r i ng>
<st r i ng- ar r ay name=" pl anet s_ar r ay" >
<i t em>Mer cr i o</ i t em>
<i t em>Vnus</ i t em>
<i t em>Ter r a</ i t em>
<i t em>Mar t e</ i t em>
<i t em>J pi t er </ i t em>
<i t em>Sat ur no</ i t em>
<i t em>Ur ano</ i t em>
<i t em>Net uno</ i t em>
</ st r i ng- ar r ay>

No cdigo da atividade que utilize o layout contendo o Spinner:

Spi nner spi nner = ( Spi nner ) f i ndVi ewByI d( R. i d. spi nner 1) ;
Ar r ayAdapt er <Char Sequence> adapt er = Ar r ayAdapt er . cr eat eFr omResour ce(
t hi s, R. ar r ay. pl anet s_ar r ay,
andr oi d. R. l ayout . si mpl e_spi nner _i t em) ;
adapt er . set Dr opDownVi ewResour ce( andr oi d. R. l ayout . si mpl e_spi nner _dr opd
own_i t em) ;
spi nner . set Adapt er ( adapt er ) ;

O resultado apresentado ser algo como:

Android


76



interessante observar no cdigo da atividade a utilizao de uma referncia ao
tipo de layout utilizado para o Spinner. A lista completa e atualizada das contantes de
layout que podem ser utilizadas pode ser encontrada em:

http://developer.android.com/reference/android/R.layout.html

Mas estes componentes descritos na grade acima so os chamados componentes
avanados. Dentre os bsicos do desenvolvimento visual para Android pode-se
destacar:

TextView responsvel pela exibio de texto em tela, possui caractersticas
como cor de fundo, de texto, tamanho de texto;

Button responsvel pela exibio de um boto padro de texto simples, possui
caractersticas como cor de fundo, de texto, tamanho de texto;

ImageButton semelhante ao Button, com a possibilidade de utilizar uma
imagem (res) como fundo;

Android


77
EditText campo editor de texto, a partir de qual possvel o usurio colocar
informaes, pode ser configurado como uma rea de texto, adicionando suporte a
quebras de linha;

CheckBox caixa de marcao mltipla, por padro acompanhada de um texto
de etiqueta ao lado;

RadioButton caixa de marcao nica, por padro acompanhada de um texto
de etiqueta ao lado;

RadioGroup agrupamento de RadioButton;

ToggleButton boto com identificador de ligado/desligado, pode ser utilizado
semelhante a um CheckBox, porm sem valor fixo de seleo.



<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<Rel at i veLayout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: i d=" @+i d/ r el at i veLayout 1"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" f i l l _par ent " >

<Text Vi ew
andr oi d: i d=" @+i d/ t ext Vi ew1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
Android


78
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _al i gnPar ent Top=" t r ue"
andr oi d: t ext =" Text Vi ew" / >

<But t on
andr oi d: i d=" @+i d/ but t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ t ext Vi ew1"
andr oi d: t ext =" But t on" / >

<I mageBut t on
andr oi d: i d=" @+i d/ i mageBut t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ but t on1"
andr oi d: sr c=" @andr oi d: dr awabl e/ bt n_st ar _bi g_of f " / >

<Edi t Text
andr oi d: i d=" @+i d/ edi t Text 1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ i mageBut t on1" >

<r equest Focus / >
</ Edi t Text >

<CheckBox
andr oi d: i d=" @+i d/ checkBox1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ edi t Text 1"
andr oi d: t ext =" CheckBox" / >

<Radi oBut t on
andr oi d: i d=" @+i d/ r adi oBut t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
Android


79
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ checkBox1"
andr oi d: t ext =" Radi oBut t on" / >

<Radi oGr oup
andr oi d: i d=" @+i d/ r adi oGr oup1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ r adi oBut t on1" >

<Radi oBut t on
andr oi d: i d=" @+i d/ r adi o0"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: checked=" t r ue"
andr oi d: t ext =" Radi oBut t on" / >

<Radi oBut t on
andr oi d: i d=" @+i d/ r adi o1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" Radi oBut t on" / >

<Radi oBut t on
andr oi d: i d=" @+i d/ r adi o2"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: t ext =" Radi oBut t on" / >
</ Radi oGr oup>

<Toggl eBut t on
andr oi d: i d=" @+i d/ t oggl eBut t on1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" wr ap_cont ent "
andr oi d: l ayout _al i gnPar ent Lef t =" t r ue"
andr oi d: l ayout _al i gnPar ent Ri ght =" t r ue"
andr oi d: l ayout _bel ow=" @+i d/ r adi oGr oup1"
andr oi d: t ext =" Toggl eBut t on" / >
</ Rel at i veLayout >


As principais propriedades que podem ser utilizadas nos componentes de tela so:
id - identificador do componente, usado para cham-lo a partir de referncias;
Android


80
layout_width definio de como ser a largura do componente. Para preencher a
tela inteira utilizado fill_parent, caso a necessidade de adaptao ao tamanho do
contedo, wrap_content;
layout_heigh similar ao layout_width, porm, definio de altura do
componente;
text - propriedade que corresponde ao texto exibido no componente;
src endereo de localizao da imagem a ser carregada no componente;
style - local onde definido o estilo do boto;
orientation definio em um ViewGroup (como o RadioGroup) de como ser
distribudas as View, verticalmente ou horizontalmente;
textOn - atributo do ToggleButton que define o texto a ser exibido quando a flag
estiver marcada;
textOff - atributo do ToggleButton que define o texto a ser exibido quando a flag
estiver desmarcada;
gravity define como a distribuio de alinhamento do componente perante seu pai
(centralizado, topo, rodap).

A documentao completa pode ser encontrada em:

http://developer.android.com/guide/topics/ui/index.html


Android


81

4.3. Menus

Existem trs tipos de menus para aplicaes Android. O menu de opes aberto
ao utilizar o boto correspondente abertura do menu (geralmente boto fsico) e
referente ao menu principal da atividade em execuo. J o menu de contexto aberto
ao tocar e manter pressionado sobre um componente. O menu suspenso semelhante ao
menu de contexto, mas aberto automaticamente ao simples toque em um componente
que o executa (como visto no exemplo, utilizado pelo Spinner).

Para criar um menu de opes, podem ser feitas duas implementaes. A primeira,
a partir de um menu gerado em XML (armazenado em res/menu/) e amarrado
atividade a partir do comando inflate().

<?xml ver si on=" 1. 0" encodi ng=" ut f - 8" ?>
<menu xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d" >
<i t emandr oi d: i d=" @+i d/ new_game"
andr oi d: i con=" @dr awabl e/ i c_new_game"
andr oi d: t i t l e=" @st r i ng/ new_game" / >
<i t emandr oi d: i d=" @+i d/ hel p"
andr oi d: i con=" @dr awabl e/ i c_hel p"
andr oi d: t i t l e=" @st r i ng/ hel p" / >
</ menu>

@Over r i de
publ i c bool ean onCr eat eOpt i onsMenu( Menu menu) {
MenuI nf l at er i nf l at er = get MenuI nf l at er ( ) ;
i nf l at er . i nf l at e( R. menu. game_menu, menu) ;
r et ur n t r ue;
}

Observa-se a utilizao de trs elementos principais no item de menu declarado no
XML. O id utilizado para referenciar na Classe R (no cdigo na atividade
possvel observar a utilizao), icon referente imagem em res/drawable/ nas
diferentes qualidades de resoluo e title referente ao texto exibido.

Para mapear a seleo de um item, pode ser utilizado o seguinte cdigo, tambm
na atividade em execuo:





@Over r i de
Android


82
publ i c bool ean onOpt i onsI t emSel ect ed( MenuI t emi t em) {
/ / Handl e i t emsel ect i on
swi t ch ( i t em. get I t emI d( ) ) {
case R. i d. new_game:
newGame( ) ;
r et ur n t r ue;
case R. i d. hel p:
showHel p( ) ;
r et ur n t r ue;
def aul t :
r et ur n super . onOpt i onsI t emSel ect ed( i t em) ;
}
}

A outra forma de criar um menu de opes (principal) diretamente a partir da
atividade, sem a manuteno do arquivo XML, porm isso torna mais complicada a
referncia, comprometendo a referncia externa, caso necessrio.

@Over r i de
publ i c bool ean onCr eat eOpt i onsMenu( Menu menu) {
super . onCr eat eOpt i onsMenu( menu) ;

/ / Cr eat e and add new menu i t ems.
MenuI t emi t emAdd = menu. add( 0, ADD_NEW, Menu. NONE,
R. st r i ng. add_new) ;
MenuI t emi t emRem= menu. add( 0, REMOVE, Menu. NONE,
R. st r i ng. r emove) ;

/ / Assi gn i cons
i t emAdd. set I con( R. dr awabl e. add) ;
i t emRem. set I con( R. dr awabl e. r emove) ;

/ / Al l ocat e shor t cut s t o each of t hem.
i t emAdd. set Shor t cut ( ' 0' , ' a' ) ;
i t emRem. set Shor t cut ( ' 1' , ' r ' ) ;
r et ur n t r ue;
}

A criao de um menu de contexto realizada de forma semelhante, mudando
apenas as chamadas de mtodo;

@Over r i de
publ i c voi d onCr eat eCont ext Menu( Cont ext Menu menu, Vi ew v,
Cont ext MenuI nf o menuI nf o) {
super . onCr eat eCont ext Menu( menu, v, menuI nf o) ;
MenuI nf l at er i nf l at er = get MenuI nf l at er ( ) ;
i nf l at er . i nf l at e( R. menu. cont ext _menu, menu) ;
Android


83
}

@Over r i de
publ i c bool ean onCont ext I t emSel ect ed( MenuI t emi t em) {
Adapt er Cont ext MenuI nf o i nf o = ( Adapt er Cont ext MenuI nf o)
i t em. get MenuI nf o( ) ;
swi t ch ( i t em. get I t emI d( ) ) {
case R. i d. edi t :
edi t Not e( i nf o. i d) ;
r et ur n t r ue;
case R. i d. del et e:
del et eNot e( i nf o. i d) ;
r et ur n t r ue;
def aul t :
r et ur n super . onCont ext I t emSel ect ed( i t em) ;
}
}

Os menus de contexto no suportam cones ou teclas de atalho.

possvel, ainda, a criao de sub-menus. Para isso, pode-se criar tags
<menu/> recursivas no XML referente.

A documentao completa pode ser encontrada em:

http://developer.android.com/guide/topics/ui/menus.html
Android


84

4.4. Janelas de Dilogo

Janelas de dilogo so aquelas que permitem ao usurio tomar uma deciso
especfica ou apenas ser informado de alguma mensagem. No Android, assim com o em
Java para desktop, muito simples de criar estas interfaces. Atravs de uma Classe
construtora de dilogos, com mtodos prontos para receber a personalizao, torna-se
bastante rpido e intuitivo incluir um dilogo na aplicao.

Da mesma maneira como criado um listener de evento de clique, pode ser
criado para a janela de dilogo.

Di al ogI nt er f ace. OnCl i ckLi st ener di al ogCl i ckLi st ener = new
Di al ogI nt er f ace. OnCl i ckLi st ener ( ) {
@Over r i de
publ i c voi d onCl i ck( Di al ogI nt er f ace di al og, i nt whi ch) {
swi t ch ( whi ch) {
case Di al ogI nt er f ace. BUTTON_POSI TI VE:
/ / bot o SI M cl i cado
br eak;
case Di al ogI nt er f ace. BUTTON_NEGATI VE:
/ / bot o NO cl i cado
br eak;
}
}
};

Este o cdigo referente manipulao da deciso do usurio ao tocar em algum
dos botes. Depois, preciso inserir o cdigo de chamada de criao da janela de
dilogo, que pode ser inserido no evento de clique de algum elemento, por exemplo.

Al er t Di al og. Bui l der bui l der = new Al er t Di al og. Bui l der ( t hi s) ;
bui l der . set Message( " Conf i r ma oper ao?" ) . set Posi t i veBut t on( " Si m" ,
di al ogCl i ckLi st ener ) . set Negat i veBut t on( " No" ,
di al ogCl i ckLi st ener ) . show( ) ;

Android


85


Este modelo de janela de dilogo consiste em utiliza a interface padro da verso
do sistema Android (como outros componentes de layout funcionam). Pode-se analisar os
principais mtodos das Classes de dilogo para criao de uma caixa de dilogo
padro:


setIcon() mtodo onde definido um cone para a caixa de dilogo;
setMessage() mtodo onde definida a mensagem exibida na caixa de dilogo;
setTitle() mtodo onde definido o ttulo da caixa de dilogo;
setNeutralButton() definio de um boto neutro (normalmente rotulado com o
ttulo OK) e seu evento de ao;
setPositiveButton() - definio de um boto positivo (normalmente rotulado com o
ttulo Sim ouYes) e seu evento de ao;
setNegativeButton() - definio de um boto negativo (normalmente rotulado com
o ttulo No ouNo) e seu evento de ao.

Caso seja necessrio utilizar um layout especfico para uma janela de dilogo, o
mesmo pode ser criado na pasta res/layout/ e associado a um dilogo na atividade
especfica.

Di al og di al og = new Di al og( mai n. t hi s) ;
di al og. set Cont ent Vi ew( R. l ayout . meuDi al ogo) ;
di al og. set Ti t l e( " T t ul o da j anel a" ) ;
di al og. set Cancel abl e( t r ue) ; / / f or nece a opo de cancel ar a par t i r
de uma ao ( como umbot o)

di al og. show( ) ;

Android


86

4.5. Notificaes

Uma das vantagens do sistema operacional Android a qualidade da sua
multitarefa. Para melhor controle das tarefas, a interface contm uma barra de tarefas
(tambm chamada de barra de status), por padro situada na parte superior da tela.
Com um gesto de deslize com o dedo para baixo, possvel expandir esta barra e
visualizar os detalhes das aplicaes abertas. Os elementos na barra de status do
Android so chamados de notificaes e servem para, dentre outras coisas, alertar o
usurio sobre alguma pendncia em alguma aplicao, ou simplesmente avisar sobre
alguma novidade.

Utiliza-se notificao ao invs de janelas de dilogo quando uma aplicao,
rodando em segundo plano, deseja comunicar-se com o usurio sem interromper a
atividade dele no momento, dando a ele a liberdade de responder aplicao dona da
notificao no momento em que desejar.




O mtodo mais simples de criar uma notificao totalmente customizvel a partir
da criao de uma classe helper especfica, contendo variveis e constantes pr-
definidas (algumas mutveis) para auxiliar a criao da notificao sem a necessidade
de preocupao com os diversos parmetros utilizados, realizando assim o
encapsulamento.

publ i c cl ass Not i f i cacao {
Android


87

publ i c st at i c f i nal i nt TI PO_ACTI VI TY = 1;
publ i c st at i c f i nal i nt TI PO_BROADCAST = 2;
publ i c st at i c f i nal i nt TI PO_SERVI CE = 3;
publ i c st at i c f i nal St r i ng I NTENT_STRI NG_MSG_STATUS = " MSGs" ;
publ i c st at i c f i nal St r i ng I NTENT_STRI NG_MSG = " MSG" ;
publ i c st at i c f i nal St r i ng I NTENT_STRI NG_TI TULO = " t i t u" ;
publ i c st at i c f i nal St r i ng I NTENT_LONG_QUANDO = " WHEN" ;
publ i c st at i c f i nal St r i ng I NTENT_I NT_I CONE = " i cone" ;
publ i c st at i c f i nal St r i ng I NTENT_I NT_FLAGS = " FLS" ;

publ i c st at i c Not i f i cat i on cr i ar Not i f i cacao( Act i vi t y act i vi t y,
I nt ent par am, I nt ent acao, i nt t i po) {
/ / cr i a a not i f i cacao
Not i f i cat i on n = new
Not i f i cat i on( par am. get I nt Ext r a( I NTENT_I NT_I CONE, 0) ,
par am. get St r i ngExt r a( I NTENT_STRI NG_MSG_STATUS) ,
par am. get LongExt r a( I NTENT_LONG_QUANDO,
Syst em. cur r ent Ti meMi l l i s( ) ) ) ;

/ / Responsavel pel a acao caso o usuar i o sel eci one a
not i f i cacao;
Pendi ngI nt ent p;
i f ( t i po == TI PO_ACTI VI TY) {
p = Pendi ngI nt ent . get Act i vi t y( act i vi t y, 0, acao,
par am. get I nt Ext r a( I NTENT_I NT_FLAGS, 0) ) ;
} el se i f ( t i po == TI PO_BROADCAST) {
p = Pendi ngI nt ent . get Br oadcast ( act i vi t y, 0, acao,
par am. get I nt Ext r a( I NTENT_I NT_FLAGS, 0) ) ;
} el se i f ( t i po == TI PO_SERVI CE) {
p = Pendi ngI nt ent . get Ser vi ce( act i vi t y, 0, acao,
par am. get I nt Ext r a( I NTENT_I NT_FLAGS, 0) ) ;
} el se {
t hr ow new I l l egal Ar gument Except i on( " t i po i ndef i ni do" ) ;
}

/ / Vi ncul a o Pendi ngI nt ent coma not i f i cacao
n. set Lat est Event I nf o( act i vi t y,
par am. get St r i ngExt r a( I NTENT_STRI NG_TI TULO) ,
par am. get St r i ngExt r a( I NTENT_STRI NG_MSG) , p) ;

/ / Def i ne val or es def aul t par a a not i f i cacao ex. som, vi br a.
n. def aul t s = Not i f i cat i on. DEFAULT_ALL;

r et ur n n;
}

Android


88
publ i c st at i c Not i f i cat i onManager not i f i car ( Act i vi t y act i vi t y,
Not i f i cat i on not i f i cat i on, i nt i d) {
/ / pega ser vi o de not i f i cacao
Not i f i cat i onManager nm= ( Not i f i cat i onManager )
act i vi t y. get Syst emSer vi ce( Act i vi t y. NOTI FI CATI ON_SERVI CE) ;
/ / exi be a not i f i cacao
nm. not i f y( i d, not i f i cat i on) ;
r et ur n nm;
}
}

interessante analisar a utilizao do Objeto PendingIntent, que indica a
dependncia de uma chamada via Intent. Este objeto tem o poder de aguardar a
utilizao de um Intent a partir de uma atividade ou um servio, realizando
recebimentos e chamadas de parmetros.

Aps isso, basta na atividade ou servio desejado instanciar o helper e realizar
a chamada de notificao.

I nt ent i t = new I nt ent ( ) ;
i t . put Ext r a( Not i f i cacao. I NTENT_STRI NG_MSG, " Hel l oWor l d em
execuo! " ) ;
i t . put Ext r a( Not i f i cacao. I NTENT_STRI NG_MSG_STATUS, " Hel l oWor l d! " ) ;
i t . put Ext r a( Not i f i cacao. I NTENT_STRI NG_TI TULO, " Hel l oWor l d! " ) ;
i t . put Ext r a( Not i f i cacao. I NTENT_LONG_QUANDO,
Syst em. cur r ent Ti meMi l l i s( ) ) ;
i t . put Ext r a( Not i f i cacao. I NTENT_I NT_I CONE,
andr oi d. R. dr awabl e. i c_di al og_al er t ) ;

St r i ng ur l = " ht t p: / / www. uzzye. com" ;
I nt ent i = new I nt ent ( I nt ent . ACTI ON_VI EW) ;
i . set Dat a( Ur i . par se( ur l ) ) ;

Not i f i cat i on not f = Not i f i cacao. cr i ar Not i f i cacao( t hi s, i t , i ,
Not i f i cacao. TI PO_ACTI VI TY) ;
Not i f i cacao. not i f i car ( t hi s, not f , 550) ;

Analisando o cdigo, pode-se observar a passagem de parmetros para o
Intent, como a mensagem para a barra de status, o ttulo da notificao, quando a
notificao deve ser executada, o cone (utilizado o padro de alerta), alm da
configurao de ao utilizada ao tocar na notificao.


Android


89


Para cancelar a exibio, pode ser utilizado o mtodo cancel() da notificao.

Outro mtodo de notificao de usurio muito comum em Android atravs do
componente Toast. Toast um facilitador de mensagens rpidas, contendo somente
texto, com exibio e ocultamento automticos, sem interferncia do usurio. O cdigo
bastante simples e de fcil implementao.

Cont ext cont ext = get Appl i cat i onCont ext ( ) ;
Char Sequence t ext = " Hel l o t oast ! " ;
i nt dur at i on = Toast . LENGTH_SHORT;

Toast t oast = Toast . makeText ( cont ext , t ext , dur at i on) ;
t oast . show( ) ;

t oast . set Gr avi t y( Gr avi t y. TOP| Gr avi t y. LEFT, 0, 0) ; / / par a posi ci onar

possvel, ainda, montar um Toast personalizado, com um layout pr-definido a
partir de cdigo XML e da utilizao do componente de layout LayoutInflater.

Layout I nf l at er i nf l at er = get Layout I nf l at er ( ) ;
Vi ew l ayout = i nf l at er . i nf l at e( R. l ayout . t oast _l ayout ,
( Vi ewGr oup)
f i ndVi ewByI d( R. i d. t oast _l ayout _r oot ) ) ;

I mageVi ew i mage = ( I mageVi ew) l ayout . f i ndVi ewByI d( R. i d. i mage) ;
Android


90
i mage. set I mageResour ce( R. dr awabl e. andr oi d) ;
Text Vi ew t ext = ( Text Vi ew) l ayout . f i ndVi ewByI d( R. i d. t ext ) ;
t ext . set Text ( " Est e umToast per sonal i zado! " ) ;

Toast t oast = new Toast ( get Appl i cat i onCont ext ( ) ) ;
t oast . set Gr avi t y( Gr avi t y. CENTER_VERTI CAL, 0, 0) ;
t oast . set Dur at i on( Toast . LENGTH_LONG) ;
t oast . set Vi ew( l ayout ) ;
t oast . show( ) ;

t oast . show( ) ;

A documentao completa do Toast pode ser encontrada em:

http://developer.android.com/guide/topics/ui/notifiers/toasts.html
Android


91

4.6. Drag and Drop

O sistema operacional Android possui uma interface muito responsiva a toques,
capaz de realizar operaes de arrastar e soltar e at de mltiplos toques (mais de um
dedo), a fim de melhorar a experincia de usurio em aplicaes mais robustas. Como
exemplo, a galeria de fotos padro do Android, em verso acima de 2.1, suporta o
comando de pina com dois dedos para aproximar ou afastar a imagem (zoom) e o
navegador de Internet possui a navegao pela janela a partir de arrastar e soltar.
Obviamente, o hardware deve ter suporte em tela a mltiplos toques para executar a
pina e ser sensitivo a toque para executar o mesmo.

A verso de biblioteca de arrastar e soltar para desenvolvedores Android foi
disponibilizada apenas em 2011, o que gerou suporte apenas para verses superiores
2.1 do Android, no podendo ser utilizado em dispositivos com o sistema operacional em
verso mais antiga.

A utilizao deste framework um tanto quanto complicada, pois requer muito estudo
de posicionamento e das diversas situaes do toque, desde o iniciado at o finalizado.
possvel realizar um simples movimento de arrastar e soltar componentes em tela e at
criar containers como reas de recepo de elementos arrastados, podendo assim criar,
por exemplo, listas personalizadas a partir destes elementos.

A referncia completa pode ser encontrada em:

http://developer.android.com/guide/topics/ui/drag-drop.html

Como exemplo prtico, pode ser criado um simples Drag and Drop pela tela. Para
isso, cria-se um container no layout e uma View para ser arrastada.

<Li near Layout
xml ns: andr oi d=" ht t p: / / schemas. andr oi d. com/ apk/ r es/ andr oi d"
andr oi d: i d=" @+i d/ l i near Layout 1"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" f i l l _par ent " >

<I mageVi ew
andr oi d: i d=" @+i d/ i mageVi ew1"
andr oi d: l ayout _wi dt h=" wr ap_cont ent "
andr oi d: l ayout _hei ght =" 90dp"
andr oi d: sr c=" @andr oi d: dr awabl e/ di al og_hol o_l i ght _f r ame"
/ >

Android


92
</ Li near Layout >

Aps isso, necessrio criar um controlador de arrastar e soltar, derivando do
ViewGroup especfico utilizado como container e contendo o mtodo
onInterceptTouchEvent().

publ i c cl ass TouchI nt er cept or ext ends Li near Layout {

publ i c TouchI nt er cept or ( Cont ext cont ext , At t r i but eSet at t r s) {
super ( cont ext , at t r s) ;
}

@Over r i de
publ i c bool ean onI nt er cept TouchEvent ( Mot i onEvent ev) {
r et ur n super . onI nt er cept TouchEvent ( ev) ;
}
}

Na atividade a ser utilizado o arrastar e soltar necessrio referenciar ao
controlador criado, o que pode ser feito diretamente no onCreate().

Vi ewGr oup cont ai ner = ( Vi ewGr oup) f i ndVi ewByI d( R. i d. l i near Layout 1) ;
cont ai ner . set OnTouchLi st ener ( new Vi ew. OnTouchLi st ener ( ) {

@Over r i de
publ i c bool ean onTouch( Vi ew v, Mot i onEvent event ) {
swi t ch( event . get Act i onMasked( ) )
{
case Mot i onEvent . ACTI ON_MOVE:
i nt x = ( i nt ) event . get X( ) - of f set _x;
i nt y = ( i nt ) event . get Y( ) - of f set _y;

i nt w =
get Wi ndowManager ( ) . get Def aul t Di spl ay( ) . get Wi dt h( ) - 100;
i nt h =
get Wi ndowManager ( ) . get Def aul t Di spl ay( ) . get Hei ght ( ) - 100;
i f ( x > w)
x = w;
i f ( y > h)
y = h;

Li near Layout . Layout Par ams l p = new
Li near Layout . Layout Par ams(
new Vi ewGr oup. Mar gi nLayout Par ams(
Li near Layout . Layout Par ams. WRAP_CONTENT,
Li near Layout . Layout Par ams. WRAP_CONTENT)
) ;
Android


93

l p. set Mar gi ns( x, y, 0, 0) ;
sel ect ed_i t em. set Layout Par ams( l p) ;
br eak;

def aul t :
br eak;
}
r et ur n t r ue;
}
}) ;

I mageVi ew i mg = ( I mageVi ew) f i ndVi ewByI d( R. i d. i mageVi ew1) ;
i mg. set OnTouchLi st ener ( new Vi ew. OnTouchLi st ener ( ) {

@Over r i de

publ i c bool ean onTouch( Vi ew v, Mot i onEvent event ) {
swi t ch( event . get Act i onMasked( ) )
{
case Mot i onEvent . ACTI ON_DOWN:
of f set _x = ( i nt ) event . get X( ) ;
of f set _y = ( i nt ) event . get Y( ) ;
sel ect ed_i t em= v;
br eak;

def aul t :
br eak;
}
/ / r et or na f al so par a evi t ar i ndesej ados Mot i onEvent s
/ / e dar ao pai a chance de ut i l i zar Mot i onEvent
r et ur n f al se;
}
}) ;

A partir deste cdigo, podem ser utilizados outros mtodos de toque, medio de
coordenadas, alm de definir outros containers, definir sobreposio e gerar
componentes melhores de UX (User Experience), como listas em duas colunas com
atribuio por arrastar e soltar.

Android


94

4.7. Recursos

Em todos os elementos de layout utilizados at agora, no back-end possvel realizar
acesso direto atravs da classe de referncias R.class. Esta classe chamada de
Resource, pois referencia todos os elementos XML utilizados na aplicao. Estes
elementos so armazenados dentro do diretrio res/.



Aps o salvamento de um arquivo XML ou compilao do projeto, a Classe R
gerada novamente, realizando as mudanas necessrias nas referncias. Caso um
elemento adicionado em um XML no conste nesta Classe, pode ser necessrio realizar o
Clean e o rebuild do projeto.

publ i c f i nal cl ass R {
publ i c st at i c f i nal cl ass at t r {
}
publ i c st at i c f i nal cl ass dr awabl e {
publ i c st at i c f i nal i nt i c_l auncher =0x7f 020000;
}
publ i c st at i c f i nal cl ass i d {
publ i c st at i c f i nal i nt i mageVi ew1=0x7f 050001;
publ i c st at i c f i nal i nt l i near Layout 1=0x7f 050000;
}
publ i c st at i c f i nal cl ass l ayout {
publ i c st at i c f i nal i nt mai n=0x7f 030000;
}
publ i c st at i c f i nal cl ass st r i ng {
publ i c st at i c f i nal i nt app_name=0x7f 040001;
publ i c st at i c f i nal i nt hel l o=0x7f 040000;
}
}

A Classe de recursos composta de subclasses, algumas das quais so referentes s
pastas internas do diretrio res/.
Android


95
drawable responsvel pelos elementos da pasta drawable. detectada
automaticamente a qualidade de resoluo do dispositivo (ou forado atravs de cdigo).
Dessa forma, a referncia tambm realizada automaticamente, atravs da chamada
drawable, sem especificao de qual subpasta utilizar;

layout define as referncias diretas aos arquivos XML dentro da pasta layout;

string define as referncias aos elementos declarados nos arquivos XML contidos
na pasta values;

id define as referncias diretas a todos os componentes visuais declarados nos
arquivos XML de layout. Referncia esta definida atravs do valor da propriedade id
do componente. Ex.: @+id/button1, criar a referncia button1.

Para utilizar as referncias, de qualquer Classe pode ser realizada a chamada
R.subclasse.referncia, como por exemplo R.layout.main.


Android


96

5. Conceitos Avanados

Aps o aprendizado sobre o desenvolvimento bsico em Android, pode-se
aprofundar nos conhecimentos mais avanados.

Dentre as principais execues que podem ser realizadas em Android, dependendo
do dispositivo anfitrio da verso do sistema, deve ser considerado o uso do
acelermetro e do giroscpio (sistemas de controle de posicionamento e angulao do
dispositivo), o suporte a GPS (Global Positioning System), o suporte nativo a banco de
dados SQL (Structured Query Language), no caso o SQLite, etc.

Nos itens a seguir, o detalhamento destes principais recursos.


Android


97

5.1. Permisses e Segurana

Ao realizar um download de aplicativo no Google Play, solicitada a confirmao
de segurana, que consiste em descrever para serem aceitos todos os recursos exigidos
pelo app.

No decorrer desta apostila, foram analisados vrios recursos, incluindo de
integrao com outros apps, coletas de dados, utilizao de recursos do prprio
dispositivo onde o sistema est embarcado e armazenamento. Para cada recurso
estranho ao app utilizado necessrio realizar um registro de permisso, caso
contrrio o sistema poder parar inesperadamente e no conseguir finalizar sua
execuo corretamente.

Este registro de solicitao de permisso feito no manifesto e pode ser alterado a
qualquer momento, porm novas alteraes implicam em novas aceitaes de solicitao
de permisso ao usurio baixar o aplicativo no Play.



No exemplo acima, o app requer que sejam acessadas informaes de contato, que
tenha acesso Internet completo, que possa gerenciar contedo no carto de memria
SD, que possa modificar o estado do telefone (como com rede, sem rede e ocupado), e
escrever um novo nome de Access Point.

importante entender que, ao usurio aceitar as permisses de acesso de um app
ao realizar o download, ele est automaticamente isentando a Google de qualquer culpa
em problemas gerados por ele. Por exemplo, se um aplicativo realiza ligaes telefnicas
em segundo plano e o usurio aceitou essas permisses (contanto que estivessem
Android


98
explcitas como na imagem acima), a Google no tem responsabilidade sobre os custos
gerados por essas ligaes. Exatamente por isso existe este sistema de controle de
permisso e segurana. Para monitorar melhor o que os apps fazem em um dispositivo,
pode ser interessante utilizar antivrus, disponveis inclusive no Play.

Para definir uma solicitao de permisso de um aplicativo, basta incluir o
seguinte cdigo no Manifesto (diferentemente das outras declaraes, como de
atividades ou intenes, as de permisses e funcionalidades devem ser feitas fora da tag
<application/>, mas ainda dentro da <manifest/>).

<uses- per mi ssi on andr oi d: name=" andr oi d. per mi ssi on. CAMERA" / >
<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on. WRI TE_EXTERNAL_STORAGE" / >
<uses- per mi ssi on andr oi d: name=" andr oi d. per mi ssi on. I NTERNET" / >
<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on. ACCESS_NETWORK_STATE" / >
<uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. camer a. aut of ocus"
andr oi d: r equi r ed=" f al se" / >



A diferena entre declarao de permisso (permission) e de funcionalidade
(feature) que estas tendem a ser mais especficas e no comprometem a segurana do
usurio, sendo geralmente algum recurso interno de algum item do dispositivo (como o
autofoco da cmera).

Ao definir uma permisso simples, como no exemplo acima, a descrio e o nvel
de segurana utilizados so os padres. Para customizar, possvel utilizar atributos
especficos das tags.

android:label define o ttulo da solicitao.
android:description define o texto de contedo da solicitao.
android:permissionGroup define o grupo que a solicitao pretence. Exemplo:
"android.permission-group.COST_MONEY";
android:protectionLevel define o nvel de proteo da permisso.
Exemplo:"dangerous" .




interessante lembrar que, para utilizao de atributos customizados, podem ser
utilizadas constantes definidas no diretrio de recursos values, utilizando a chamada
@string/nomeDaConstante.

Android


99
A lista completa de permisses pr-definidas, grupos e nveis de proteo para
serem utilizados no manifesto, pode ser encontrada em:

http://developer.android.com/guide/topics/security/security.html


Android


100

5.2. Preferncias de Usurio

Em um website que requer autenticao, como um portal ou uma rea restrita,
geralmente existe uma opo para mantermos o ltimo usurio e at mesmo a senha de
login. Muitas vezes, o prprio navegador web realiza isso. Geralmente, esse
armazenamento de preferncia realizado com um recurso chamado Cookie, presente
em todos os navegadores modernos e de grande utilidade para rpida navegao.

Em Android, tambm existem objetos capazes de realizar o armazenamento e a
recuperao das preferncias de usurios, como o SharedPreferences.

De forma bem simples para codificao, semelhante ao uso de Cookies na web,
um gerenciamento de preferncias pode ser programado da seguinte forma. Como
atributo da atividade, necessrio criar um objeto de preferncias compartilhadas.

pr i vat e Shar edPr ef er ences shar edPr ef er ences;

Em seguida, pode ser implementado um mtodo para armazenamento das
preferncias com o seguinte cdigo.

shar edPr ef er ences = get Shar edPr ef er ences( PREFS_PRI VATE,
Cont ext . MODE_PRI VATE) ;

Edi t or pr ef sPr i vat eEdi t or = shar edPr ef er ences. edi t ( ) ;

pr ef sPr i vat eEdi t or . put St r i ng( " nome" , J oo) ;
pr ef sPr i vat eEdi t or . put St r i ng( " emai l " , j oao@meuemai l . com. br ) ;
pr ef sPr i vat eEdi t or . put St r i ng( " apel i do" , J o) ;

pr ef sPr i vat eEdi t or . commi t ( ) ;

Por fim, para realizar a recuperao das preferncias, pode-se implementar um
mtodo com o seguinte cdigo.

shar edPr ef er ences = get Shar edPr ef er ences( PREFS_PRI VATE,
Cont ext . MODE_PRI VATE) ;

St r i ng nome = shar edPr ef er ences. get St r i ng( " nome" , " " ) ;
St r i ng emai l = shar edPr ef er ences. get St r i ng( " emai l " , " " ) ;
St r i ng apel i do = shar edPr ef er ences. get St r i ng( " apel i do" , " " ) ;

shar edPr ef er ences = nul l ; / / ut i l i zado soment e emcaso de necessi dade
de l i mpar as pr ef er nci as sal vas
Android


101

interessante observar a utilizao do parmetro PREFS_PRIVATE, que
define uma string de referncia ao arquivo utilizado para armazenamento das
preferncias, e o Context.MODE_PRIVATE, que define que somente a aplicao atual
pode ter acesso s preferncias. Para permitir o acesso a partir de outras aplicaes,
pode-se usar MODE_WORLD_READABLE, que permite apenas leitura, ou
MODE_WORLD_WRITEABLE, que permite apenas escrita, alm de estas poderem
ser concatenadas com o operador de String, +.

Outro ponto a observar a utilizao de getString e putString para controle
dos parmetros. Pode ser utilizado qualquer tipo primitivo, alm do objeto String, como
putInt, ou getBoolean.
Android


102

5.3. Persistncia em Banco de Dados (SQLite)

O gerenciamento de preferncias de usurio muito til em caso de controle
rpido e simples, porm, em aplicaes maiores faz-se necessrio o uso de uma
arquitetura de dados mais completa. Para isso, Android conta com um excelente banco
de dados exclusivo para plataformas mveis e embarcadas.

Baseado na linguagem estruturada SQL, comum em bancos de dados como
MySQL e Oracle, o SQLite uma plataforma com recursos resumidos, mas segura e
capaz de executar praticamente qualquer necessidade de persistncia que uma aplicao
complexa pode ter. Uma aplicao que requer uso de banco de dados no necessita de
solicitao de permisses explcita, uma vez que SQLite um recurso integrado e seguro
por si s. Ao criar um banco de dados a partir de um app, o seguinte caminho fsico
criado no sistema de arquivos do Android.

DATA/data/APP_NAME/databases/FILENAME

A maneira mais fcil e robusta de construir uma aplicao com SQLite integrado
utilizando um helper para conexo de dados, semelhante ao que feito em aplicaes
Java com JDBC.

publ i c cl ass Dat aBaseHel per ext ends SQLi t eOpenHel per {

pr i vat e st at i c f i nal St r i ng DBNAME = " meuDB" ;
pr i vat e Dat aBaseHel per myDBHel per ;
pr i vat e SQLi t eDat abase myDB;

pr i vat e f i nal Cont ext myCont ext ;

publ i c Dat aBaseHel per ( Cont ext cont ext ) {
super ( cont ext , DBNAME, nul l , 2) ;
t hi s. myCont ext = cont ext ;
}

@Over r i de
publ i c voi d onCr eat e( SQLi t eDat abase db) {
}

@Over r i de
publ i c voi d onUpgr ade( SQLi t eDat abase db, i nt ol dVer si on, i nt
newVer si on) {
}

publ i c Dat aBaseHel per open( ) t hr ows SQLExcept i on {
Android


103
myDBHel per = new Dat aBaseHel per ( myCont ext ) ;
myDB = myDBHel per . get Wr i t abl eDat abase( ) ;
r et ur n t hi s;
}

publ i c voi d cl ose( ) t hr ows SQLExcept i on {
t hi s. myDB. cl ose( ) ;
}

publ i c SQLi t eDat abase get DB( )
{
r et ur n t hi s. myDB;
}
}

A partir desta Classe auxiliar, pode-se realizar uma chamada simples de instncia
execuo de comandos para o SQLite.

Dat aBaseHel per dbHel per = new Dat aBaseHel per ( t hi s) ;
dbHel per . open( ) ;
SQLi t eDat abase dbCon = dbHel per . get DB( ) ;

i nt i d = 999;
Cur sor cur sor = dbCon. r awQuer y( " SELECT * FROM nomeTabel a WHERE ( i d =
?) " , new St r i ng[ ] {St r i ng. val ueOf ( i d) }) ;
st ar t Managi ngCur sor ( cur sor ) ;
i f ( cur sor . get Count ( ) >0)
{
cur sor . moveToFi r st ( ) ;
St r i ng val or Col una =
cur sor . get St r i ng( cur sor . get Col umnI ndex( " nomeCol una" ) ) ;
}

Neste exemplo, realizado um comando SELECT para recuperao de dados
de uma entidade (tabela), a partir da comparao de uma coluna especfica (no caso a
id). A passagem de parmetros SQL em Java pode ser feita atravs de uma lista de
String ordenada conforme a apario das solicitaes (?). Para trabalhar com
recuperao de dados SQL em Android/Java utilizado o conceito de cursores, onde o
cursor posicionado em linhas dentro da tabela de retorno de resultado e pode ser
posicionado livremente, avanando ou recuando.




J para insero de dados, por exemplo, pode ser utilizado o seguinte cdigo:

Android


104
Dat aBaseHel per dbHel per = new Dat aBaseHel per ( v. get Cont ext ( ) ) ;
dbHel per . open( ) ;
SQLi t eDat abase dbCon = dbHel per . get DB( ) ;
St r i ng sql Cmd = " I NSERT I NTO nomeTabel a ( col una1, col una2) VALUES
( ?, dat et i me( ' now' ) ) " ;
dbCon. execSQL( sql Cmd, new St r i ng[ ] { J oo }) ;

importante sempre depois de utilizar uma conexo com o banco de dados fech-
la, o que pode ser realizado com o comando dbHelper.close();.

Como em outras plataformas de desenvolvimento SQL, tambm possvel realizar
a manuteno do banco de dados visualmente, atravs da visualizao de uma tabela,
com linhas e colunas representando a estrutura e os registros de uma entidade no banco
de dados (http://www.softsland.com/sqlite_expert_personal.html), atravs de linha de
cdigo em Shell com o ADB (Android Debug Bridge,
http://developer.android.com/guide/developing/tools/adb.html), ou at mesmo atravs de
um aplicativo instalado diretamente no dispositivo
(https://play.google.com/store/apps/details?id=com.speedsoftware.sqleditor&hl=pt_BR).

A documentao completa do SQLite em Android pode ser encontrada em:

http://developer.android.com/reference/android/database/sqlite/package-
summary.html

A documentao completa dos comandos SQL pode ser encontrada em:

http://www.sqlite.org/lang.html


Android


105

5.4. Cmera e Arquivos

Algumas vezes, dependendo do estilo de aplicativo que se est desenvolvendo,
pode ser necessria (ou apenas um recurso interessante) a incorporao de uma cmera
ao cdigo. A melhor maneira de fazer isso atravs da chamada de inteno.

I nt ent i nt ent = new I nt ent ( Medi aSt or e. ACTI ON_I MAGE_CAPTURE) ;
st ar t Act i vi t yFor Resul t ( i nt ent , TI RAR_FOTO) ;

Onde a constante TIRAR_FOTO apenas um nmero inteiro identificador de
requisio. Ela usada para identificar o resultado da ao aps a execuo da cmera.

@Over r i de
pr ot ect ed voi d onAct i vi t yResul t ( i nt r equest Code, i nt r esul t Code,
I nt ent dat a) {
i f ( r equest Code == TI RAR_FOTO) {
i f ( r esul t Code == RESULT_OK) {
Bi t map bi t map = ( Bi t map) dat a. get Ext r as( ) . get ( " dat a" ) ;
} el se i f ( r esul t Code == RESULT_CANCELED) {
} el se {
}
}
}

Com o cdigo acima, podemos identificar a difinio de ao aps executar um
resultado especfico, como o TIRAR_FOTO, constante definida anteriormente. A
partir disso, possvel verificar se a atividade foi concluda corretamente, cancelada ou
simplesmente finalizada.

Depois de termos um Objeto do tipo Bitmap criado a partir da cmera, pode-se
realizar o salvamento do arquivo em disco.

St r i ng ext er nal St or agePat h =
Envi r onment . get Ext er nal St or ageDi r ect or y( ) . get Absol ut ePat h( ) +" / downl oa
d" ;
Fi l e sdI mageMai nDi r ect or y = new Fi l e( ext er nal St or agePat h) ;
Fi l eOut put St r eamf i l eOut put St r eam= nul l ;
St r i ng nameFi l e;
t r y {
f i l eOut put St r eam= new Fi l eOut put St r eam(
sdI mageMai nDi r ect or y. t oSt r i ng( ) +" / i mage. j pg" ) ;
Buf f er edOut put St r eambos = new Buf f er edOut put St r eam(
f i l eOut put St r eam) ;
bi t map. compr ess( Compr essFor mat . J PEG, qual i t y, bos) ;
Android


106

bos. f l ush( ) ;
bos. cl ose( ) ;
} cat ch ( Fi l eNot FoundExcept i on e) {
/ / TODO Aut o- gener at ed cat ch bl ock
e. pr i nt St ackTr ace( ) ;
}


Basicamente, so utilizadas constantes pr-definidas para manuteno de arquivos
a partir de Stream. Aps isso, importante referenciar no manifesto a utilizao tanto
da cmera quanto do gerenciamento de arquivos.

<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on. WRI TE_EXTERNAL_STORAGE" / >
<uses- per mi ssi on andr oi d: name=" andr oi d. per mi ssi on. CAMERA" / >
<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on.

I NTERNET" / >

Um exemplo de cdigo interessante o de upload de uma imagem tirada da
cmera para a web.

St r i ng ser ver Ur l = " ht t p: / / www. uzzye. com/ andr oi d/ " ;
St r i ng ur l St r i ng = ser ver Ur l + " andr oi d_f i l e_upl oad. php" ;

t r y {
I nput St r eam
f i s=t hi s. get Cont ent Resol ver ( ) . openI nput St r eam( ext er nal St or agePat h +
/ i mage. j pg) ;
Ht t pFi l eUpl oader ht f u = new Ht t pFi l eUpl oader ( ur l St r i ng, " " ,
SELECTED_I MAGE. t oSt r i ng( ) , i mageName) ;
ht f u. doSt ar t ( f i s) ;
} cat ch ( Fi l eNot FoundExcept i on e) {
/ / TODO Aut o- gener at ed cat ch bl ock
e. pr i nt St ackTr ace( ) ;
}

Para realizar postagem de contedo em formato de texto para uma pgina web
(atravs de mtodos POST/GET), utiliza-se os componentes HttpClient e HttpPost.

Ht t pCl i ent ht t pcl i ent = new Def aul t Ht t pCl i ent ( ) ;
Ht t pPost ht t ppost = new Ht t pPost ( ser ver Ur l + " andr oi d_post . php" ) ;

t r y {
Li st <Basi cNameVal uePai r > nameVal uePai r s = new
Ar r ayLi st <Basi cNameVal uePai r >( 2) ;
nameVal uePai r s. add( new Basi cNameVal uePai r ( " i d" , 0) ) ;
Android


107
ht t ppost . set Ent i t y( new Ur l EncodedFor mEnt i t y( nameVal uePai r s) ) ;

/ / Execut e HTTP Post Request
Ht t pResponse r esponse = ht t pcl i ent . execut e( ht t ppost ) ;
} cat ch ( Cl i ent Pr ot ocol Except i on e) {
/ / TODO Aut o- gener at ed cat ch bl ock
} cat ch ( I OExcept i on e) {
/ / TODO Aut o- gener at ed cat ch bl ock
}


Android


108

5.5. GPS e Mapas

Dentre as API disponibilizadas pela Google juntamente ao SDK, existe uma muito
comum, a do Google Maps. possvel combinar a utilizao dos mapas com o sistema
de posicionamento global (GPS), a fim de aprimorar a experincia de usurio e fornecer
localidades prximas, ou o posicionamento exato de algum objeto. Um exemplo de
utilizao comum , alm do prprio aplicativo Google Maps, aplicativos de marcao
de presena (checkin), como o Foursquare. Mesmo assim, os componentes para
utilizao de GPS so independentes e podem ser utilizados sem a combinao com
mapas.

A utilizao do GPS requer a seguinte definio de uma solicitao de permisso.

<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on. ACCESS_FI NE_LOCATI ON" / >

Para monitorar a mudana de localizao a partir de comandos de GPS,
necessrio utilizar o componente LocationManager.

publ i c cl ass GPS ext ends Act i vi t y
{
pr i vat e Locat i onManager l m;
pr i vat e Locat i onLi st ener l ocat i onLi st ener ;

/ ** Cal l ed when t he act i vi t y i s f i r st cr eat ed. */
@Over r i de
publ i c voi d onCr eat e( Bundl e savedI nst anceSt at e) {
super . onCr eat e( savedI nst anceSt at e) ;
set Cont ent Vi ew( R. l ayout . mai n) ;

/ / - - - use t he Locat i onManager cl ass t o obt ai n GPS l ocat i ons- - -
l m= ( Locat i onManager )
get Syst emSer vi ce( Cont ext . LOCATI ON_SERVI CE) ;

l ocat i onLi st ener = new MyLocat i onLi st ener ( ) ;

l m. r equest Locat i onUpdat es(
Locat i onManager . GPS_PROVI DER,
0,
0,
l ocat i onLi st ener ) ;
}
}
Android


109
Atravs da solicitao do mtodo requestLocationUpdates() criado um
listener responsvel por pegar todas as informaes de mudana de posio
geogrfica. Pode-se notar o uso do provedor padro de posicionamento, interno do
prprio dispositivo, podendo ser configurado um GPS externo, caso necessrio. Aps,
necessrio realizar a implementao da Classe listener utilizada.

pr i vat e cl ass MyLocat i onLi st ener i mpl ement s Locat i onLi st ener
{
@Over r i de
publ i c voi d onLocat i onChanged( Locat i on l oc) {
i f ( l oc ! = nul l ) {
Toast . makeText ( get BaseCont ext ( ) ,
" Locat i on changed : Lat : " + l oc. get Lat i t ude( ) +
" Lng: " + l oc. get Longi t ude( ) ,
Toast . LENGTH_SHORT) . show( ) ;

/ / aqui pode ser i nser i do umcdi go de Maps
}
}

@Over r i de
publ i c voi d onPr ovi der Di sabl ed( St r i ng pr ovi der ) {
/ / TODO Aut o- gener at ed met hod st ub
}

@Over r i de
publ i c voi d onPr ovi der Enabl ed( St r i ng pr ovi der ) {
/ / TODO Aut o- gener at ed met hod st ub
}

@Over r i de
publ i c voi d onSt at usChanged( St r i ng pr ovi der , i nt st at us,
Bundl e ext r as) {
/ / TODO Aut o- gener at ed met hod st ub
}
}

J para a utilizao do Maps como recurso no Android requerida a seguinte
definio de uma solicitao de permisso no manifesto.

<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on.

I NTERNET" / >

Ainda no manifesto, dentro da tag <application/>, necessrio especificar o
uso da biblioteca de mapas da API.

Android


110
<uses- l i br ar y andr oi d: name=" com. googl e. andr oi d. maps" / >

No arquivo de layout da atividade, necessrio utilizar um componente de
visualizao de mapas (MapView).

<com. googl e. andr oi d. maps. MapVi ew
andr oi d: i d=" @+i d/ mapvi ew1"
andr oi d: l ayout _wi dt h=" f i l l _par ent "
andr oi d: l ayout _hei ght =" f i l l _par ent "
andr oi d: enabl ed=" t r ue"
andr oi d: cl i ckabl e=" t r ue"
andr oi d: api Key=" api sampl es" / >

possvel, no perfil de usurio desenvolvedor da Google, registrar uma chave de
API para utilizao do Maps e anlise de dados utilizada pela aplicao. Essa chave
de API pode ser utilizada na propriedade apiKey do componente de layout.

No cdigo da Classe de atividade, possvel utilizar o controlador de mapa do
componente visual e trabalhar com as propriedades dele.

MapVi ew mapVi ew = ( MapVi ew) f i ndVi ewByI d( R. i d. mapvi ew1) ;
MapCont r ol l er mc = mapVi ew. get Cont r ol l er ( ) ;

Integrando o Maps com o cdigo anterior referente utilizao de GPS,
possvel realizar a movimentao do mapa a partir do posicionamento geogrfico do
usurio.

GeoPoi nt p = new GeoPoi nt (
( i nt ) ( l oc. get Lat i t ude( ) * 1E6) ,
( i nt ) ( l oc. get Longi t ude( ) * 1E6) ) ;
mc. ani mat eTo( p) ;
mc. set Zoom( 16) ;
mapVi ew. i nval i dat e( ) ;

Para simular a troca de posicionament possvel, na guia DDMS do Eclipse,
aba Emulator Controls -> Location Controls, modificar atributos de localizao em
tempo de execuo e envi-los ao emulador. O mesmo no vlido para depurao em
dispositivos reais.



Android


111

5.6. Bluetooth

Em algumas aplicaes, pode ser necessria a transmio de dados entre
dispositivos, seja uma transferncia de arquivo ou apenas texto. Isto pode ser realizado
ativando o recurso de Bluetooth do Android, que tambm conta com uma biblioteca de
Classes especficas para este tipo de transferncias.

A utilizao do bluetooth como recurso no Android requer a seguinte definio de
uma solicitao de permisso no manifesto.

<uses- per mi ssi on
andr oi d: name=" andr oi d. per mi ssi on.

BLUETOOTH" / >

O primeiro passo para a utilizao do bluetooth verificar que o dispositivo
possui o suporte necessrio e se o recurso est ativado.

Bl uet oot hAdapt er mBl uet oot hAdapt er =
Bl uet oot hAdapt er . get Def aul t Adapt er ( ) ;
i f ( mBl uet oot hAdapt er == nul l ) {
/ / Devi ce does not suppor t Bl uet oot h
} el se {
i f ( ! mBl uet oot hAdapt er . i sEnabl ed( ) ) {
I nt ent enabl eBt I nt ent = new
I nt ent ( Bl uet oot hAdapt er . ACTI ON_REQUEST_ENABLE) ;
st ar t Act i vi t yFor Resul t ( enabl eBt I nt ent , REQUEST_ENABLE_BT) ;
}
}

Com o bluetooth do dispositivo ativo, necessrio verificar o pareamento, que
consiste em um dispositivo servidor da conexo receber e permitir a entrada de outro
dispositivo nela.

Set <Bl uet oot hDevi ce> devi ces = adapt er . get BondedDevi ces( ) ;
/ / Ser vi dor Bl uet oot h
Bl uet oot hDevi ce ser ver = nul l ;
St r i ng ser ver name = " NomeDoSer vi dor " ;
/ / Pesqui sa o Ser vi dor Par eado
f or ( Bl uet oot hDevi ce devi ce : devi ces) { / / Lao de Busca
i f ( ser ver name. equal s( devi ce. get Name( ) ) ) { / / Nomes I dnt i cos?
ser ver = devi ce; / / Di sposi t i vo Encont r ado e Sel eci onado
}
}

i f ( ser ver == nul l ) {
Android


112
/ / Mensagemde Er r o ao Usur i o
al er t ( " Ser vi dor no Par eado" ) ;
f i ni sh( ) ;
}

No exemplo acima, a procura foi pelo nome do servidor bluetooth, que pode no
ser nico. Por isso, o ideal realizar a busca pelo endereo MAC do dispositivo do
servidor. Com o servidor pareado, necessrio realizar o cdigo de comunicao
bluetooth dentro de uma Thread, pois este tipo de conexo bloquevel e depende de
respostas do servidor. Para acessar o dispositivo atravs da Thread, necessrio
definir uma varivel como final, recebendo o dispositivo pareado.

f i nal Bl uet oot hDevi ce comput er = ser ver ;

Thr ead connect or = new Thr ead( ) {
publ i c voi d r un( ) {
/ / I dent i f i cador ni co do Ser vi dor
UUI D i dent = UUI D. f r omSt r i ng( " 879c3537- ae66- 4013- a677-
9b7e5339d13c" ) ;
t r y {
/ / Socket de Conexo
Bl uet oot hSocket s =
/ / Conexo a Par t i r do I dent i f i cador ni co
comput er . cr eat eRf commSocket ToSer vi ceRecor d( i dent ) ;
} cat ch ( I OExcept i on e) { / / Er r o de Ent r ada e Sa da de Dados
/ / Mensagemde Er r o ao Usur i o
al er t ( " Er r o de Conexo" ) ;
f i ni sh( ) ;
}

/ / Conect ar ao Ser vi dor
s. connect ( ) ; / / Execuo Bl oqueant e
/ / Fl uxos de Ent r ada e Sa da de Dados
I nput St r eami n = s. get I nput St r eam( ) ;
Out put St r eamout = s. get Out put St r eam( ) ;
}
};

A criao de um socket necessria para a comunicao e esta realizada
atravs de um identificador nico utilizado no servidor. Tanto o socket quanto os objetos
de streaming devem ser armazenados em variveis globais da atividade, para acesso
em outros mtodos. Aps estes cdigos, possvel manipular a transferncia de dados,
como, por exemplo, utilizando um mtodo chamado no clique de um boto.

f i nal St r i ng cont eudo = Mensagemenvi ada par a o ser vi dor . ;
Thr ead sender = new Thr ead( ) {
Android


113
publ i c voi d r un( ) {
byt e cont ent [ ] = cont eudo. get Byt es( ) ;
t r y { / / Possi bi l i dade de Er r o
out put . wr i t e( cont ent . l engt h) ;
out put . wr i t e( cont ent ) ;
al er t ( " Text o Envi ado" ) ;
} cat ch ( I OExcept i on e) { / / Er r o Encont r ado
al er t ( " Er r o na Tr ansf er nci a" ) ;
}
}
};
sender . st ar t ( ) ; / / I ni ci al i zao

Com os cdigos acima possvel realizar uma conexo bluetooth em qualquer
servidor de identificadores conhecido e a criao destes pode ser realizada em diversas
linguagens, com diversos dispositivos.


Android


114

5.7. Sensores

O sistema operacional Android, assim como muitos dos dispositivos que o possuem
instalado, suporta alguns recursos de sensores, dentre os quais pode-se destacar o
acelermetro (responsvel pela medio de acelerao aplicada a movimentos) e o
giroscpio (responsvel pela medio de movimentos de giro/inclinao). Estes sensores
so utilizados para diversas aplicaes, como jogos, ajustes de tela, melhorias de
usabilidade, etc.



No Java para Android, a captao do giroscpcio realizada atravs de
listener de eventos.

pr i vat e voi d hookupSensor Li st ener ( ) {
Sensor Manager sm=
( Sensor Manager ) get Syst emSer vi ce( Cont ext . SENSOR_SERVI CE) ;
sm. r egi st er Li st ener ( sel ,
sm. get Def aul t Sensor ( Sensor . TYPE_GYROSCOPE) ,
Sensor Manager . SENSOR_DELAY_UI ) ;
}

pr i vat e f i nal Sensor Event Li st ener sel = new Sensor Event Li st ener ( ) {
publ i c voi d onSensor Changed( Sensor Event event ) {
i f ( event . sensor . get Type( ) == Sensor . TYPE_GYROSCOPE) {
updat eOr i ent at i on( event . val ues[ 0] , event . val ues[ 1] ,
event . val ues[ 2] ) ;
}
Android


115
}

publ i c voi d onAccur acyChanged( Sensor sensor , i nt accur acy) {}
};

pr i vat e voi d updat eOr i ent at i on( f l oat headi ng, f l oat pi t ch, f l oat
r ol l ) {
/ / Updat e t he UI
}

Como nem todo dispositivo possui o suporte a giroscpio, possvel identificar
esse suporte atravs do seguinte cdigo.

PackageManager paM = get PackageManager ( ) ;
bool ean gyr oExi st s =
paM. hasSyst emFeat ur e( PackageManager . FEATURE_SENSOR_GYROSCOPE) ;

De qualquer forma, necessrio especificar uma solicitao de permisso para
utilizao do giroscpio, o que atualmente filtra downloads no Google Play para os
dispositivos suportados.

<uses- f eat ur e andr oi d: name=" andr oi d. har dwar e. sensor . gyr oscope" / >

Para utilizao de acelermetro, possvel utilizar a Classe SensorManager,
responsvel por mtodos e atributos especficos de controle do recurso.

publ i c cl ass Sensor Act i vi t y ext ends Act i vi t y, i mpl ement s
Sensor Event Li st ener {
pr i vat e f i nal Sensor Manager mSensor Manager ;
pr i vat e f i nal Sensor mAccel er omet er ;

publ i c Sensor Act i vi t y( ) {
mSensor Manager =
( Sensor Manager ) get Syst emSer vi ce( SENSOR_SERVI CE) ;
mAccel er omet er =
mSensor Manager . get Def aul t Sensor ( Sensor . TYPE_ACCELEROMETER) ;
}

pr ot ect ed voi d onResume( ) {
super . onResume( ) ;
mSensor Manager . r egi st er Li st ener ( t hi s, mAccel er omet er ,
Sensor Manager . SENSOR_DELAY_NORMAL) ;
}

pr ot ect ed voi d onPause( ) {
super . onPause( ) ;
mSensor Manager . unr egi st er Li st ener ( t hi s) ;
Android


116
}

publ i c voi d onAccur acyChanged( Sensor sensor , i nt accur acy) {
}

publ i c voi d onSensor Changed( Sensor Event event ) {
}
}

A manuteno de dados obtidos pelos mtodos recuperadores da sensibilidade
requer algum conhecimento de fsica, pois os movimentos so realizados em um plano
tridimensional, com coordenadas obtidas a partir de matrizes e definio de vetores. A
documentao completa pode ser encontrada no seguinte endereo.

http://developer.android.com/reference/android/hardware/SensorManager.html


Android


117

5.8. OpenGL, games, redes sociais e tendncias

Com todos os principais recursos e facilidades disponibilizadas pelo Android
estudados, possvel desenvolver uma aplicao completa e disponibiliz-la no Google
Play. Mesmo assim, possvel incrementar ainda mais uma aplicao com recursos cada
vez mais utilizados e em constante evoluo. Um exemplo disso o mercado de jogos. O
nmero de games para Android cresce cada vez mais e com ele os recursos para
produo desses jogos. Pode-se encontrar em distribuies livres muitos recursos, alm
de engines (motores de execuo) de fsica, montadas sobre a codificao crua do
OpenGL, recurso de licena aberta para produo de elementos tridimencionais em
interface grfica.

possvel obter mais informaes sobre OpenGL no site oficial:

http://www.opengl.org/

Alm de estudar OpenGL, interessante analisar o cdigo-fonte das principais
bibliotecas de engines de fsica gratuitas, para entender melhor a integrao e o
funcionamento do OpenGL com outros recursos.

AndEngine principal engine de fsica gratuita para Android, contm uma
biblioteca de exemplo com aplicativos de demonstrao e blog de atualizao e suporte.

http://www.andengine.org/

Cocos2D engine em andamento, migrada da verso oficial iOS para Android, fez
muito sucesso nos dispositivos da Apple e tenta ganhar seu espao no sistema da Google.

http://code.google.com/p/cocos2d-android/

A documentao completa do OpenGL para Android pode ser encontrada no
seguinte endereo.

http://developer.android.com/guide/topics/graphics/opengl.html

Com os games, surgiram as necessidades de novos recursos para entretenimento, e
a competitividade tornou-se o principal. Como nos jogos de outrora, onde os melhores
jogadores eram identificados pelos recordes em pontuaes, nos jogos para plataformas
mveis muitas vezes possvel compartilhar os resultados nas redes sociais. Esta
integrao muito comum, principalmente quando fala-se em Facebook. Dentre as
principais integraes com a plataforma, esto o compartilhamento de conquistas e
Android


118
resultados e colaborao de amigos. Nos jogos da gigante Zynga, comum a
necessidade da participao de amigos na evoluo do jogo de um usurio. No CityVille,
por exemplo, o usurio precisa solicitar recursos aos amigos que, colaborando, acabam
ganhando bnus em retorno. Tanto na verso incorporada no Facebook, quanto na
verso mvel do jogo Zynga Poker, o jogador pode jogar contra amigos do Facebook ou
contra outros usurios do mundo inteiro que possuem conta na rede social, alm de
poder fornecer prmios para eles.

No s de integraes com jogos vivem as redes sociais nos aplicativos mveis.
Aplicativos como o Cardio Trainer, por exemplo, utilizam compartilhamento de treinos
programados e executados no Twitter e Facebook, com direito a informaes detalhadas
do treino e mapa de execuo. Outros aplicativos, como o TweetDeck, utilizam das redes
sociais para o principal objetivo do aplicativo, integrar as redes em um nico formato de
informaes.

A Facebook oferece um excelente portal de desenvolvimento para desenvolvedores
de vrias plataformas, com documentao completa das bibliotecas (com exemplos de
cdigo) e frum de discusso.

http://developers.facebook.com/?ref=pf

http://developers.facebook.com/docs/guides/mobile/

A Twitter segue o mesmo exemplo e fornece uma plataforma bem completa.

https://dev.twitter.com/

Ambas as redes sociais fornecem recursos para usurios domsticos e
coorporativos, portanto, a integrao entre aplicativos mveis e redes sociais pode fazer
uma grande diferena nas estratgias de marketing digital.

Outras plataformas sociais oferecem recursos para desenvolvedores mveis e
podem facilmente serem implantadas, fornecendo maior abertura na construo de
novas ideias. LinkedIn, Foursquare, Instagr.am, so exemplos de plataformas sociais
com recursos que podem agregar muito valor aos aplicativos a serem disponibilizados
no Google Play.

Estas, alis, so as principais tendncias de mercado para as prximas geraes
de dispositivos e verses do Android. Sero vistos cada vez mais jogos utilizando
recursos de hardware e conexes sem fio, utilizao de multi-toque, aplicativos de
produo e estilo de vida conectados com plataformas sociais, informaes armazenadas
em nuvem e, principalmente motivados pela Google, produtores independentes de boas
aplicaes mveis. Graas abertura a desenvolvedores e ao suporte com boa e clara
Android


119
documentao, a Google conquista cada vez mais um espao maior entre os dispositivos
mveis, sejam smartphones ou tablets, alm de mais usurios utilizarem de forma mais
profunda seu sistema operacional e desenvolvedores se interessarem pela plataforma
perante os considerados rivais de mercado.

Android j uma tima opo de desenvolvimento, tornando-se uma ferramenta
mais necessria a cada dia, tanto para usurios domsticos que procuram muitas opes
de produtividade e entretenimento para seu dia-a-dia, quanto para grandes corporaes
que buscam novas estratgias de marketing. Conquistando mais fabricantes de
dispositivos, adaptando-se s tendncias de mercado e conquistando novos
desenvolvedores, o Android uma ferramenta poderosa que vale muito a pena ser
estudada.


Android


120

4. Exerccios

Este captulo da apostila contm os exerccios para estudo e fixao referentes aos
demais respectivos captulos.

1) Introduo Java

1.1) Configurar ambiente de desenvolvimento Java.
a) Seguir as instrues de instalao e configurao do Java SDK;
b) Seguir as instrues de instalao e configurao da IDE Eclipse;

1.2) Criar um projeto Hello World Java.
a) Criar um novo projeto Java;
b) Inserir um cdigo de escrita Hello World;
c) Criar um perfil de execuo de projeto e executar;
d) Criar um perfil de depurao de projeto e executar;

2) Introduo Android

2.1) Configurar ambiente de desenvolvimento Android.
a) Seguir as instrues de instalao e configurao do Android SDK;
b) Seguir as instrues de instalao e configurao do Android
Development Tools;

2.2) Criar um projeto Hello World Android.
a) Criar um novo projeto Java;
b) Inserir um cdigo de escrita Hello World;
c) Criar um emulador compatvel com a verso escolhida na criao do
projeto;
d) Criar um perfil de execuo de projeto e executar;
a) Criar um perfil de depurao de projeto e executar;

3) Conceitos Bsicos Android

3.1) Iniciar a implementao de um aplicativo gerenciador de listas de tarefas
(checklist), contemplando cadastro de listas, cadastro de tarefas, marcao de
tarefas concludas, compartilhamento de tarefas (e-mail e redes sociais), cmera
para armazenamento de foto e marcao de localizao.



Android


121
3.2) Implementar duas primeiras atividades do aplicativo.
a) Atividade Principal, responsvel pela inicializao do app, com
definies das variveis globais e constantes e layout associado contendo a
listagem das listas cadastradas;
b) Atividade Cadastro de Lista, contendo formulrio de cadastro com os
campos Ttulo, Resumo, Data Meta;

3.3) Implementar diversos eventos de controle do ciclo de vida das atividades,
tratando Pause, Resume, Start, Stop.

3.4) Implementar a estrutura de banco de dados e mtodos de persistncia para
armazenamento das listas, utilizando SQLite e SQLiteOpenHelper;

3.5) Preparar servio para execuo em segundo plano, que verifique data e
hora atual para alertas de tarefa.

4) Interface Grfica

4.1) Criar demais layouts para as telas do aplicativo:
a) Cadastro de Tarefas;

4.2) Implementar diversas telas, utilizando os principais tipos de layout
estudados, combinando-os e analisando benefcios a serem implementados no aplicativo:
a) LinearLayout;
b) FrameLayout;
c) RelativeLayout;

4.3) Implementar diversos componentes, utilizando seus recursos e analisando
benefcios a serem implementados no aplicativo:
a) TextView;
b) EditText;
c) CheckBox;
d) RadioButton;
e) ToggleButton;
f) Spinner;

4.4) Implementar avisos diversos e sobre as operaes de incluso, alterao e
excluso no aplicativo, utilizando os diversos recursos de alertas:
a) Toast;
b) AlertDialog;
c) Notification (implementar no servio);

4.5) Criar um menu para o aplicativo:
Android


122
a) Opes;
b) Sair;

4.6) Implementar sistema de tabulao de layouts no aplicativo, deixando todas
as opes de tela visveis, utilizando TabView;

5) Conceitos Avanados

5.1) Implementar um layout contendo visualizao de mapa:
a) Pesquisa de endereo no mapa;
b) Overlays contendo apontadores para localizao de tarefas;
c) No evento de pressionar sobre o mapa, abrir tela de cadastro de tarefa
para realizar associao com a lozalizao informada;

5.2) Converter a estrutura de banco de dados do aplicativo em ContentProvider;

5.3) Implementar sistema de preferncias de usurio para armazenamento das
informaes no menu opes;

5.4) Implementar sistema de armazenamento de imagem tarefa, realizando a
utilizao da cmera atravs de um dos dois mtodos apresentados:
a) Por Intent;
b) Por SurfaceView;

5.5) Implementar compartilhamento de tarefa:
a) Por E-mail;
b) Por Facebook;

Android


123

Anotaes

__________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
Android


124
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________