457
1DUCAÇÁ0 CltHCIA B TECHOI OCIA w fiíTiiiiinii i i i i i i 229623 . 5FCH • CAMPUS FQÜ t AUEZ A I 1 BIBLI O T E C A | ------------ ...... . . á. -T CÜMPKK  Google Android  para Tablets  Ap renda a dese nv olver ap lic ões p ara o Android - De smart phones a tab lets Ricardo R. Lecheta Novatec

LECHETA, Ricardo R. Google Android Para Tablets

Embed Size (px)

Citation preview

  • 1DUCA0 CltHCIA B TECHOIOCIA w

    fiTiiiiinii i i i i i i2 2 9 6 2 3

    . 5FCH CAMPUS FQtAUEZAI 1 BIBLIOTECA |

    ------------ . . . . . . . . . - T

    C M PKK

    Google Android para Tablets

    Aprenda a desenvolver aplicaes para o Android - De smartphones a tablets

    Ricardo R. Lecheta

    N o v a te c

  • Copyright 2012 Novatec Editora Ltda.

    Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. proibida a reproduo desta obra, mesmo parcial, por qualquer processo, sem prvia autorizao, por escrito, do autor e da Editora.- ~ ' '

    ; r -Editor: Rubens Prates Reviso gramatical: Alessandra Thom Editorao eletrnica: Carolina Kuwabata Capa: DesignCRV

    ISBN: 978-85-7522-292-8

    Histrico de impresses:

    Setembro/2012 Primeira reimpressoFevereiro/2012 Primeira edio

    Novatec Editora Ltda.Rua Lus Antnio dos Santos 110 02460-000 - So Paulo, SP Brasil Tel.: +55 112959-6529 Fax: +55 112950-8869 E-mail: [email protected] Site: novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec Linkedln: linkedin.com/in/novatec

    OPCE- CAM PUS F O R T A L E Z A ! BIBLIOTECA WU.DYR DIOGO DE SIQUEJRA f

    Registo v. _

    P m r ^ Z X E E Z S Z ex.. Oat a ^ i ^ L } j2 -3 k . I

    O o S~- 2 6

    f S S q ,J L - y . *

    D a d o s I n t e r n a c i o n a i s d e C a t a l o g a a o n a P u b l i c a o ( C I P )

    ( C m a r a B r a s i l e i r a d o L i v r o , S P , B r a s i l )

    L e c h e t a , R i c a r d o R.

    G o o g l e A n d r o i d p a r a t a b l e t s : a p r e n d a a d e s e n v o l v e r a p l i c a e s p a r a o A n d r o i d : d e s m a r t p h o n e s a t a b l e t s / R i c a r d o R. L e c h e t a . S o P a u l o : N o v a t e c E d i t o r a , 20 1 2 .

    B i b l i o g r a f i a .I S B N 9 7 8 - 8 5 - 7 5 2 2 - 2 9 2 - ;

    1. A n d r o i d ( P r o g r a m a d e c o m p u t a d o r ) 2. A p l i c a o d e p r o g r a m a - D e s e n v o l v i m e n t o 3. C o m p u t a o m v e l 4. G o o g l e 5. I n t e r n e t s e m f i o 6. T a b l e t s I. T t u l o .

    C D D - 0 0 5 .26

    n d i c e s p a r a c a t l o g o s i s t e m t i c o :

    1. A n d r o i d : p l a t a f o r m a d e d e s e n v o l v i m e n t o p a r a a p l i c a t i v o s m v e i s : T a b l e t s s P r o g r a m a d e c o m p u t a d o r 0 0 5 . 2 6

    V C 2 0 1 2 0 9 0 3 ,

  • Este livro dedicado a Deus, a toda a minha famlia e principalmente aos meus pais, por terem me dado todo o carinho e a melhor educao possvel e

    por serem um grande exemplo de boas pessoas.

    Em especial, este livro dedicado Paty, que uma pessoa muito especial em minha vida e que sempre esteve ao meu lado me apoiando em todos os

    momentos. Paty, voc sabe que s fico completo quando estamos jun tos e quevoc a dona do meu corao. Te amo.

  • Sumrioi

    Cj Cj j HJ ^ o

    Agradecimentos...............................................................................................................................................13

    Sobre o a u to r................................................................................................................................................... 14

    Prefcio.............................................................................................................................................................. 15

    Captulo 1 Introduo.................................................................................................................................16 ; -13 A ndroid 3.x - H oneycom b.............................................................................................17 ! o o I1.4 A ndroid 4.x - Ice Cream Sandw ich............................................................................. 17 1 ^ ^ 11.5 Organizao do livro .......................................................................................................19 ? jg '

    \% %Captulo 2 Aplicativo de exemplo........................................................................................................... 23 g ^2.1 O projeto.............................................................................................................................23 i Jj. ^2.2 C riando o p ro je to ....................................................................................................................26 !23 C riando a tela principal - D ashboard ................................................................................. 292.4 C riando os layouts de cabealho e ro d ap ........................................................................ 352.5 Adicionando os eventos nos botes do d ash b o ard .........................................................382.6 A classe C a rro ........................................................................................................................... 402.7 A rquitetura de integrao com o legado ............................................................................ 412.8 Requisio HTTP para ler o arquivo XML........................................................................422.9 C riando um projeto biblioteca para o pro jeto ..................................................................492.10 Criando testes unitrios com JU n it.......................................................................... 532.11 Verificando se existe conexo de dados disponvel............................................... 582.12 Trabalhando com threads............................................................................................ 612.B A classe AsyncTask........................................................................................................ 632.14 Criando a interface para a lista de carros com um ListVievv............................. 672.15 C riando o adapter para a lista de carros................................................................. 692.16 Encapsulando o AsyncTask para tornar o cdigo mais simples.........................812.17 Exibindo os detalhes do carro selecionado............................................................ 852.18 Exibindo a tela de sobre com um WebView...........................................................922.19 Integrando Java e JavaScript no W ebView.............................................................. 94

  • 2.20 Exibindo um ProgressBar enquanto oW ebView no carrega......

    ^ Google Android para Tablets

    Captulo 3 Controlando o estado de sua activity........................... ....................... ..............1013.1 Vertical e ho rizo n ta l........................................................................................................ 1013.2 Forando a tela a trabalhar na orientao desejada.............................................. 10233 Criando telas diferentes para a vertical e a horizontal.......................................... 1053.4 O problema: o A ndroid destri e recria a activity ao trocar de o rien tao .... 1113-5 Salvando o estado da tela onSaveInstanceState()................................................ 1133.6 Salvando o estado da tela - onRetainN onConfigurationInstance()....... ........ 1173.7 Salvando o estado da tela Q ual m todo utilizar? ................................................ 1183.8 Fazer cache das imagens para m elhorar a perform ance................................. 1223.9 Alternando o layout m anualm ente sem a necessidade de destru ir e recriar a

    tela - andro idxonfigC hanges...................................................................................... 1263.10 O problem a com a configurao do andro idxonfigC hanges........................... 1293.11 Smartphones com tec lad o ............................................................................................1303.12 A tela de aguarde durante a busca dos carros.........................................................B I

    Captulo 4 Trabalhando com diversos tamanhos de tela........................................................1374.1 In tro d u o .........................................................................................................................D74.2 Exemplo prtico sobre o problem a de resoluo................................................... 13843 Termos e notaes u tilizadas........................................................................................1434.4 Convertendo pixels em dp e vice-versa.................................................................... 1504.5 Custom izando as imagens conforme a densidade da te la ................................... 1554.6 A tag no A ndroidM anifest.xm l.............................................1564.7 A ordem que o Android utiliza para buscar os prefixos.......................................1594.8 M antendo a com patibilidade com Android 1.6 ou su p e rio r ...............................1604.9 M antendo a com patibilidade com Android 1.5 ou su p e rio r ............................... 1614.10 Melhores prticas para a criao de telas................................................................1634.11 Aplicativo dos carros custom izado para tela g ra n d e ............................................1634.12 Instalando um add-on para sim ular o GalaxyTab............................................... 1644.13 Custom izando a tela para o GalaxyTab, tela = large............................................1654.14 O problem a de duplicar o cdigo..............................................................................173

    Captulo 5 Android 3.x para tablets"Honeycomb"................................................................. 1745.1 Introduair..........................................................................................................................1745.2 Desenvolvendo aplicaes para o A ndroid 3 .x ........................................................ 17653 Criando um Em ulador para A ndroid 3 .x ................................................................. 1765.4 Executando a aplicao dos carros no Android 3 .x............................................... 1785.5 Preparando o projeto para A ndroid 3.x..................................................................... 1815.6 Custom izando a ActionBar para Android 3.x ou superior...................................1865.7 Identificando se um tablet com Android 3 .x........................................................ 187

  • Sumrio 9

    Captulo 6 - Fragments............................................................................................................ 192

    6.1 In troduo ....................................................................................................................... 1926.2 O problema ao reutilizar views em diversas activities..........................................19363 Como controlar o contedo de diversas views e diversas threads em para le lo ..

    1966.4 Criando o projeto com Android 3.x.......................................................................... 1976 5 Alterando o exemplo para utilizar fragm ents........................................................ 2026.6 Ciclo de vida de um fragm ent.................................................................................... 2126.7 Exemplo para debugar o ciclo de vida de um fragm en t......................................2166.8 Buscar um fragm ent na te la ............................................................................ ........ 2206.9 Criando os fragm ents dinamicamente com Fragm entTransaction...................2246.10 FragmentTransaction - mais alguns exem plos.................................................... 2276.11 Fragment back s tack ...... ............................................................................................ '2306.12 Biblioteca de com patibilidade...........................................:....................................2306.13 M igrando o projeto dos Fragments para utilizar a biblioteca de com patibili

    dade...................................... 7...........................................................................................2316.14 Detalhes sobre o ciclo de vida de um F ragm ent..................................................2366.15 O mtodo setRetainlnstance(boolean).................................................................. 2386.16 Ciclo de vida de um Fragm entTransaction...........................................................239

    Captulo 7 - ActionBar...............................................................................................................243

    7.1 Introduo.........................................................................................................................2437.2 Preparando o projeto de exemplos............................................................................ 24473 Adicionando itens de m enu via A PI..........................................................................2447.4 Adicionando itens de m enu via XM L....................................................................... 24675 Utilizando'o cone do aplicativo como a hom e......................................................2487.6 Trabalhando com Tabs..................................................................................................2537.7 Inserindo um a view customizada na b arra ............................................................. 2587.8 Mtodos utilitrios da ActionBar..................... .........................................................2637.9 ActionBar em verses anteriores ao A ndroid 3 .x ...................................................264

    V

    Captulo 8 * Migrando o aplicativo para tablets.......................................................................267

    8.1 In troduo ....................................................................................................................... 2678.2 Criando o projeto.......................................................................................................... 27283 Analisando a m etodologia utilizada para a m igrao ......................................... 2738.4 Adicionando a biblioteca de compatibilidade no p ro je to ................................... 2748.5 Criando a classe base para os fragm ents................................................................. 2758.6 Criando o fragm ent para o dashboard.....................................................................2788.7 Criando o fragm ent para a tela de sobre.................................................................2828.8 Dividindo a tela do dashboard em duas partes nos tab le ts ............................... 2858.9 Tratando o layout diferenciado para tab le ts .........................................................-2898.10 Criando o fragm ent para a tela de detalhes do carro ......................................... 291

  • 10 Google Android para Tablets

    8.11 C riando o fragment para a tela de listagem de ca rro s ....................................... 2958.12 C riando o layout para a listagem de carros para ta b le ts ...................................2998.13 U tilizando o fragment de detalhes na d ire ita .......................................................3028.14 Navegao por Tabs na ActionBar para ta b le ts .................................................... 3058.15 Criando os itens de menu na A ctionB ar.................................................................3128.16 Im plem entando a ao do item atualizar na ActionBar..................................... 3158.17 Implementado a busca de carros com o SearchView..........................................319

    Captulo 9 Android 4.x - Ice Cream Sandwich....................................................................... 325

    9.1 Introduo.........................................................................................................................3259.2 Configurando o emulador do A ndroid 4 .x..............................................................32593 A ndroid 4.0 ICS possui API Levei = 14..................................................................... 3279.4 Executando a aplicao no A ndroid 4.x ICS........................................................... 32895 Verificando as outras telas da aplicao no Android 4.x IC S ............................. 3319.6 C ustom izando o texto da A ctionB ar......................................................................... 3329.7 U tilizando o menu fsico para acionar os itens de menu da A ctionBar.........3349.8 Troca de orientao na verso sm artphone com A ndroid 4.x IC S ....................3369.9 Travando a tela na horizontal para os ta b le ts .........................................................339

    Captulo 10* Animaes............................................................................................................34110.1 A classe A nim ation........................................................................................................34110.2 C riando o projeto para as an im aes..................................................................... 343103 A lphaA nim ation........................................................................................................... 34810.4 R otateA nim ation...........................................................................................................35110-5 ScaleA nim ation............................................................................................................ 35610.6 TranslateA nim ation..................................................................................................... 35910.7 A nim ationS et................................................................................................................36210.8 A nim ationListener....................................................................................................... 36610.9 LayoutAnimationController...................................................................................... 37010.10 Interpolator................................................................................................................... 37110.11 VievvFlipper................................................................................................................... 37310.12 View customizada com animao ..........................................................................37610.13 Inserindo uma animao no projeto dos carros................................................. 378

    Captulo 11 * Animaes com Android 3.0.................................................................................38211.1 O problem a com a API de animaes no Android 2 .x ........................................ 38211.2 Property Animation - A anim ao criada a partir do A ndroid 3.x.................388113 A classe V alueAnim ator...............................................................................................38911.4 A classe O bjectA nim ator.............................................................................................393113 O bjectA nim ator - Criando um a anim ao alpha ............................................... 3^511.6 O bjectA nim ator - G irando um o b je to ................................................................... 39711.7 O bjectA nim ator-Scale............................................................................................... 398

  • Sumrio 11

    611.8 O bjec tA nim ato r- Movendo um objeto pela te la ............................................... 39911.9 Criando um conjunto de animaes com a classe A nim atorSet..................... 40111.10 Anim atorListener....................................................................................................... 40211.11 Inserindo um a animao no projeto dos carros................................................. 406

    Captulo 12 Google Analytics e Google Mobile Ads........................................................................ 41012.1 Introduo ao Google A nalytics...............................................................................41012.2 Criando um a conta no Google A nalytics.............................................................. 411123 Fazendo o download do SDK do Google A nalytics............................................ 41312.4 Criando os pagevievvs................................................................................................ 41612.5 Visualizando os relatrios......................................................................................... 41812.6 Introduo ao Google Mobile Ads - AdM obs..................................................... 42012.7 Google Mobile A ds..................................................................................................... 42112.8 Registrando a aplicao no A dM obs......................................................................42212.9 Configurando o p ro je to ............................................................................................ 42612.10 Como adicionar um anncio com o AdView.....................................................42812.11 Alterando os layouts das telas de c a rro s ..............................................................43012.12 Verificando os logs.....................................................................................................43212.13 Voltando administrao da A dM obs...............................................................43312.14 Configurando um banner para a verso Tablet..................................................433

    Captulo 13 Google TV............................................................................................................................ 43813.1 In troduo.....................................................................................................................43813.2 Preparando o ambiente de desenvolvimento........................................................439133 Instalando o KV M ...................................................................................................... 43913.4 Instalando o Google TV A dd-O n........................................................................... 44013.5 Executando o emulador do Google T V ................................................................44213.6 Instalando a aplicao dos c a rro s .......................................................................... 44313.7 Mais sobre o Google TV ............................................................................................445

    ndice remissivo............................................................................................................................................447

  • Agradecimentos

    Este livro no teria acontecido sem a ajuda de diversas pessoas, algum as pela contribuio tcnica, ou tras pela motivao.

    O principal agradecim ento sem dvida a toda a com unidade de desenvolvedores A ndroid que ajudam de algum a forma esse m ercado de m obilidade a crescer e a todos que me enviaram feedbacks para que esta segunda obra pudesse ser realizada.

    Agradeo a todo o pessoal da Wasys e Livetouch pelos incrveis projetos de m obilidade e a todo o pessoal tcnico da equipe pelas ideias e sugestes.

    Em especial, agradeo ao Rubens Prates e A na Carolina Prates, editores da Novatec, por toda a calm a e pela orientao em todas as etapas da produo deste livro. Seus conselhos foram fundam entais para que tudo isto acontecesse.

    Por ltimo, agradeo a voc pelo interesse em ler esta obra. Espero que a leitura seja sim ples e em polgante.

    1 13

  • Sobre o autor

    R icardo R. Lecheta form ado em Cincia da C om putao e ps-graduado em G esto do Desenvolvim ento de Softw are pela PUCPR.Tem certificaes da Sun, IBM e Rational, entre elas SCM AD (J2ME) e SCEA (arquiteto).

    A tualm ente trabalha com o consu lto r e desenvolvedor mobile para diversas plataform as e pode ser contatado pelo em ail [email protected].

  • Prefcio

    A tualm ente, diversas pesquisas apontam o A ndroid como o sistema operacional para sm artphones e tablets que mais cresce no m undo. Sua arquitetura sim ples e flexvel perm ite que ele seja adotado por diversos fabricantes no m undo inteiro, que se beneficiam da sua base slida para criar produtos incrveis e diferenciados em um m ercado que est em plena ascenso e extrem am ente competitivo.

    Hoje em dia temos smarqDhones com processadores de um computador, os grandes tablets e a inda novas plataformas, como o Google TV A evoluo da tecnologia grande, e a d ispu ta no mercado de m obilidade est acirrada, de m aneira que mesmo especialistas no assunto tm dificuldades de acom panhar esse movimento. O objetivo deste livro auxiliar o leitor a acom panhar esse mercado, com um a abordagem sim ples e que vai direto ao ponto. Para a com preenso do texto so necessrios conhecim entos de bsicos a interm edirios de Android.

    Nosso objetivo criar um projeto Android, passo a passo, apresentando diversas dicas, boas prticas, e abordando os problem as mais com uns no desenvolvimento.

    C onceitos fundam entais sobre com o criar aplicaes que funcionem de forma correta em diversas telas e resolues, dos sm artphones aos grandes tablets, tratar corretam ente as telas na vertical e horizontal, integrao com servidores web com requisies H T TP para buscar informaes, processam ento em background, detalhes de anim aes e os novos recursos disponveis na API sero apresentados de form a prtica em nosso projeto.

    A cada novo captulo, m edida que novos conceitos so explicados, o projeto vai evoluindo junto, passo a passo, e no final da leitura estar criada um a aplicao compatvel, desde os sm artphones com A ndroid 1.6 at os novos tablets com A ndroid 3.x, e claro que o A ndroid 4.x ICS no ficar de fora.

    Os conceitos apresentados tam bm so a base do A ndroid e valem para qualquer verso da plataform a. O sistem a operacional do robozinho verde no para de crescer e com certeza aipda vai nos surpreender m uito com sua evoluo. Este livro vai fornecer a voc um a boa base para acom panhar esse mercado.

    Conhea o aplicativo que vamos desenvolver em www.livroandroid.com.br/carros.

    15

  • CAPTULO 1

    Introduo

    1.1 IntroduoA tualm ente, diversas pesquisas apon tam o A ndroid com o o sistem a operacional para sm artphones que m ais cresce no m undo. Sua arqu ite tu ra sim ples, flexvel e ao m esm o tem po poderosa perm ite com que ele seja a base para m uitos produtos, que se beneficiam de sua plataform a.

    A disputa no m ercado de m obilidade est extrem am ente acirrada, com diversas inovaes e lanam entos acontecendo em todos os lugares, e m esm o os especialistas sentem dificuldade em acom panhar tam anha evoluo.

    E stam os na dcada da m obilidade, onde sm artphones e tablets faro cada vez mais parte de nosso dia a dia, e o m ercado busca incessantem ente p o r especialistas no assun to para desenvolver aplicativos com erciais e coorporativos para os mais diversos setores, com o varejo, sade, econom ia, jogos e m uito mais.

    O objetivo deste livro fornecer um a base slida para que se acom panhe esse m ercado e que se desenvolvam aplicaes com petitivas com o sim ptico sistem a operacional do robozinho verde.

    1.2 Desenvolvendo desde smartphones at tabletsPara que se com preenda este livro recom endam -se conhecim entos bsicos de A ndroid, para que se consiga acom panhar os exemplos.

    N osso objetivo desenvolver, passo a passo, um a aplicao que funcione desde nos sm artphones com A ndroid 1.6 at nos novos tablets com A ndroid 3.x Honeycom b.

    16

  • C apitu la i Introduo 17

    Recentem ente tam bm foi lanado o A ndro id 4.x Ice Cream Sandwich, o qual visa u n ir as plataform as de desenvolvimento dos sm artphones e tablets e trazer as novas APIs, que inicialm ente estavam disponveis apenas no H oneycom b para os sm artphones.

    Com todas essas verses do A ndroid e toda a diversidade de aparelhos com diferentes tam anhos de tela e resoluo, surge um a dificuldade em desenvolver aplicativos com patveis com todos eles.

    N esta obra, a cada captulo vam os evoluir nosso projeto, u tilizando vrias boas prticas e dicas de desenvolvimento m edida em que os assuntos vo sendo abordados.

    Com o foco principal temos o desenvolvim ento de um a aplicao n ica para sm artphones e tablets, e ainda usufru indo de novos recursos, com o Fragm ents e ActionBar, disponveis a partir do A ndroid 3.x - Honeycomb.

    1.3 Android 3.x - HoneycombCom a popularizao dos tablets e a g rande busca dos usurios po r esses equipam entos surgiu a necessidade de otim izar e custom izar o A ndroid para que se usufrua ao m xim o do tam anho de tela disponvel nesses aparelhos.

    A resposta do Google para essa dem anda foi o lanam ento do A ndroid 3.x, conhecido com o Honeycomb, com o objetivo de.fornecer ao usurio um a tim a experincia ao utilizar os tablets.

    D uran te a le itura vam os estudar as novas APIs disponveis a p a rtir do H oneycomb, com o Fragm ents e ActionBar, e o tim izar o projeto do livro para tablets.

    A figura 1.1 exibe a aplicao dos carros executando em um tablet.

    1.4 Android 4.x - Ice Cream SandwichDepois que o A ndroid 3.x =-Honeycomb foi lanado, com novos recursos e fun cionalidades, surgiu um a grande necessidade de unificar as plataform as de desenvolvimento entre os tablets e sm artphones. Para isso foi lanado o to aguardado A ndroid 4.x - Ice Cream Sandwich (ICS), que unificou o sistem a operacional, perm itindo que os sm artphones pudessem u tilizar os ltim os recursos e APIs disponveis no sistem a operacional.

  • A Ferrari ff xjJw de r revetaU. $* irjia do primeiro modelo d* mira i ter traJo miegrjl. Alm dujo. ele tonta com um motor dianteiro VU. S* i de um modelo GT de quatro lugiresque nio l itrUKul a 612 mis timUem atril um novo tipo Ce tiitme.

    daquele que gosu de percorrer ummhos mais Cillcei que exigem Jj Integra.e modelo revoJuaoMnp (Centro 6a marca) (em um novo cfwsy com erire-euos maior, jlm Ce usper.wo independente que incorpcr j a jttimj gerjio de amortecedores fcUveii, alm de heiot de cerimica d* Brembo.

    j&&gad

    Figura 1.1 - Projeto dos carros executando em um tablet com Android 3 .x - Honeycomb.

    A figura 1.2 exibe a aplicao dos carros funcionando em um sm artphone com A ndro id 4.x - ICS.

    LUXO ESPORTIVOS

    ' Livro Android - Todos os direitos rtiwvados

    Figura 1.2 - Projeto dos carros executando em um smartphone com A ndroid 4 .x - ICS.

  • Captulo 1 Introduo [

    1.5 Organizao do livroEsta obra dedicada aos desenvolvedores A ndroid que j desenvolvem aplicativos para esse sistema operacional, ou pelo m enos conhecem o bsico sobre a plataform a.

    O desenvolvimento do projeto j comea a todo o vapor no captu lo 2 e com um a abordagem simples e direta. Para comear constru da, passo a passo, um a aplicao que lista diversos carros separados por categoria, com todos os detalhes necessrios para um bom entendim ento do exemplo.

    A ssuntos avanados, como tratam ento de threads, requisies http, parser de xm l e at com o criar projetos de biblioteca com classes reutilizveis e um projeto de testes, so explicados e detalhados j no captulo 2.

    A figura 13 exibe o projeto que teremos executado no final do captulo 2.

    N o captulo 3 explicado com o o A ndroid tra ta a troca de orientao, onde vam os estudar com o criar telas especficas para a vertical ou a horizontal, detalhes im portan tes sobre o ciclo de vida das aplicaes e com o salvar o estado das inform aes corretam ente duran te a troca de orientao.

    O captulo 4 explica a fundo o m aior problem a que tem os com o A ndroid hoje, que o fato de existirem diversos aparelhos com diferentes tam anhos de telas e resolues. Existem celulares pequenos, grandes e tablets, que no se diferenciam som ente pelo tam anho das telas, mas tam bm pela sua resoluo. N esse captulo vamos estudar todos os detalhes que voc precisa saber para dom inar esse assunto, para que seja possvel criarm os aplicaes que funcionem em diversos tam anhos de tela. Esse um captulo bem terico e apresenta um a base m uito forte que todos os desenvolvedores A ndroid precisam dominar.

    O livro m uito prtico, e os detalhes para tratar as telas na horizontal e criar layouts diferenciados, assim com o aspectos avanados do ciclo de vida da aplicao, so abordados de forma simples.

    N o cap tu lo 5 seguimos com nossa abordagem , e agora o prxim o passo ser a in troduo ao A ndroid 3.x - Honeycom b, onde discutirem os aspectos im portan tes que devem ser levados em considerao ao m igrar as aplicaes de sm artphones para tablets.

    Os captulos 6 e 7 fornecem um a base slida para as novas APIs de Fragm ents e ActionBar, criadas para auxiliar o desenvolvedor no aproveitam ento do grande espao disponvel nas grandes telas dos novos tablets de 10, assim com o ajudar na organizao e m anuteno do cdigo.

  • 20 Google Android para Tablets

    * $ C 4 0 /

    Ciirci S h o w u t e

    UvroGoogleAndroid

    Esportivo*

    Bte livro dedtodo *s desenvolvedores Android que desejam aprimorar seus conhecimentos e estudar as novas fundona&Jdes disponveis t>o Android Xx. como fragments e ctionbar.

    . tf* 4 07 - y err s * o 6 |iV ,2 1 ^ %'y.

    l?2i\X,-j3f- T u ck e rlM

    itiicifas&cc-si--:.... C a r r o s , S f t o w t a s e v . - . ;

    O Tucfcer (oJ reaJmftt uma tnovaJo no mundo do d rs lp tautom frtie embora o modeto 1 M S foi o nico modeto)! produzido seu efefco sobre o mundo dosautomvebaMa pode r sendda t hoje. Preston Tixter e Alex Trcrmfe proletouoTuchcr como uma ttraoa de entrar na Inttarta automotha. e apesar de apenas um ptmhad de carros foram produzidos o* recursos Que ettavam p m trc t i naqueles carros ram extremamente inovador paraaepoca.

    Tc&f tHaW-^ rtttrOf'

    Figura 1.3 -A plicao dos carros para smartphone Android 2.x.

    O captulo 8 onde comeamos a migrao da aplicao dos carros para tablets. O resultado depois da utilizao dos novos conceitos pode ser visualizado na figura 14.

    N o final desse captulo a aplicao estar p ronta e funcional, e terem os em um nico bu ild um a aplicao que funciona desde em sm artphones com A ndroid1.6 at nos novos tablets com A ndroid 3.x. A lm disso, exibido u m layout diferenciado para cada tipo de tela, para que se aproveitem ao m xim o os padres e recursos disponveis na plataform a.

  • Captulo 1 Introduo 21

    e n M W t f in t t s Trophy y 3 OnsnlBl l n t f i l i Srsnubrto Spart Dtxnfto

    Figura 1.4 - Aplicao dos carros executando em um tablet com Android 3 .x de 10.

    N o captulo 9 feita a introduo ao A ndroid 4 .xICS, e vamos verificar como a aplicao constru da para tablets pode executar em um poderoso sm artphone que vai u su fru ir dos novos recursos, inclusive da navegao porTabs na ActionBar.

    Esta obra no para po r a, e os captulos 10 e 11 explicam as bibliotecas d isponveis para anim ao no A ndroid 2.x e o novo fram ework de anim ao criado a partir do A ndroid 3.x, respectivamente. Diversos exemplos simples e prticos so criados p ara explicar as animaes, e no final desses captulos vam os tu rb inar a aplicao dos carros e criar alguns efeitos especiais.

    N o captulo 12 vam os estudar com o exibir anncios do Google M obile Ads - AdM obs na aplicao e a possibilidade de ter lucro com o aplicativo sem pre que algum usurio clicar sobre um anncio.

    O utro assunto que vam os estudar com o utilizar o Google Analytics para m onitorar as telas acessadas da aplicao, assim com o diversos eventos gerdos, para descobrir com o o usurio est u tilizando tal aplicao e posteriorm ente ter acesso a interessantes relatrios e mtricas.

    A figura 1.5 m ostra os anncios sendo exibidos na aplicao dos carros.

  • 22 Google Android para Tablets

    t-vW - LCirrosSho wcase

    Clssicos Luxo

    Esportivos sobre

    Celulares e Sm artphones .D to rs c i WoJckHv e Mj i m i eom os M e lh ctn P/ros Confiro O fcftK ! '

    v / : ' . .Carros S h o w c a s e tr

    | Lamborgmm Avenudor /

    Chevrolet Corvette 236 >

    BMW MS > a

    Renault Megane RS Trophy >

    Maserati GraneabrJo sport >

    M cLa r e n MP4-12C >

    MERCEDES-BENZ C63AMG >

    Tablets no Magazine lulza .Tjtfrtl Antrol- wn j(

  • (CAPTULO 2

    Aplicativo de exemplo

    Neste captulo vam os desenvolver, com o exemplo, um interessante projeto em que diversos conceitos usados em aplicaes reais sero utilizados.

    N essa aplicao vam os exibir diversos carros em um a lista, com descrio e foto. Ao selecionar um carro na lista, vam os exibir ou tra tela com os seus detalhes.

    Nesse projeto vam os fazer um a requisio H TTP em um servidor web para |buscar um XM L com todos os carros disponveis e validar im portantes conceitos ino desenvolvimento. (

    iPosteriorm ente, vam os m elhorar esse projeto para utilizar novos recursos dos i

    tablets A ndroid e apresentar conceitos im portantes que devem ser levados em considerao ao desenvolver aplicaes.

    ; ,j..i:;

    2.1 0 projeto :O projeto que vam os desenvolver simples, mas dem onstra um a srie de padres e tcnicas de desenvolvim ento utilizadas no Android. M uitos conceitos sero apresentados, e cada captulo ir explicar diferentes aspectos da aplicao, de forma que no final do livro terem os construdo um a aplicao com pleta para tablets com A ndroid 3.x ou superior.

    N a p rim eira tela do aplicativo podem os visualizar um m enu com as opes, conform e a figura 2.1. Esse m enu conhecido com o dashboard e um padro bastante u tilizado em aplicaes A ndroid.

    N o dashboard possvel escolher entre visualizar a lista de carros clssicos, luxo ou esportivos, o que vai buscar um a lista de carros na in ternet e exibir os detalhes, conform e as figuras 2.2 e 23.

    23

    pus ;:

    UA

    i

    2A

    i

  • 24 Google Android para Tablets

    t i!l! r. 5:32 Carros Showcase,

    Esportivos Sobre

    Figura 21 - Tela inicial do aplicativo.

    Carros Showcase ...

    O Ferrari FF

    O AUDI GT Spyder

    G Porsche Panamera

    C Lamborghini Aventador

    A Chevrolet Corvette Z06

    BMW M5

    e s !t! V 5 3 5 I ? * e ill 93 5*36;.

    Carros Showcase.

    AUDIGTSpyder

    Porsche Panamera

    Lamborghini Aventador

    Chevrolet Corvette Z06

    S fc BMW M5

    Renault Megane RS Trophy > f^ ^ A -^ jR en a u ItM e B an ^ ST ro D WSmartphones e celulares -'-A1?,LG, Semp Toshiba, Samsung em Vrios Modelos. 1 ^ Compre em At 7x Sf Juros! '' *

    ' LivroAndroid - Tods s direitos reservados' ^ ,

    Figuras 2.2 e 2.3 - Lista de carros sendo buscadas dinamicamente na web.

    D epois que tem os a lista de carros podem os selecionar um deles e visualizar os detalhes, conform e a figura 2.4. Nessa tela exibida um a descrio sobre o caro e u m b o to que, se pressionado, vai ab rir o site do fabricante, conform e a figura 2.5.

  • Captulo 2 Aplicativo de exemplo 25

    11 tit^y/www.fCTrari.coW... jj- j j ;.

    A Ferrari FF acaba de ser revelada. Se trata do primeiro modelo da marca a ter trao integral. Alm disso, ele conta com um motor dianteiro VI2. Se trata de um modelo GT de quatro lugares que no s substitui a 612 mas tambm atrai um novo tipo de cliente, daquele que gosta de percorrer caminhos mais difceis que exigem trao integral.ste modelo revolucionrio (dentro da marca) tem um novo chassi com entre-eixos maior, alm de suspenso independente que incorpora a ltima gerao de amortecedores ajustveis, alm de freios de cermica da Brembo.

    Figuras 2.4 e 2.5 - Detalhes do carro selecionado.

    N o dashboard tam bm podem os pressionar o bo to Sobre, que vai ab rir um WebView, conform e a figura 2.6.

    LivroGoogleAndroid Googa

    AflDROID

    Este livro dedicado aos desenvolvedores Android que desejam aprim orar seus conhecimentos e estudar as novas funcionalidades disponveis no Android 3.x, como fragments e actionbar.

    i/ -^ livrAridrotd Todos os direitos reservados' - * ;

    Figura 2.6 - Tela de Sobre com WebVtew.

    N o decorrer do livro vam os m igrar a aplicao dos carros para tablets com A ndroid 3.x, explicando todos os detalhes necessrios para fornecer um a base

  • 26 Google Android para Tablets

    slida no desenvolvimento de aplicaes A ndroid. A figura 2.7 exibe a aplicao final executando em um tablet.

    Chevretet Bel-Air

    i OTixkct foi lejlmentt umainovalo no mundo do deogn auiomvet. e embora o modelo o nico modtlo p proflujida seu: efeito sobre o mundo dos auiomoveis amda pode ser sentida at ho|e. f ieston Tutker e AIez Tremulis pro|eiau o Tutker como uma i tentaitva de entrar na indtna automotiva. e apesar de jperus um punhado de carros (ciam prodtuidos os recursos que eitavam | presentes naqueles carros eram extremamente inovador para poca.

    iiSflaggJ

    m a m w M & r ~ S

    Figura 2.7 -A plicao dos carros sendo executada em um tablet com Android 3.x.

    Essa a proposta do livro, apresentar passo a passo o desenvolvim ento de um a aplicao ao m esm o tempo em que os novos conceitos vo sendo explicados, cada um ao seu tempo.

    Para com preender o livro voc precisa ter conhecim entos de A ndroid, pelo m enos o bsico, porque o principal objetivo apresentar tcnicas de design e novos conceitos de desenvolvimento para tablets.

    2.2 Criando o projetoDepois de entenderm os a aplicao que vam os constru ir, chegou o m om ento de colocarm os a m o na massa e partir para a prtica.

    Para iniciar este captulo vamos preparar o projeto de exemplo.

    N om e do projeto: LivroAndroid-Cap02-Carros

    Verso: A ndro id 23.x

    Pacote: br.livroandroid.carros

    C riar activity classe = Main.java

    Verso m n im a do SDK: 4 (A ndroid 1.6)

  • Se voc preferir, pode im portar no worspace o projeto LivroAndroid-Template como base para acompanhar os exemplos. Esse projeto tem a estrutura de pastas j criadas e contm todas as imagens que vamos utilizar.

    Com o nosso projeto vai acessar a internet, vam os adicionar a devida perm isso no AndroidManifest.xml.

    Lembre-se que as permisses sero exibidas ao usurio no m om ento de instalar o aplicativo pelo A ndroid M arket (Google Play) e tm com o objetivo alert-lo de que sua aplicao pretende acessar o recurso X ou Y

    Feito isso, vamos adicionar um tema customizado no nosso aplicativo. Portanto, adicione o atributo android :theme no AndroidManifestxml, conforme demonstrado a seguir.

    opplication android:icon=,'@drawable/icon" android:label=@string/app_naine''

    android:theme="@style/tema>

    No final dessas alteraes o arquivo de configurao deve ficar desta m aneira:

    i f t A ndroidM anifest.xm l

    opplication android:icon="@drawable/icon" android :label="@string/app_name"

    android:theme=@style/tema">

    A partir do ADT 14.0.0 o plugin do Eclipse customiza no arquivo AndroidManifest.xml o nome do cone da aplicao para android :icon="@ drawable/ic_launcher, em vez de android:icon="@drawable/icon", como anteriormente. Neste livro utilizaremos a notao antiga, e a imagem icorupng utilizada nos exemplos pode ser encontrada no link de download do livro.

    Captulo 2 Aplicativo de exemplo

    jUK-iwjisr,',

  • 28 Google Android para Tablets

    Feitas essas alteraes, o projeto no vai compilar, pois estam os utilizando um tem a que ainda no foi criado. Portanto, vamos criar o arquivo de. estilos Iresl values/css.xm l, conform e dem onstrado a seguir.

    * /res/values/css.xm l

  • Captulo 2 Aplicativo de exemplo 29

    ) /res /values/cores.xm l

    #FFA500

    #0000ff

    #ffffff

    #cccccc

    #dddddd

    #eeeeee

    #FFA500

    #000000

    #00000000

    #00ff00

    #ff0000

    Se voc preferir, pode im portar no worspace o projeto LivroAndroid- Template como base para acompanhar os exemplos. Esse projeto tem a estrutura de pastas j criadas e contm todas as imagens que vamos utilizar.

    2.3 Criando a tela principal - DashboardN o Google I/O 2011 foram apresentadas diversas palestras sobre A ndroid, e o Google criou um aplicativo dem onstrando algumas boas prticas no desenvolvim ento de aplicaes m obile para Android.

    Essa aplicao se cham a iosched e pode ser encontrada no site http://code.google. com/p/iosched/.

    Um a das funcionalidades que essa aplicao dem onstra o padro dashboard para a tela inicial, onde temos o m enu da aplicao. Felizmente o Google liberou o cdigo-fonte da classe DashboardLayout.java que pde ser encontrada no m aterial de dow nload do livro.

    Essa classe um gerenciador de layout custom izado que vai organizar as views - neste caso, botes - da tela principal em linhas e colunas, para obterm os o visual da figura 2.1.

    D epois de copiar essa classe para o projeto, inserindo-a no pacote com.google. android.apps.iosched.ui.widget, necessrio custom izar o arquivo /res/layout/main.xml

  • J0 Googte Android para Tabletsi

    para utilizar o DashboardLayout. Felizmente esse layout mgico e vai fazer todo otrabalho pesado de separar as views em duas colunas.

    : /res /lay o u t/m a in .x m l

  • Captulo 2 Aplicativo de exemplo 31

    android:drawablePadding="10dp"

    android: background="@null"

    android:textStyle="bold"

    android: textColor="@color/preto"

    />

    Car)s

    Por favor aguarde...

    LivroAndroid - Todos os direitos reservados

  • 32 Google Android para Tablets

    Carros 5howcase

    Conexo indisponvel, por favor ative sua rede mvel ou Wi-Fi.

    Ooops, sistema indisponvel nom momento.

    Luxo

  • Captulo 2 Aplicativo de exemplo 33

    & /re s /d ra w a b le /b tn _c arro _e s p o rtiv o .x m l

    ''1.0" encoding="utf-8''?>

  • 34 Google Android para Tablets

    i /re s /d ra w a b le /b tn _c arro _d ass ico .xm l

  • Captulo 2 Aplicativo de exemplo 35

    2.4 Criando os layouts de cabealho e rodapN ote que nas figuras que exibem as telas da aplicao tem os dois layouts que foram inseridos no cabealho e no rodap da tela, os quais foram inclu dos no arquivo /res/layout/main.xml u tilizando a tag .

    Vamos verificar o arquivo main.xml novam ente, de forma resumida. N ote que os includes foram feitos antes e depois do DashboardLayout. Im portante n o ta r que nessa tela o DashboardLayout foi configurado com peso = 1 com o atribu to android :layout_ weight="l". Esse atribu to faz com que esse layout seja esticado para ocupar a tela inteira, sendo que ele o nico que possui peso.

    /re s /la y o u t/m a in .x m l

    dnclude layout="@layout/include_header" />

  • 36 Google Android para Tablets

    android:id="|8+id/layoutHeader"

    android:orientation="vertical

    android: layout_width="fill_parent''

    android:layout_height="55dp"

    android: gravity="center"

    android:background="@drawable/shape_header" >

    ( * i /re s /lay o u t/in d u d e _ fo o te r.x m l

    O arquivo de cabealho utiliza o texto @string/titulo, e o arquivo de rodap utiliza a chave gstring/copyright, sendo que am bas ns j criam os an teriorm ente no arquivo /res/values/strings.xml.

    N ote q u e am bos os layouts tam bm utilizam um a im agem de fundo, que so @drawable/shape_header e @drawable/stiape_footer, respectivamente.

    Para cria r essas duas imagens temos um problem a, pois precisam os criar um a imagem b o n ita com um dgrad azul. M as o problem a saber para qual resoluo de tela devem os criar.

  • Captulo 2 Aplicativo de exemplo 37

    Podem os cria r um a im agem para celulares HVGA de 320x480 pixels ou celulares V/VGA de 480x800 pixels, por exemplo. Para isso existem as p as tas / res/drawable-mdpi e /res/drawable-hdpi, respectivamente. M as vam os estudar m ais detalhes sobre isso no capm lo 4.

    N este m om ento, para facilitar a nossa vida, vam os criar um a imagem d in a m icam ente u tilizando o recurso de shapes do A ndroid. Um shape, ou form a se traduzirm os, pode ser do tipo retngulo, oval ou linha. Neste caso, natu ra lm en te , vam os criar um a im agem na forma de um retngulo.

    A vantagem de se utilizar um shape para isso que podem os criar um efeito de gradiente para iniciar em um a cor com tonalidade mais forte e te rm inar em um a tonalidade m ais fraca. Neste caso configuram os o arquivo de cabealho para com ear com um azul opaco e term inar em um azul transparente, e no caso do arquivo de rodap, o contrrio. No A ndroid a notao de cores no form ato ARGB, em que o prim eiro parm etro o alpha, que define a transparncia d a cor.

    (d /res /d raw a b le /sh ap e_h ea d er.x m l

    X

    & /res /d raw a b le /sh ap e _fo o ter.xm l

    Ao inserir esses dois arquivos XM Lna pasta /res/drawable o Android vai criar d inamicam ente um a imagem que representa um retngulo azul e com o efeito gradiente.

    Neste m om ento o projeto vai compilar normalmente e pode ser executado. O resultado ser a tela de dashboard, porm os botes ainda no possuem nenhum evento.

  • 38 Google Android para TabletsP

    2.5 Adicionando os eventos nos botes do dashboardD epois de criarm os o layout do dashboard, vamos atualizar a acdvity Main, que a principal e o ponto de partida de nossa aplicao.

    O que precisamos im plem entar agora so os eventos dos botes para abrir as prxim as telas. Para isso vamos alterar o cdigo-fonte da classe Main conform e dem onstrado a seguir.

    & Main.javapublic dass Main extends Activity impleaents OnClickListener {

    private Button btEsportivos;

    private Button btClassicos;

    private Button btLuxo;

    private Button btSobrej

    gOverride

    public void onCreate(Bundle savedlnstanceState) {

    super.onCreate(savedlnstanceState);

    // Layout do Dashboard

    setContentView(R.layout.main);

    btEsportivos = (Button) findViewById(R.id.btEsportivos);

    btEsportivos.setOnClickListener(this);

    btClassicos = (Button) findView8y!d(R.id.btClassicos);

    btClassicos. setOnClickListener(tnis);

    btLuxo = (Button) findViswById(R.id.btLuxo);

    btLuxo.setOnClickListener(this);

    btSobre = (Button) findViewByld(R.id.btSobre);

    btSobre.setOnClickListener(this);

    }(SOverride

    public void onClick(View v) {

    Intent intent = new Intent(this, TelaListaCarros.class);

    if (v == btEsportivos) {

    intent.putExtra(Carro.TIPO, Carro.TIP0_ESP0RTIV05);

    startActivity(intent);

    } else if (v == btClassicos) {

    intent.putExtra(Carro.TIPO, Carro.TIP0_CLASSIC0);

    startActivity(intent);

    } else if (v == btLuxo) {

    intent.putExtra(Carro.TIPO, Carro.TIP0_LUX0);

    startActivity(intent);

    } else if (v = btSobre) {

    startActivity(new Intent(this, TelaSobre.dass));

    }}

    }

  • ^ T = o A B &

    Captulo 2 Aplicativo de exemplo2 2 9 6 2 3

    N ote que ao pressionar os botes para visualizar a lista de carros estam os utilizando a activity TelaListaCarros, que recebe com o parm etro o tipo do carro selecionado.

    i TelaListaCarros.java

    package br.livroandroid.carros.activity;

    import android.app.Activity;

    import android.os.Bundle;

    import br.livroandroid.carros.R;

    public class TelaListaCarros extends Activity {

    (SOverride

    public void onCreate(Bundle savedlnstanceState) {

    super.onCreate(savedlnstanceState);

    setContentView(R.layout.carros);

    String tipo = getIntent().getStringExtra("tipo);

    // Buscar os carros e mostrar na tela aqui...

    }}

    N o se esquea que precisam os definir essa activity no Androidmanifest.xml da seguinte forma:

    Est o u utilizando o pacote br.livroandroid.carros.activity para as activiries. Consulte o projeto d e e x e m p l o se tiver dvidas e quiser seguir a m e s m a nomenclatura.

    O arquivo de layout da tela que lista os carros pode ser visualizado a seguir. Por enquan to vam os criar ele bem sim ples apenas para o projeto compilar.

    (Si /res /lay o u t/carro s .xm l

    Para o projeto com pilar ainda precisam os criar a classe da activity TelaSobre, que ser cham ada ao clicar no bo to sobre no dashboard.

  • 40 Google Android para Tablets

    i s TelaSobre.javapackage br.livroandroid.carros.activityj

    public d a s s TelaSobre extends Activity {

    }N ote que agora teremos duas novas activities no AndroidManifest.xml, portan to

    no esquea de declar-las.

    N este m om ento, se voc executar a aplicao j ser possvel visualizar a tela inicial com o dashboard, e os botes j esto respondendo, m as vam os continuar e m elho rar ainda mais o aplicativo.

    2.6 A classe CarroO prxim o passo no desenvolvim ento do nosso projeto criar a classe Carro, que ser u tilizada com o o nosso objeto principal, para arm azenar as inform aes de cada carro. Essa classe sim ples e vai conter apenas o nome, a descrio detalhada, u m a URL com a a foto do carro e o u tra URL com o site do fabricante.

    Para que voc possa visualizar o exemplo desde j, vam os ler um XML de um a pgina web para criarm os um a lista de carros que ser exibida em um ListView dentro de nossa aplicao.

    A seguir podem os ver o form ato desse arquivo XML.

    i carros.xm l (este arquivo est na w eb)

    Ferrari

    Ferrari desc

    http://www.livroandroid.com.br/livro/carros/ferrari.htm

    http://www.livroandroid.com.br/livro/carros/iug/ferrariSaAperta.jpg

    C om o vam os fazer a le itu ra desse arquivo XML, a nossa classe Carro precisa p o ssu ir exatam ente os m esm os atribu to s que esto nesse arquivo, conform e d em o n strad o a seguir.

  • Captulo 2 Aplicativo de exemplo 41

    ) Carro.java

    package br.livrandroid.carros.domain;

    import java.io.Serializable;

    public d a s s Carro implements Serializable {

    private static final long serialVersionUID = 6601006766832473959L;

    public static final String KEY = "carro";

    public static final String TIPO = "tipo"j

    public static final String TIP0_CLASSIC0 = "clssicos";

    public static final String TIPO_ESPORTIVOS = "esportivos";

    public static final String TIPO_LUXO = "luxo";

    public String nome;

    public String desc;

    public String urlFoto;

    public String urllnfo;

    } .N ote que a classe im plem enta a interface Serializable para perm itir a serializao

    deste objeto, a fim de facilitar a passagem de parm etros entre as telas. Fizemos isso porque no m om ento em que um carro for selecionado na tela principal, vam os passar o objeto selecionado para a prxim a tela, para recuperar as inform aes e visualizar os detalhes do carro desejado.

    N ote que definim os trs constantes na classe (poderiam ser enums) para diferenciar o tipo do carro selecionado no dashboard , que podem ser carros clssicos, luxo ou esportivos.

    2.7 Arquitetura de integrao com o legadoEm projetos reais voc ter que integrar sua aplicao com algum legado, onde existe um banco de dados com as inform aes que precisam os d isponibilizar no aplicativo.

    Um a dvida com um de desenvolvedores de aplicativos mobile a seguinte: qual a m aneira correta de conectar e buscar inform aes no banco de dados do cliente?

    Na prtica isso no acontece, e o celular no vai conectar d iretam ente no banco de dados, seja por motivos de com plexidade ou at mesm o segurana das informaes.

    Dessa form a a m aneira recom endada de integrao criar algum a pgina ou servio que ser publicado no servidor. Essa pgina pode ser um servlet, ASP ou PHP, qualquer coisa que retorna um arquivo XM L ou JSON. Tente evitar web services (WSDL) tradicionais, pois a integrao m ais trabalhosa.

  • Neste livro vamos optar pelo servidor retornar um simples arquivo XML, o que facilitar o entendim ento do exemplo. Lem bre-se que a vantagem de sua pgina web retornar um arquivo XML ou JSO N que possvel ler essas inform aes no som ente em um sm artphone com A ndroid, mas tam bm em qualquer outro sistema operacional, seja a aplicao m obile ou no.

    Com o im plem entar o servidor est fora do escopo do livro, para facilitar vamos utilizar um sim ples arquivo XML que est publicado no site. _

    Para isso teremos trs arquivos, um para cada tipo de carro.http://www.livroandroid.com.br/livro/carros/carros_esportivos.xml

    http: //www. livroandroid. com. br/livro/carros/carros jrlassicos. xml

    http://www.livroandroid.com.br/livro/carros/carros_luxo.xml

    Entenda que na prtica teram os um a pgina web dinm ica que retom aria um XML com o esse. Possivelmente, em um a aplicao real teram os um site com a adm inistrao do sistema com o cadastro dos carros. Mas para este exemplo vamos ler direto esse arquivo XML.

    2.8 Requisio HTTP para ler o arquivo XMLO prxim o passo fazermos um a requisio H TTP no servidor web para buscar a lista de carros.

    Prim eiram ente vamos criar a es tru tu ra u tilizando o link dos carros esportivos e depois adaptam os para buscar qualquer tipo de carro.

    http://ww w.lw roandroid.co1n.br/Uvro/carros/carros_csportivos.x17d

    Para efetuar a requisio H TTP no servidor web vam os criar a classe HttpHelper conform e dem onstrada a seguir.

    Essa classe bem simples. Ela faz um a requisio do tipo GET no servidor web e converte o retorno para um a string, a qual representa o arquivo XML.

    H ttpH elper.javapackage br.livroandroid.utils;

    public class HttpHelper {

    private static final String TAG = "Http";

    public static boolean L0G_0N = false;

    public static String doGet(String uri, String charset) throws IOException {

    if (L0G_0N) {

    Log.d(TAG, " Http.doGet: " + uri);

    }

    42 Google Android para Tablets

  • Captulo 2 Aplicativo de exemplo 43

    URL u = new URL(url);

    HttpURLConnection conn = (HttpURLConnection) u.openConnectionQ;

    conn.setRequestMethod(GET");

    conn.setDoOutput(true);

    conn.setDoInput(true);

    conn.connect();

    InputStream in = conn.getInputStream();

    String s = IOUtils.toString(in, charset);

    if (L0G_0N) {

    Log.d(TAG, "

  • 44 Google Android paraTablets

    try {

    bos.closeQ;

    in.close();

    } catch (IOException e) {

    Log.e(TAG, e.getMessageQ, e);

    }}

    }}

    Utilizar a classe HttpHelper simples. Basta um a linha de cdigo in form ando a URL do servidor e o charset de retorno do arquivo.

    String xml = HttpHelper.doGet("http://www.livroandroid.coin.br/livro/carros/carros_esportivos.xml",

    "UTF-8");

    S que como temos trs tipos de carros que podem ser selecionados, vamos utilizar um a URL genrica para que funcione independente do tipo do carro desejado.

    http://www.livroandroid.com.br/livro/carros/carros_ltipo]. xm l

    Antes de fazer a requisio, o parmetro {tipo} na URL ser substitu do pelo tipo desejado. O tipo informado ser um a das trs constantes definidas na classe Carro.

    public static final String TIP0_CLASSIC0 = "clssicos";

    public static final String TIP0_ESP0RTIV0S = "esportivos";

    public static final String TIP0_LUX0 = "luxo";

    D epois de ter feito a requisio na web e recuperado o XM L com os carros,precisam os fazer o parser do XML e criar um a lista de carros a p a rtir dele. Paraisso vam os criar outra classe que vai centralizar esse tipo de acesso, sim plificando o cdigo e facilitando a m anuteno do projeto.

    d) CarroService.javapackage br.livroandroid.carros.Service;

    public class CarroService {

    private static final String URL = "http://www.livroandroid.coni.br/livro/carros/carrosJtipo}.xml";

    public static List getCarros(Context context, String tipo) throws IOException {

    String uri = URL.replace("{tipo}, tipo);_

    String xml = HttpHelper.doGet(url, "UTF-8);

    List carros = parserXML(context, xml);

    return carros;

    }private static List parserXML(Context context, String xml) {

    // Fazer o parser do XML e retornar a lista de carros aqui

    return new ArrayList();

    } >

  • Captulo 2 Aplicativo de exemplo 45

    N ote que a classe CarroService faz apenas a requisio no servidor para buscar o XML e cham a o m todo parserXMi^context, xml) para fazer o parser do XML e criar a lista de carros.

    Agora precisam os im plem entar o parser do XML. Para isso vam os criar ou tra classe especializada nesse assunto. Felizmente, as APIs de parser de XML disponveis no Java esto todas nossa disposio no A ndroid, com o as famosas APIs de SAX e DOM . Tam bm podem os inserir com o u m a biblioteca no projeto populares fram eworks de parser XML, com o o JD O M ou o XStream, e utiliz-lo sem problem as.

    Mas nesse projeto vamos criar nossa prpria classe de parser XML bem simples que utiliza a API DOM , do pacote org.w3c.dom. Essa classe pode ser visualizada a seguir.

    XM LUtils.java

    package br.livroandroid.utils;

    import javax.xml.parsers.DocumentBuilder;

    import javax.xml.parsers.DocumentBuilderFactory;

    import org.w3c.dom.Document;

    import org.w3c.dom.Element;

    import org.w3c.dom.Node;

    import org.w3c.dom.NodeList;

    public class XMLUtils {

    // Retorna a tag/n raiz do XML

    public static Element getRoot(String xml, String charset) {

    try {

    InputStream in = null;

    DocumentBuilderFactory factory = DocumentBuilderFactory.newlnstance();

    factory.setValidating(false);

    byte[] bytes = xml.getBytes(charset);

    in = new ByteArraylnputStream(bytes);DocumentBuilder builder = factory.newDocumentBuilderQ;

    Document dom = builder.parse(in);

    Element root = dom.getDocumentElement();

    if (root == null) {

    throw new RuntimeException("XML invalido");

    }return root;

    } catch (Exception e) {

    throw new RuntimeException(e.getHessage(), e);

    }

  • // Retorna o texto dentro da tag

    public static String getText(Node node, String tag) {

    Node n = getChild(node, tag);

    if (n != null) {

    Node text = n.getFirstChild();

    if (text != null) {

    String s = text.getNodeValue();

    return s.trim();

    }}return

    }// Retorna as tags filhas do node informado

    public static List getChildren(Node node, String name) {

    List children = new ArrayList();

    NodeList nodes = node.getChildNodes();

    if (nodes != null 8& nodes.getLengthQ >= 1) {

    for (int i = 0; i < nodes.getLengthQ; i++) {

    Node n = nodes.item(i);

    if (name.equals(n.getNodeName())) {

    children.add(n);

    }}

    }return children;

    }public static Node getChild(Node node, String tag) {

    if (node == null) {

    return null;

    }NodeList childNodes = node.getChildNodes();

    if (childNodes == null) {

    return null;

    }for (int i = 0; i < childNodes.getLength(); i++) {

    Node item = childNodes.item(i);

    if (item != null) {

    String name = item.getNodeName();

    if (tag.equalsIgnoreCase(name)) {

    return item;

    }}

    }return null;

    Google Android para Tablets

  • Captulo 2 Aplicativo de exemplo 47&

    N a tabela 2.1 podem os verificar a explicao de cada m todo d a classe XMLUtils.

    Tabela 2.1 - M todos da classe XMLUtils

    Mtodo Descrio

    getRoot(xml,charset)Inicia o parser do XML e retorna a tag raiz deste. Utilizado no exemplo para recuperar a primeira tag .

    getText(node,charset)Retorna o texto de uma tag, possibilitando a leitura do contedo das tags e , por exemplo.

    getChildren(node, name)Retorna as tags filhas da tag informada. Por exemplo, a tag contm diversas tags filhas . Esse m todo utilizado para retornar a lista com todos os carros do XML.

    getChild(node, tag)Retorna um a tag filha da tag informada. Digamos que dentro da tag seja necessrio ler a tag . Esse m todo utilizado para isso.

    D epois que criam os um a classe especializada em parser XML, podem os com pletar a classe CarroService para fazer o parser da m aneira correta.

    & CarroService.java

    package br.livroandroid.carros.Service;

    public class CarroService {

    private static final String URL = "http://www.livroandroid.com.br/livro/carros/carros_{tipo}.xml";

    private static final boolean LOG_ON = false;

    private static final String TAG = "CarroService";

    public static List getCarros(Context context, String tipo) throws IOException {

    String uri = URL.replace({tipo}", tipo);

    String xml = HttpHelper.doGet(url, "UTF-8'');

    List carros = parserXML(context, xml);

    return carros;

    }private static List parserXMl(Context context, String xml) {

    List carros = new ArrayList();

    Element root = XMLUtils.getRoot(xml, "UTF-8");

    // L todas as tags

    List nodeCarros = XMLUtils.getChildren(root, "carro");

    // Insere cada carro na lista

    for (Node node : nodeCarros) {

    Carro c = new CarroQ;

    // L as informaes de cada carro

    c.nome = XMLUtils.getText(node, "nome");

    c.desc = XMLUtils.getText(node, "desc");

    * c.urlFoto = XMLUtils.getText(node, "url_foto");

    c.urllnfo = XMLUtils.getText(node, "url_info");

    if (L0G_0N) {

    Log.d(TAG, "Carro " + c.nome + " > " + c.urlFoto);

  • 48 Google Android para Tablets

    }carros.add(c);

    }if (LOGON) {

    Log.d(TAG, carros.sizeQ + " encontrados.");

    }return carros;

    }}

    Com a a juda da classe XMLUtils que criam os anteriorm ente foi possvel fazer o parser do X M L e transform -lo facilm ente em um a lista de objetos Carro. O prxim o passo cham arm os esse m todo dentro de nossa activity

    A nteriorm ente criam os a classe TelaListaCarros, que vai u tilizar o arquivo de layout /res/layout/carros.xm l, m as o seu contedo inicialm ente estava vazio.

    Agora podem os alterar essa classe para fazer a busca dos carros na web, onde o parser d o XM L realizado e um a lista de objetos retornada. Para com ear a brincadeira vam os apenas im prim ir os nom es de cada carro, sem exibir nada na tela po r enquanto.

    Tela ListaCarros.java

    package br.livroandroid.carros.activity;

    public class TelaListaCarros extends Activity {

    private static final String TAG = "livroandroid";

    (SOverride

    public void onCreate(Bundle savedlnstanceState) {

    super.onCreate(savedlnstanceState);

    setContentView( R.layout.carros);

    try {

    String tipo = getIntent().getStringExtra("tipo);

    List carros = CarroService.getCarros(this, tipo);

    for (Carro c : carros) {

    Log.i(TAG, "Carro: " + c.nome);

    }} catch (IOException e) {

    Log.e(TAG, e.getMessageQ, e);

    }}

    }

    Essa classe utiliza o arquivo /res/layout/carros.xml, e voc pode criar esse arquivo com q u alq u er layout neste m om ento, pois vam os custom iz-lo posteriorm ente.

  • Captulo 2 Aplicativo de exemplo 49

    Agora vam os executar o exemplo e buscar os carros na internet. Lem bre-se que para isso seu celular deve possu ir um plano com conexo de dados ou estar conectado via Wi-Fi* ou, claro, utilizar o emulador.

    Ao executar esse exem plo podem os visualizar no logCat as seguintes inform aes, com provando que a busca e o parser do XML foram realizadas com sucesso. Lembre-se que as inform aes sobre os carros podem ser alteradas no servidor, pois estarei esporadicam ente atualizando a lista.

    INFO/carros: Carro: Ferrari

    INFO/carros: Carro: Porsche

    INFO/carros: Carro: Lamborghini

    INFO/carros: Carro: Corvette

    INFO/carros: Carro: BMW

    Um problem a grave com a implementao desse exemplo que ele no est utilizando threads. Nesse caso interface de tela vai travar at que a busca seja retornada e talvez o famoso erro A N R (Application N ot Respondmg) possa acontecer. Mas no se preocupe, pois nos prximos tpicos vamos m elhorar a implementao para a correta utilizao de threads. Lembre-se tam bm que ainda no criamos o arquivo /resayaut/carros.xml para a lista de carros, mas faremos isso em breve.

    2.9 Criando um projeto biblioteca para o projetoSe voc seguiu esse exemplo passo a passo, deve ter conseguido im prim ir os nom es dos carros no LogCat. N ote que ainda no fizemos nada visualm ente.

    M as antes de nos preocuparm os em avanar no aplicativo, est na hora de com earm os a organizar os padres utilizados. E recom endado fazer isso logo no incio, correto?

    A prim eira tarefa a se fazer extrair classes utilitrias, como a HttpHelper,XMLUtils e IOUtils, que so um tipo de biblioteca, para outro projeto. O motivo disso bvio: essasxlasses de in fraestru tura sero utilizadas por m uitos projetos posteriorm ente.

    Portanto, vam os criar um projeto A ndroid do tipo biblioteca com os seguintes dados:

    N om e do Projeto: LivroAndroid-AndroidUtils

    Verso: A ndro id 23.x

    Pacote: br.livroandroid.utils

  • 50 Google Android para Tablets

    N o precisa criar nenhum a activity.

    Verso m nim a do SDK: 4 (Android 1.6)

    N ote que no existe nada de mais ao criar este projeto. A nica diferena que no criam os nenhum a activity, um a vez que o objetivo no executar este projeto, e sim utiliz-lo como um a biblioteca para outros.

    Agora vamos mover as classes HttpHelper, XMLUtils e ioutils criadas no projeto dos carros para este projeto que ser nossa biblioteca com classes utilitrias. Para isso vam os criar o pacote br.livroandroid.utils neste projeto.

    Com o resultado devem existir no w orkspace os dois projetos, onde as classes u tilitrias foram corretam ente m ovidas para o projeto biblioteca, conform e dem onstrado na figura 2.9.

    i Hierarchy^

    B~^> vroAndroid-AndroidUtils I B - & src

    B - f f i br.livroandroid.utils ~ 2 | HttpHelper.java " [ Z ) IOUtils.java 0 - [ J ] XMLUtils.java

    $ 3 gen [Generated Java Files] Android 2.3.3 assets

    eS' res^] AndroidManifest.xml |=] default.properties y?| proguard.cfg LivroAndroid-Cap02-Carros

    -

    j|jB br.livroandroid.carros 0 - 0 Main.java fi br,livroandroid.carros.domain - [ J ) Carro.java

    jB br.livroandroid.carros.service

    b -S EESB5B53E Bgen [Generated Java Files]Android 2.3.3assetsresAndroidManifest.xml default.properties proguard.cfg

    Figura 2.9 - Projeto biblioteca sendo criado.

    N ote que, com o movemos as classes para ou tro projeto, obviam ente agora a classe CarroService parou de compilar.

  • Captulo 2 Aplicativo de exemplo 51

    A configurao que est faltando adicionar o projeto LivroAndroid-Androidlltils com o dependncia no projeto dos carros.

    M as antes precisam os configurar o projeto LivroAndroid-AndroidUtils p ara ser um a biblioteca. Portanto, vam os en trar nas propriedades do projeto, e no item de m enu A ndro id vam os selecionar o checkbox Is Librany, conform e a figura 2.10.

    Feito isso o projeto ser transform ando em um tipo de biblioteca e no poder mais ser executado com o um a aplicao norm al. O prxim o passo adicionar essa biblioteca no projeto dos carros. Para isso entre nas propriedades do projeto dos carros no m esm o lugar, mas desta vez clique no bo to Add para adicionar um a dependncia, conform e as figuras 2.11 e 2.12.

    N ote que som ente projetos do tipo biblioteca vo aparecer na lista para serem adicionados com o dependncia.

    N este m om ento o projeto dos carros j possu i a dependncia com o projeto biblioteca que contm as classes u tilitrias, e consequentem ente o p rojeto voltar a com pilar.

    riroid' f-Blalders - Ja v a BuJd Pith

    0 - Java Code Styfe S - Java Correter E - ia v a E d to r . Javadoc Loubcn ' Project References Run/Debug Sttirajs

    S -T skR eoa to ry TaskTags

    E-Vadsbon UddT*it

    ndrGc

    ProjtTaretNmft v.' Vendc^ -^VV-'! 1 Ptotfofw I A P . . . I j

    P I A n ia d 3 ,0 Android Open S o irce Project

    Google APIs Googfe Inc.

    A n d W d l.6 Android Open S0*e Project An*cd2.2 Android Cpen S a r a ProjectO Googe APIs G o o ^ Inc. GALAXYTaAd... SamsungEfectrorcsCo.,Ud. 0 A n d v id 2 .3.3 Android Open S ou xe Pro)t Google APIs Google Inc.

    2 ,2 8 Ltd. 2,2 8

    2.3.3 102.3.3 103,0 11

    Figiira 2.10 - Projeto biblioteca.

  • Google Android para Tablets

    Figura 2.11 - Projeto biblioteca sendo adicionado.

    | type ftertext

    -Resource

    -BuOders Java Build Path

    El- Java Code Style 0 - Java Compilei Eh Java Editor

    Javadoc Loeation Project References

    Refactoring ttstory | Run/Debug Settings

    B Task Repository j Task Tags

    0 - Validation L WikJText

    Android Open Source Project

    Artdroid Open Source Project Google Inc.Samsung Electronics Co., Ltd. Android Open Source Project

    Google Inc.A r t io id Open Soixce Project Google Inc.

    Figura 2.12 - Projeto biblioteca adicionado com sucesso.

  • N ote que desenvolvedores Java esto acostum ados a utilizar a opo Java Build Path nas propriedades do projeto para adicionar dependncias, sejam projetos ou arquivos .jar. Arquivos .jar que possuem as classes de algum fram ework continuam sendo utilizados da mesma forma, mas para adicionar um projeto com o dependncia recom endada a utilizao de um projeto nativo, com o biblioteca do A ndroid, com o dem onstram os aqui. A vantagem de se utilizar um projeto biblioteca que no som ente as classes so com partilhadas, mas tam bm todos os recursos do projeto criados nas pastas /res/valuesjres/layouts e./res/drawable. E sabem os que para gerenciar esses recursos criada um a classe R no projeto biblioteca.

    Sendo assim, com o o pacote do projeto LivroAndroid-AndroidUtils br.livroandroid. utils, sabem os que foi criada a classe br.livroandroid.utils.R.

    Portanto, no projeto carros podem os acessar as classes da biblioteca e m uito mais. E, claro, podem os utilizar a classe br.livroandroid.utils.R, que disponibiliza o acesso a todos os recursos deste projeto!

    Faa o teste e veja que se voc criar imagens, arquivos de layout, textos, an imaes, tem as e m uito mais no projeto biblioteca, tudo agora estar acessvel no projeto dos carros, ou em outro, utilizando a classe br.livroandroid.utils.R.

    Um projeto biblioteca no pode ser executado sozinho. Ele precisa ser utilizado como dependncia em outro projeto.

    Captulo 2 Aplicativo de exemplo 53

    2.10 Criando testes unitrios com JUnitN o desenvolvimento de aplicativos m obile os testes un itrios continuam tendo um a grande im portncia, e no SDK do A ndroid temos disponvel um fram ew ork de testes un itrios que vamos utilizar agora.

    Se voc j utilizou testes unitrios em Java, deve conhecer o popular fram ew ork JU nit. o mesm o que vamos utilizar agora para testar nossas classes e regras de negcio da aplicao dos carros.

    Mas por que testar?

    Para responder a essa pergunta pense no seguinte: Com o que voc pode garan tir que a requisio H TTP no servidor web est lendo e in te rp re tando corretam ente aquele arquivo XML? C om o voc pode garantir que a lista de carros ser corretam ente criada?

  • 54 Google Android para Tablets

    oU m a forma de testar isso executar a aplicao e visualizar os logs com o

    fizemos. Ou, claro, posteriorm ente abrir a tela com a lista de carros e verificar se estes aparecem l. Mas executar a aplicao a todo instante para validar algo to sim ples pode se tornar um processo repetitivo e-desgastante, e tu d o pode ser feito com um simples clique diretam ente do Eclipse.

    Portanto, vamos criar um projeto para testes do tipo AndroidTestProject, confor- -me os dados a seguir. Note que existe um cam po para inform ar qual o projeto que gostaram os de testar, que nesse caso o projeto dos carros criado anteriorm ente.

    N om e d o projeto: LivroAndroid-Cap02-Carros-TestCase

    Projeto para testar: selecione o LivroAndroid-Cap02-Carros

    Verso: Android 23.x

    Pacote: br,livroandroid.carros.test

    Verso m nim a do SDK: 4 (Android 16)

    A figura 2.13 m ostra exatam ente com o esse projeto deve ser criado.

    New Android T est Project O e * M 9 new Android Test Protact resource

    T e fto js tN m s ; |UvroAfidtiid

  • Captulo 2 Aplicativo de exemplo 55

    O projeto de testes no possui nenhum a activity e no ser executado com o um a aplicao norm al. Q uando formos executar um teste no projeto, bas ta selecionar a classe de teste desejada e utilizar o m enu Run As > Android JUnit Test.

    A prim eira e nica configurao im portan te no projeto est no AndroidManifest. xm l. Vamos examin-lo.

  • 56 Google Android para Tablets

    (Si CarrosTestCase.javapackage br.livroandroid.carros.test;

    public d a s s CarrosTestCase extends AndroidTestCase {

    public void testCarrosQ throws IOException {

    Context context = getContextQ;

    List carros = CarroService.getCarros(context,Carro.TIP0_ESPORTIVOS);

    assertNotNull(carros);

    assertTrue(carros.size() > 0);

    Carro d = carros.get(0);

    assertEquals("Ferrari FF", d.nome);

    }}

    O objetivo no explicar o JUnit. Com o ele um fram ew orkjava extremamente popular, vam os apenas utiliz-lo.

    N ote que a classe de teste deve ser filha de android.test.AndroidTestCase para que o am bien te de execuo e todos os objetos m ocks necessrios para a execuo do A ndroid sejam corretam ente inicializados e disponibilizados. A vantagem de fazer isso que agora podem os acessar classes com o a android.content.Context, s quais geralm ente s tem os acesso dentro de um a activity. Isso pode ser feito cham andoo m todo getContext().

    Para executar o teste voc pode selecionar a classe CarrosTestCase e utilizar o m enu Run As > Android JUnit Test. N o JU nit, todos os m todos que com eam com o nom e test sero executados.

    N o teste estam os fazendo a busca e verificando se a lista de carros retornada vlida. A inda estam os validando se o nom e do prim eiro carro Ferrari, pois de conhecim ento do projeto que a Ferrari sem pre ser o prim eiro carro da lista. Caso essa inform ao m ude posteriorm ente, ser necessrio alterar o projeto de teste.

    A figura 2.14 exibe o resultado do teste, com a agradvel te linha verde do JU nit dando-lhe os parabns pela execuo bem -sucedida do teste.

    ~ I - n p ...........

    j~~E testCarros (3,017 s) i testAnckoldTestCseSetupProperfy (0,029 s)

    bi.livtondioid.carros.teslr.CanosTestCase [Rumer: JUn it3 ](3 ,046s)

    Figura 2.14 - Teste unitrio sendo executado.

  • Captulo 2 Aplicativo de exemplo 57

    N ote que poderam os estar pensando em validar vrias regras do sistem a, mas escolhem os u m caso bem simples, p ara sim plificar o exemplo.

    M as m esm o neste caso sim ples podem os verificar os grandes benefcios que alcanam os com esse teste, que so:

    garantim os que a requisio H T T P foi corretam ente efetuada;

    garantim os que o parser do XM L foi corretam ente efetuado;

    garantim os que a criao da lista de objetos Carro foi realizada com sucesso;

    validam os que o prim eiro objeto da lista era o carro Ferrari, como o esperado.

    Tudo isso sem a necessidade de ab rir a aplicao e verificar os carros visualm ente. Fizemos isso com um sim ples clique diretam ente do Eclipse.

    Esse tipo de tcnica bastante popular e pode aum entar, e muito, a produtiv idade do desenvolvimento, um a vez que validaes com o essa podem ser realizadas sem a necessidade de que a aplicao seja executada.

    Agora im agine que seu sistema seja um pouco m aior e que voc utiliza um a conexo H T T P com dados de retorno em XML. De repente, por algum motivoo seu cliente habilita a conexo HTTPS e altera todos os formatos dos arquivos XML, m u d an d o os nom es das tags, po r exemplo. Nesse caso, depois de im plem en tar os novos requisitos, o norm al seria ab rir tela por tela da aplicao para validar se tu d o continua funcionando depois dessa grande m udana.

    M as voc> um desenvolvedor esperto, preocupado com a qualidade de seu projeto, e claro que est u tilizando testes unitrios. E nto depois de efetuar esse g rande refactor no seu aplicativo, basta executar os testes do projeto.

    Isso pode ser feito inclusive todos de um a nica vez, e se voc foi bem -sucedido na alterao do cdigo, visualizar um a linda e gratificante barra verde, o que vai deix-lo seguro, tranqilo e feliz da vida com a alterao. Seu servio por hoje estar term inado, pode ir para casa descansar, pois voc tem certeza de que tu d o est O k.Tudo bem , eu sei que mesmo assim voc vai l abrir a aplicao para ter certeza mesmo. Afinal, eu tam bm fao isso. A gente s acredita no que os olhos enxergam, no ? E, claro, os testes funcionais e de estresse continuam sendo necessrios.

    Existem vrias outras tcnicas de testes no A ndroid e m uitas outras possibilidades. O objetivo aqui foi explicar um a sim ples e vantajosa abordagem . Para maiores detalhes extrem am ente recom endada a leitura da docum entao oficial.

  • 58 Google Android para Tablets

    Lembre-se que o suporte de testes pode ser adicionado a qualquer projeto, inclusive a projetos do tipo bibliotecas. Portanto, o recomendado que os projetos biblioteca como o que criamos anteriormente tam bm sejam testados de alguma forma, para que voc possa garantir que sua infraestrutura e suas principais classes utilitrias esto funcionando perfeitamente.

    2.11 Verificando se existe conexo de dados disponvelUm cuidado que sem pre devem os ter o de garantir que nossa aplicao som ente realizar algum a requisio web se existir algum a conexo ativa no aparelho, como, por exemplo, Wi-Fi ou a conexo de dados da operadora.

    Portanto, vam os criar um a sim ples classe cham ada Androidutils no projeto biblioteca e inserir um m todo que far essa verificao.

    iSd AndroidUtils.java

    package br.livroandroid.utils;

    public class Androidutils {

    protected static final String TAG = "livroandroid";

    public static boolean isNetworkAvailable(Context context) {

    ConnectivityManager connectivity =

    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivity == null) {

    return false;

    } else {

    NetworkInfo[] info = connectivity.getAllNetworkInfo();

    if (info != null) {

    for (int i = 0; i < info.length; i++) {

    if (info[i],getState() == Networklnfo.State.CONNECTED) {

    return true;

    }}

    }}return false;

    }public static void alertDialog(final Context context,final int mensagem) {

    try {AlertDialog dialog = new AlertDialog.Builder(context)

    . setT itle(context. getString(R. string. app_name))

    .setMessage(mensagem)

    .createQ;

  • Captulo 2 Aplicativo de exemplo 59I

    dialog.setButton("OK", new Dialoglnterface.OnClickListenerQ {

    public void onClick(DialogInterface dialogj int which) {

    return;

    } }); dialog.showQ;

    } catch (Exception e) {

    Log.e(TAG,e.getMessage(),e);

    }}

    }

    Para ter acesso ao estado na rede mvel necessrio solicitar a perm isso AC- CESS_NETWORK_STATE. Portanto, vam os adicion-la ao AndroidManifest.xml, to talizando at o m om ento duas perm isses:

    Agora podem os atualizar o nosso exem plo e verificar se tem os um a conexo disponvel antes de realizar a requisio.

    N ote que tam b m colocam os na classe Androidutils um m todo cham ado alertDialog(contextj mensagem) para exibir um a alerta, o qual dispensa com entrios. Esse alerta recebe a referncia de um a m ensagem que vam os inserir no arquivo res/valus/strings.xml para fu tu ra internacionalizao, se necessrio.

    #1 /res /va lues /s trings .xm l

    Conexo indisponvel, por favor ative sua rede mvel ou Wi-Fi.

    Agora que j tem os o cdigo que verifica se existe algum a conexo ativa, vam os atualizar a nossa acvity para buscar os carros norm alm ente, se existir conexo, ou exibir um alerta para avisar ao u surio que sua in ternet est indisponvel.

    s TelaListaCarros.java

    public dass TelaListaCarros extends Activity {

    private static final String TAG = "livroandroid";

    (SOverride

  • 60 Google Android para Tablets

    public void onCreate(Bundle savedlnstanceState) {

    super.onCreate(savedlnstanceState);

    setContentView(R.layout.carros);

    boolean redeOk = AndroidUtils.isNetworkAvailable(this);

    if (redeOk) {

    try {

    String tipo = getIntent().getStringExtra("tipo);

    List carros = CarroService.getCarros(this, tipo);

    for (Carro c : carros) {

    Log.i(TAG, Carro: + c.nome);

    }} catch (IOException e) {

    Log.e(TAG, e.getMessageQ, e);

    }} else {

    AndroidUtils.alertDialog(this, R .string.erro_conexao_indisponivel);

    }}

    }

    Lembre-se que a classe AndroidUtils deve ser inserida no projeto biblioteca que criamos para que durante o. desenvolvimento essas classes utilitrias sejam consolidadas em um nico projeto, que futuram ente servir de biblioteca para m uitas outras aplicaes.

    Tam bm podem os testar se a conexo est disponvel d iretam ente na tela do dashboard e im pedir a entrada na tela que lista os carros, se necessrio.

    M ain .java

    public class Main extends Activity implements OnClickListener {

    gOverride

    public void onCreate(Bundle savedlnstanceState) {

    super.onCreate(savedlnstanceState);

    } __(SOverride

    public void onClick(View v) {

    boolean redeOk = AndroidUtils.isNetworkAvailable(this);

    if (redeOk) {

    Intent intent = new Intent(this, TelaListaCarros.class);

    // Continua normalmente

    } else {

  • AndroidUtils.alertDialog(tHs, R .string.er ro_conexao indisponvel);

    }}

    }

    Depois dessa alterao p o d e m o s testar n o v a m e n te o aplicadvo, e desta vez, se nenhum a conexo de dados esriv e r d isp o n v e l, u m a le rta ser exibido.

    2.12Trabalhando com threadsCada aplicao A ndroid executa so b re um p ro c e sso separado dentro do sistem a operacional, e para cada p rocesso criada u m a n ic a thread dedicada, que tem como principal objetivo co n tro lar a in te r fa c e d a tela.

    recom endado que sem pre q u e fo rm o s ex e cu ta r algum processo dem orado e pesado, com o acesso ao banco d e dados,, le i tu ra de um arquivo ou fazer um a requisio em um servidor vvet, u m a nova ch read seja criada para tom ar conta desse processam ento. Isso n e c e s s r io p a r a q u e a th read de interface fique livre para responder aos prximos e v e n to s g e r a d o s pelo usurio.

    A seguir podem os verificar c ex e m p lo d e b u sc a de carros utilizando corretamente um a thread separada.

    (Si TelaListaCarros.java

    public class TelaListaCarros extends Activity implements Runnable {

    private static final String TAG = "li/roandroid-;

    private ProgressDialog progresso;

    private String tipo;

    (Wverride

    public void onCreate(Bundle savedlnstanceState) {

    super.onCreate(savedInstanceStat)j

    setContentView(R.layout.carros);

    boolean redeOk = AndroidUtils.istetworkAvailable(this);

    if (redeOk) {

    tipo = getIntent().getStringE

  • 62 Google Android para Tablets

    i(iverride

    // Mtodo da Thread

    public void run() {

    try {

    II Busca os carros em segundo planofinal List carros = CarroService.getCarros(this, tipo);

    // Executa o mtodo que atualiza a View na thread e na interface

    runOnUiThread(new RunnableQ {

    (SOverride.

    public void run() {

    for (Carro c : carros) {

    Log.i(TAG, "Carro: " + c.nome);

    }}

    });} catch (IOException e) {

    Log.e(TAG, e.getMessageQ, e);

    Androidutils.alertDialog(this, R. string.erro_io);

    } finally {

    progresso.dismiss();

    }}

    }

    Nesse exemplo um a thread iniciada para buscar os carros. N ote que antes disso a classe ProgressDialog utilizada para exibir ao usurio um a janela de progresso e um a mensagem de aguarde, para avis-lo que a transao pode dem orar alguns instantes.

    O m todo run() principal da thread e faz a busca de carros. Existem duas coisas im portantes que precisam ser lem bradas aqui.

    A