Você está na página 1de 236

Prof. Rogrio C. Santos www.rogeriocs.com.

br

Graduao em S. I. PUC
Mestrado em C. C PUC Prof. Substituto Cefet Izabela Hendrix e Puc Futuro : Prof. Desenvolvimento de Sistemas para Dispositivos Mveis Ps em Desenvolvimento Java Cefet

I2, Stefanini, Tacom, Ilusis, Motorola ...


Experincia em desenvolvimento para dispositivos mveis, C/C++ Palm OS, C/C++ Linux/Unix, C++ Windows, engenharia de software Participante do GTUGBH - http://bh.gtugs.org/ Hobby desenvolvimento de jogos

Rogrio C. Santos

A plataforma Android o produto do Open Handset Alliance.


O grupo, liderado pelo Google, inclui operadores de telefonia mvel, fabricantes de aparelhos portteis,fabricantes de componentes, provedores de plataformas e solues de software e empresas de marketing. A partir de um ponto de vista de desenvolvimento de software, o Android fica bem ao centro do mundo do software livre.
Rogrio C. Santos 3

O primeiro telefone para Android no mercado foi o G1 fabricado pela HTC e fornecido pela T-Mobile O G1 se tornou disponvel aps
quase um ano de especulaes As nicas ferramentas de desenvolvimento de software disponveis eram alguns releases do SDK em constante aprimoramento. Conforme a data de release do G1 se aproximava, a equipe do Android liberou o SDK V1.0 e os aplicativos comearam a aparecer para a nova plataforma.
Rogrio C. Santos 4

J existem vrias softwares stacks de telefonia mvel no mercado, porque interesse no Android?
Assim como plataformas padronizadas PC e Mac, criaram mercado de software de desktop e servidor, o Android, ao fornecer um ambiente padro para aplicativos mveis, criar um mercado para aplicaes mveis.

Rogrio C. Santos

Quais os problemas que o Android minimiza?


Fragmentao Software Stacks Proprietrias Redes fechadas

Rogrio C. Santos

2007 ~70 milhes de smartphones vendidos com grande capacidade de executar aplicaes.
Porm, cada marca tem um ambiente de aplicao diferente. Cada fornecedor montava um conjunto de softwares de terceiros para criar uma plataforma de telefonia mvel vivel. No havia uma menor chance de todos escolherem os mesmo componentes para construir um smartphone.
Rogrio C. Santos 7

O J2ME surgiu para resolver a situao com as recomendaes sem fio (CDC, CLDC MIDP, JTWI, MSA etc) fornecendo um ambiente comum.
Infelizmente, quase todos os dispositivos que suportam J2ME tambm suportam extenses proprietrias limitando a portabilidade.
EX: Nokia, Motorola, Ericsson

Rogrio C. Santos

A maioria dos smartphones existentes usa software stack proprietrias e relativamente fechadas como por exemplo a srie 60 da Nokia com o SO Symbian ou o Windows Mobile.
As alteraes das Stack deveriam ser feitas pelo proprietrio da stack ou pelo fabricante do dispositivo. As softwares stacks no so cdigo aberto
Rogrio C. Santos 9

A maioria dos smartphones baseados em Linux desenvolvidos possuam o kernel aberto.


Porm, mantinham outros detalhes da software stack (framework para criao de aplicaes, framework multimdia e aplicaes) como elementos proprietrios.

Rogrio C. Santos

10

A srie 60 e Windows Mobile permitem a adio de aplicaes de terceiros, mas as operadoras de telefonia frequentemente bloqueiam os telefones para que nenhuma aplicao seja adicionada.
As operadoras afirmam que isso necessrio para preservar a integridade de suas redes mveis, certificando-se de que vrus e spam no sejam inadvertidamente instalados pelos usurios finais.

Rogrio C. Santos

11

O Android inclui um catlogo aberto de aplicaes, o Android Market, que os usurios podem baixar pela rede.
Tambm possvel carregamento de aplicaes direto por meio de USB

Rogrio C. Santos

12

Aliana de Telefonia Mvel Aberta


Inicialmente a unio do Google e mais 33 empresas de tecnologias em 5 de novembro de 2007.
Hoje so mais de 80
http://www.openhandsetalliance.com/

A aliana integra softwares e outras propriedades intelectuais distribudos pelas empresas participantes para os desenvolvedores por meio da comunidade open source.
Rogrio C. Santos 13

O software licenciado por meio da licena Apache v2


http://www.apache.org/licenses/LICENSE-2.0

Licena essencial pois permite que os fabricantes usem , modifiquem o cdigo do Android mantendo o proprietrio ou no.

Rogrio C. Santos

14

Membros Originais (Ainda presentes)


Fabricantes

Operadoras

Semicondutores

Rogrio C. Santos

15

Membros Originais (Ainda presentes)


Software

Comercializao

http://www.openhandsetalliance.com/oha_members.html

Rogrio C. Santos

16

Prof. Rogrio C. Santos www.rogeriocs.com.br

As aplicaes Android so um pouco diferente das aplicaes desktop e servidor


As diferenas so orientadas por conceitos fundamentais e exclusivos do ambiente da telefonia mvel e por objetivos especficos do Google com o Android .

Rogrio C. Santos

18

Ao criar aplicaes, deve-se empregar os seguintes conceitos:


Recursos limitados

Mashups mveis
Aplicaes intercambiveis

Rogrio C. Santos

19

Os celulares atualmente so computadores portteis muito potentes, mas ainda limitados.


A limitao fundamental ainda a capacidade da bateria.
Cada tique do clock, atualizao de memria, pixel que usa iluminao de fundo na tela consome energia.

Rogrio C. Santos

20

A capacidade da bateria limitada e usurios no gostam de carregamento frequentes.


Como resultado, a frequncia dos processadores raramente passam dos MHz A memria RAM, no passa de poucos gigabytes. E o armazenamento de dados, somente algumas dezenas de gigabytes.
Rogrio C. Santos 21

No mundo da Internet em desktop, os mashups facilitam muito a criao de novas aplicaes, reutilizando os dados e os elementos de interface de usurio.
Um timo exemplo o Google Maps.
fcil criar uma aplicao web que incorpore mapas, imagens de satlite e atualizaes de trfego apenas utilizando umas linhas de javascript

Rogrio C. Santos

22

O Android estende esse conceito.


Em outros ambientes mveis, as aplicaes so separadas, voc deve codificar suas aplicaes separadas de outras que estejam em execuo no aparelho.

No Android pode criar facilmente aplicaes que incorporam as existentes.

Rogrio C. Santos

23

Em outros ambientes mveis, as aplicaes so codificadas para acessar dados de provedores especficos.
Ex: Em um aplicativo Windows Mobile para enviar e-mail voc tm que referenciar o Pocket OutLook para enviar seu e-mail. E se o usurio quiser utilizar outro cliente ?

Rogrio C. Santos

24

No Android existe os Intents (Intenes) que o torna independente de aplicaes especficas.


No Android voc no informa que deseja enviar um e-mail por meio de uma aplicao especfica. Voc especfica que quer enviar um e-mail. O Android de encarrega de descobrir qual aplicao pode enviar os e-mail, inicia a aplicao e ento o envia. O usurio pode substituir navegador, MP3 players etc. e o Android se encarrega de se adaptar.
Rogrio C. Santos 25

Prof. Rogrio C. Santos www.rogeriocs.com.br

Rogrio C. Santos

27

O Android usa o linux verso 2.6 para servios essenciais do sistema, como segurana, gerenciamento de memria, gerenciamento de processos, rede e drivers. O kernel do linux tambm funciona como uma camada de abstrao entre o hardware do dispositivo e o resto do conjunto de softwares que so desenvolvidos em paralelo.
Rogrio C. Santos 28

O sistema inclui um conjunto de bibliotecas C/C++ usadas por diversos componentes do Android. Essas bibliotecas permitem trabalhar com arquivos de mdia comuns como MPEG4, H.264, MP3, AAC, AMR, JPG e PNG. Componentes como o Surface Manager permitem a exibio de contedo tanto em 2D como em 3D. H, inclusive, uma biblioteca 3D cuja implementao foi baseada no famoso OpenGL (Open Graphics Library). Basicamente o OpenGL um conjunto de vrias funes que fornecem acesso a praticamente todos os recursos do hardware de vdeo. Para completar, foi disponibilizado tambm o SQLite, um poderoso e leve banco de dados relacional.
Rogrio C. Santos 29

Cada aplicao do Android roda em seu prprio processo e cada processo uma instncia da mquina virtual Dalvik, criada para que o dispositivo possa rodar mltiplas mquinas virtuais eficientemente.
Os arquivos so executados no formato Dalvik Executable (.dex) e so otimizados para ocupar uma pequena fatia de memria. Os arquivos so criados por um compilador Java, que converte o resultado no formato .dex.
Rogrio C. Santos 30

A arquitetura deste framework foi desenvolvida para simplificar a reutilizao dos componentes. Desta forma qualquer desenvolvedor pode construir um aplicativo e disponibilizar suas capacidades, permitindo que elas sejam utilizadas por outros programas. Vale lembrar que o desenvolvedor tem acesso total mesma estrutura de APIs usada nos aplicativos centrais, podendo, desta forma, aproveit-las conforme achar conveniente.
Rogrio C. Santos 31

O Android contm um conjunto de aplicativos centrais como


um cliente de e-mail, programa para SMS (Short Message Service), calendrio, mapas, navegador e gerenciador de contatos.

Tudo feito em Java.


Rogrio C. Santos 32

Os aplicativos Java so escritos em Java.


As classes Java com arquivos de apoio e recursos so combinados em um nico arquivo conhecido como pacote Android.

Os arquivos de pacotes Android tm a extenso .apk.


Este arquivo utilizado para distribuio e instalao destes aplicativos.

Toda aplicao Android roda em um processo Linux prprio.


Este processo criado quando a aplicao iniciada. O processo pode encerrar quando a aplicao no estiver em uso e se o sistema necessitar de recursos. Cada processo roda em uma mquina virtual Dalvik prpria. Isto garante que uma aplicao no ir prejudicar o funcionamento de outras.

Cada aplicao executada com direitos de seu prprio usurio de sistema.


Rogrio C. Santos 33

Prof. Rogrio C. Santos www.rogeriocs.com.br

As aplicaes Android so construdas a partir de 4 tipos bsicos:


Atividades (Activitys) Servios (Service) Receptores de Broadcast e Inteno (Broadcast Receiver , Intents Receiver) Provedores de contedo (Content Providers)
Rogrio C. Santos 35

So comparadas como aplicativos tipo office em desktops.


As atividades so trechos de cdigo que vo e voltam no tempo e so instanciados pelos usurios ou pelo prprio sistema.

Podem interagir com os usurios e solicitar dados ou servios de outras Atividades ou Servios por meio de Intenes.
Rogrio C. Santos 36

A maior parte do cdigo executvel ser executada no contexto de uma Atividade.


As Atividades normalmente correspondem a telas de exibio.
Cada Atividade exibe uma tela para o usurio.

Quando a atividade no estiver ativa ela pode ser eliminada pelo sistema para economizar memria e bateria.
Rogrio C. Santos 37

So semelhantes a deamons nos sistemas servidores ou desktop.


So aplicativos ou trechos de cdigos executveis que geralmente so executados em segundo plano a partir da sua instanciao at o desligamento do dispositivo. Ex: MP3Player
Precisa reproduzir uma fila de arquivos, mesmo quando o usurio passou a usar outra aplicao.

Rogrio C. Santos

38

Respondem s solicitaes de servio de outra aplicao.

Receptores de Broadcast responde a um aviso


global de evento.
Podem ser avisos do prprio Android (ex, bateria baixa) ou em qualquer aplicativo em execuo.

Uma Atividade e ou um Servio fornece a outras aplicaes o acesse sua funcionalidade pela execuo de um Receptor de Inteno.

Rogrio C. Santos

39

Receptor de Inteno um pequeno trecho


de cdigo que responde a solicitaes de dados ou servios de outras Atividades.

A atividade solicitante (Cliente) envia uma Inteno, ficando na responsabilidade do framework decidir qual aplicativo deve receber a solicitao.

Rogrio C. Santos

40

Intenes so elementos essenciais da arquitetura Android.


Facilitam a criao de novas aplicaes a partir das existentes (mashups mveis). So usadas para interao com outras aplicaes e Servios.

Rogrio C. Santos

41

So criados para compartilhar dados com outras Atividades ou Servios.


Um provedor de contedo usa uma interface padro em forma de URI para atender as solicitaes de dados. Ex: Uma aplicao envia uma consulta de dados de contato, ela direciona a consulta para uma URI na forma:
content://contact/people

Rogrio C. Santos

42

O S.O verifica quais aplicaes se registraram como provedor de contedo para determinado URI.
Envia uma solicitao a aplicao adequada (iniciando-a se necessrio)

Caso haja mais de uma registrado com o URI o S.O pergunta ao usurio qual delas usar.

Rogrio C. Santos

43

Uma aplicao no precisa usar todo os componentes do Android.


Mas uma aplicao bem elaborada empregar os mecanismos fornecidos, evitando reinventar funcionalidades. A combinao de URIs e Intenes permite ao Android fornecer um ambiente para o usurio muito flexvel. As aplicaes podem ser facilmente adicionadas, substitudas e excludas, e o fraco acoplamento entre Intenes e URIs mantm um bom funcionamento.

Rogrio C. Santos

44

Prof. Rogrio C. Santos www.rogeriocs.com.br

JDK (Java Development Kit)


http://www.oracle.com/technetwork/java/javase/d ownloads/index.html

Android SDK
http://developer.android.com/sdk/index.html

Eclipse - 3.3 ou Superior


http://www.eclipse.org/downloads/ ADT Plugin

Rogrio C. Santos

46

http://developer.android.com/sdk/index.html

Para facilitar abaixe o executvel do windows.

Rogrio C. Santos

47

Depois do padro Next- Next .

Rogrio C. Santos

48

Accept All Instalar todos as ferramentas do SDK.

Rogrio C. Santos

49

Depois de baixar o zip, descompacte-o em algum lugar de preferncia.


Instalar o ADT
Iniciar o Eclipse
Help -> Install New Software... Clicar em Add
E adicionar o endereo
https://dl-ssl.google.com/android/eclipse/

Clicar em OK

Rogrio C. Santos

50

O Velho
Next-> Next -> Finish

Reinicie o Eclipse

Rogrio C. Santos

51

Selecione Windows -> Preferences


Procure por Android

Rogrio C. Santos

52

Caso esta tela esteja preenchida, o seu Eclipse j est pronto.


Caso contrrio, voc dever selecionar o caminho da instalao em SDK Location.
Para, isso clique em Browse...
e selecione a pasta onde voc descompactou/instalou o SDK do Android.

Depois disso, clique em Apply voc ver a lista de SDKs de Android instaladas em seu micro.

Rogrio C. Santos

53

Para voc testar sua aplicao, voc precisa de um emulador para rodar seus aplicativos.
O AVD (Android Virtual Device) e este emulador. Com o Eclipse Aberto, v em:

Window -> Android SDK and AVD Manager. OU Clique no cone:

Rogrio C. Santos

54

Rogrio C. Santos

55

Na tela aberta, selecione "Virtual Devices" que est do lado esquerdo e clique no boto New.

Name: Meu_AVD Target: Verso do android que deseja emular. E clique no boto "Create AVD".

Rogrio C. Santos

56

Rogrio C. Santos

57

Rogrio C. Santos

58

Carregando...

Rogrio C. Santos

59

Carregando...

Rogrio C. Santos

60

Prof. Rogrio C. Santos www.rogeriocs.com.br

Aqui, vamos criar nosso primeiro programa para entender como:


Criar

Compilar
Testar

Por enquanto no exploraremos a API

Rogrio C. Santos

62

File -> New -> Android Project


Project Name: Hello World Build Target: Android 2.1 Properties: Application Name: Hello World Package Name: com.example.helloworld Create Activity: HelloActivity

Rogrio C. Santos

63

Rogrio C. Santos

64

Executar o projeto:
Projeto ->Run As -> Android Aplication

Rogrio C. Santos

65

Src
Contm os fontes, pacotes Um modelo (template) em Java para a Atividade indicada como existente na aplicao (HelloActivity). Diretrio de referncias de recursos (R.java). Gerado automaticamente pelo plugin.

Bibliotecas Android

assets

Como o nome j diz. Biblioteca com as referncias para criar uma aplicativo. Arquivos que pode integrar na aplicao, no esto sendo usados nesse primeiro projeto.

Rogrio C. Santos

66

Recursos (res)
Drawables
recursos desenhveis, quaisquer imagens, bitmaps, jpegs etc. Em nosso projeto o SDk forneceu o cone padro, que tudo que precisamos no momento. Fornece recursos de layouts que informa ao Android como organizar os itens na tela. Esses recursos so arquivos XML que proporcionam uma certa liberdade na definio de layouts de tela para diferentes finalidades. Em nosso projeto ser utilizado somente o padro gerado pelo SDK.

Layout

Rogrio C. Santos

67

Recursos (res)
Values
Contm os valores, que so constantes, strings etc. disponveis par o usa da aplicao. Mant-los fora dos torna mais fcil a personalizao da aplicao como a adaptao para vrios idiomas.

Manifesto (AndroidManifest.xml)

um arquivo XML que informa ao sistema de compilao o que preciso para criar empacotar sua aplicao. De modo que permita a instalao da aplicao em um celular ou emulador. Falaremos mais adiante.

Rogrio C. Santos

68

Rogrio C. Santos

69

onCreate

Chamado quando sua atividade criada. aqui que normalmente se cria as views, abre qualquer arquivo de dados eu sua atividade precise. O chamar onCreate, o framework recebe um objeto Buldle que contm qualquer estado de atividade salvo na ltima execuo da atividade. Chamado um pouco antes da atividades fica visvel na tela. Quando onStart for concludo, se for possvel que a atividade se torne de primeiro plano na tela, o controle ser transferido para onResume. Se no puder o controle passar para onStop.

onStart

Rogrio C. Santos

70

onResume

A atividade est em primeiro plano e interagindo com o usurio. Tambm chamado quando a Atividade perde o status de primeiro plano para outra atividade, que eventualmente terminar, trazendo a sua Atividade de volta ao estado de primeiro. aqui que sua Atividade pode iniciar (ou retornar) as aes necessrias para atualizar a interface de usurio:
Receber atualizaes de localizaes Executar uma animao. Etc.

Rogrio C. Santos

71

onPause

Este executado quando a aplicao est prestes a ir para o background. A Atividade deixar de ter acesso tela, de modo que voc deve interromper as aes que consumam desnecessariamente bateria, memria e ciclos da CPU. Aqui que se armazena qualquer estado que venha a precisar caso a Atividade volte em primeiro plano. Se acabar a memria do dispositivo ela pode ser escolhida para ser eliminada.
Mas no a garantias que ela volte.

Rogrio C. Santos

72

onStop
Chamado quando sua Atividade no est visvel. Seja porque outra Atividade obteve o primeiro plano ou porque sua Atividade est sendo eliminada.

onDestroy
Ultima oportunidade para que sua Atividade efetue qualquer processamento antes de ser eliminada. Normalmente, esta situao ocorreria porque a Atividade foi concluda e o framework invocou seu mtodo finish. Mas tambm pode ser chamada porque o Android decidiu elimin-la.

Rogrio C. Santos

73

Como os recursos so diferenciados em XML e JAVA?


Recurso Java R.layout.main R.drawable.icon R.string.hello XML @layout/main @drawable/icon @string/hello

res/layout/main.xml res/drawable-hdpi/icon.png <string name="hello">

Rogrio C. Santos

74

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

Rogrio C. Santos

75

A primeira linha especifica a codificao XML. O elemento manifest define o nome do pacote Android e verso do aplicativo.
versionCode um nmero inteiro representando a verso do aplicativo. Para que permita o upgrade ou downgrade do aplicativo. versionName uma string representando a verso de modo que o usurio entenda.

O elemento application define qual o cone da aplicao, e o label com o nome da aplicao.
Tambm podemos definir temas da aplicao.
Rogrio C. Santos 76

O elemento activity define a principal atividade que ser chamada quando o aplicativo iniciar.
name nome da atividade. No exemplo foi usado .

.HelloActivity.

O normal usar o nome completo com.example.helloworld.HelloActivity, mas o pacote j foi definido no manifest.

label define o nome que ser mostrado quando a atividade estiver ativa.

Rogrio C. Santos

77

O elemento intent-filter informa ao sistema quais seus recursos.

Pode ter vrias aes, categorias etc. No exemplo a nossa atividade recebeu a ao "android.intent.action.MAIN que significa que ela a atividade principal. E est categorizada como

"android.intent.category.LAUNCHER" que deve ser


inicializada e ficar ativa.

O elemento uses-sdk define qual verso de API necessria para executar minha aplicao.
Rogrio C. Santos 78

Criar uma nova aplicao Mudar o texto que aparece na tela. Mudar o nome da aplicao.

Rogrio C. Santos

79

Vamos entender melhor como o ciclo de vida de uma Atividade. Vamos acrescentar em nosso cdigo, os mtodos referentes @Override aos estados.
protected void onStart() { super.onStart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); }

Rogrio C. Santos

80

Para conseguimos visualizar cada estado vamos utilizar a classe Toast.

Toast uma classe que contm uma view para mostrar pequenos textos na tela para usurio. import android.widget.Toast; Sintaxe:
Toast.makeText(this, Texto", Toast.LENGTH_SHORT).show();

Rogrio C. Santos

81

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show(); } @Override protected void onStart() { super.onStart(); Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show(); } @Override protected void onResume() { super.onResume(); Toast.makeText(this, "onResume", Toast.LENGTH_SHORT).show(); } @Override protected void onRestart() { super.onRestart(); Toast.makeText(this, "onRestart", Toast.LENGTH_SHORT).show(); } @Override protected void onPause() { Toast.makeText(this, "onPause", Toast.LENGTH_SHORT).show(); super.onPause(); } @Override protected void onStop() { Toast.makeText(this, "onStop", Toast.LENGTH_SHORT).show(); super.onStop(); } @Override protected void onDestroy() { Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show(); super.onDestroy(); }
Rogrio C. Santos 82

Rode a aplicao
Quando a aplicao iniciar quais mtodos so executados? Quando clicar em back , quais mtodos so executados? E em home ? Chame a aplicao novamente, quais mtodos so executados?

Rogrio C. Santos

83

Prof. Rogrio C. Santos www.rogeriocs.com.br

Para expor atividades na tela, utilizamos views e viewgroups.


Views
Uma view uma instncia de android.view.View. uma estrutura de dados que define o layout e o contedo de uma determinada rea retangular na tela. Um objeto View gerencia o layout, o tamanho, desenho, mudana de foco, scrolling e eventos para a rea de tela que ele representa. A classe View serve de base para um conjunto de elementos de tela interativos chamados widgets.
Widgets podem ser
Text, EditText, InputMethod, MovementMethod, Button, RadioButton, Checkbox e ScrollView.

Rogrio C. Santos

85

Viewgroups

Um viewgroup uma instncia de Viewgroup, e lhe permite montar uma UI mais complexa, atravs de uma estrutura. Ou seja, ele contm e gerencia views e outros viewgroups. A classe Viewgroup serve como base para layouts, um conjunto de subclasses que provem tipos comuns de layouts de tela. Os layouts lhe permitem montar uma estrutura para um conjunto de views.

Rogrio C. Santos

86

A interface de uma atividade montada como uma rvore, onde cada nodo uma view ou viewgroups.
Voc pode montar uma, utilizando o conjunto de widgets pr-definidos oferecidos pelo Android ou tipos de view que voc mesmo definiu.

Rogrio C. Santos

87

Para associar uma rvore tela para renderizao, sua atividade chama setContentView() e passa a referncia ao nodo raz. Uma vez que o Android possui esta informao, ele pode trabalhar diretamente com o nodo para invalidar, medir e desenhar a rvore.

Quando sua atividade se torna ativa e recebe o foco, o sistema notifica sua atividade e solicita ao nodo raiz para medir e desenhar a rvore.
O nodo raiz ento solicita que seu filhos de desenhem e assim por diante. Sendo assim, cada viewgroup tem a responsabilidade de medir o espao disponvel, distribuir seus filhos e chamar Draw() em cada filho para deixar que ele se renderize. Os filhos podem solicitar um tamanho e uma posio para seu pai, mas o pai quem tem a palavra final de quo grande cada filho pode ser.

Rogrio C. Santos

88

Toda classe viewgroup utiliza uma classe aninhada que estende ViewGroup.LayoutPara ms.
Esta subclasse contm propriedades que definem apropriadamente o tamanho e a posio para aquela viewgroup.

Rogrio C. Santos

89

Todas as viewgroups possui altura(height) e largura(width).


Muitos ainda incluem margens(margin) e bordas(border). Voc pode especificar exatamente a largura e a altura (embora com frequncia voc no vai querer fazer isso).

Mais comumente voc vai pedir para sua view se dimensionar de acordo com seu contedo ou tornar-se to grande quanto o objeto que a contm permitir.

Rogrio C. Santos

90

AbsoluteLayout: Permite especificar a localizao dos objetos filhos em relao ao pai na exata medida (por exemplo, pixeis). FrameLayout: Layout que funciona como uma moldura para exibir um nico objeto. Gallery: Uma exibio horizontal de imagens, com scroll, a partir de uma lista vinculada. GridView : Exibe uma grade de m colunas e n linhas, com scroll. LinearLayout: Um layout que organiza seus filhos em uma nica linha horizontal ou vertical. Ele cria uma barra de rolagem se o comprimento da janela excedeu o tamanho da tela. ListView: Exibe uma lista simples com scroll.

PopupList: Uma lista popup de elementos com uma borda.


RelativeLayout: Permite especificar a localizao dos objetos filhos relativamente, uns com os outros (filho A esquerda do filho B) ou ao pai (alinhado com a parte superior do pai). ScrollView : Uma coluna de elementos, com scroll. Spinner : Exibe um nico item de cada vez a partir de uma lista vinculada, dentro de uma caixa de texto de uma linha. SurfaceView: Fornece acesso direto a uma superfcie de desenho dedicada. Pode alocar views em camadas no topo da superfcie, mas indicado para aplicaes que precisam desenhar pixeis ao invs de widgets. TabHost: Fornece uma lista com guia seleo que monitora os cliques e permite a aplicao mudar a tela sempre que uma guia selecionada. TableLayout: Um layout tabulado com um nmero arbitrrio de linhas e colunas, cada clula com um item de sua escolha. As linhas se redimensionam para caber a maior coluna. As bordas das clulas no so visveis. ViewFlipper: Uma lista que exibe um item por vez, dentro de uma caixa de texto de uma linha. Pode ser configurado para trocar items em intervalos de tempo definidos, como um slide show. ViewSwitcher: Mesma coisa que o ViewFlipper
Rogrio C. Santos 91

Os seguintes so os views groups mais comuns que voc vai usar nas suas aplicaes.
FrameLayout LinearLayout TableLayout AbsoluteLayout RelativeLayout

Rogrio C. Santos

92

o objeto de layout mais simples.


um espao em branco na sua tela aonde voc pode alocar um objeto. Todos os elementos filhos so pendurados no canto superior esquerdo da tela;

<FrameLayout xmlns:android="http://schemas.android.co m/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> </FrameLayout>

voc no pode especificar uma posio para um filho de um FrameLayout. Depois, os filhos sero simplesmente desenhados sobre os anteriores, cobrindo-os parcialmente ou totalmente (a menos que o objeto mais novo seja transparente).

Rogrio C. Santos

93

Alinha todos os seus filhos em uma nica direo, verticalmente ou horizontalmente. Todos os filhos so posicionados um depois do outro. Ento uma lista vertical ter apenas um filho por linha, no importando o quo grandes elas sejam,
<LinearLayout android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:layout_height="fill_parent" android:orientation="vertical"> </LinearLayout>

e uma lista horizontal ir ter apenas a altura de uma linha (a altura do mais alto filho).

LinearLayout respeita margens entre filhos, e tambm gravidade [alinhamento de um filho para a direita (right), esquerda (left) ou centro (center)].

Rogrio C. Santos

94

Tambm suporta a atribuio de um peso para um filho em especial.


Este valor permite que seus filhos se expandam para cobrir qualquer espao restante na tela.

Filhos especificam um valor de peso, e o espao restante ser atribudo a estes filhos de acordo com o peso especificado por cada um.
O peso padro 0. Ento se por exemplo existem 3 caixas de texto, e duas delas declaram possuir um peso de 1, duas delas vo se expandir igualmente para cobrir o espao restante, enquanto a terceira ocupar apenas o espao necessrio.

Rogrio C. Santos

95

Os dois formulrios seguintes representam um LinearLayout com um conjunto de elementos: um boto, alguns labels e algumas caixas de texto.

As caixas de texto tm suas larguras definidas como FILL_PARENT (preencher o pai). Outros elementos esto definidos como WRAP_CONTENT (envolvimento de contedo, ou seja, apenas o espao necessrio).

Rogrio C. Santos

96

No primeiro formulrio a caixa de texto relacionado a Comentrios tem peso no definido (0 por padro);
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Add"></Button> <TextView android:id="@+id/textView1" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:text="Nome" android:layout_gravity="left"></TextView> <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> <TextView android:id="@+id/textView2" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:text="Comentrios"></TextView> <EditText android:id="@+id/editText2" android:layout_width="fill_parent" android:layout_height="wrap_content"></EditText> </LinearLayout> Rogrio C. Santos 97

No segundo formulrio a caixa de texto relacionado a Comentrios tem peso definido como 1.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Add"></Button> <TextView android:id="@+id/textView1" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:text="Nome" android:layout_gravity="left"></TextView> <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content"/>

android:layout_weight="1"

<TextView android:id="@+id/textView2" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:text="Comentrios"></TextView> <EditText android:id="@+id/editText2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"></EditText> </LinearLayout>
Rogrio C. Santos 98

Se as caixas Nome e Comentrio fossem definidas com peso 1 elas teriam o mesmo tamanho.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Add"></Button> <TextView android:id="@+id/textView1" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:text="Nome" android:layout_gravity="left"></TextView> <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"/> <TextView android:id="@+id/textView2" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="wrap_content" android:text="Comentrios"></TextView> <EditText android:id="@+id/editText2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"></EditText> </LinearLayout> Rogrio C. Santos

android:layout_weight="1"

android:layout_weight="1"

99

TableLayout posiciona seus filhos em linhas e colunas.


Consiste de um nmero de objetos TableRow, cada um definindo uma linha (atualmente, voc pode ter outros filhos, isto ser explicado adiante). No exibem bordas nas linhas, colunas ou clulas. Cada linha tem 0 ou mais clulas;
Cada clula pode conter um objeto View. A tabela tem tantas colunas quanto a linha com o maior nmero de clulas. Uma tabela pode possuir clulas vazias. Clulas no podem ser mescladas, como pode ser realizado com HTML.

Rogrio C. Santos

100

<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:id="@+id/button1" android:layout_height="wrap_content" android:text="Add" android:layout_width="wrap_content"></Button> </TableRow> <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="Nome" android:id="@+id/textView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"></TextView> <EditText android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/editText1" android:layout_weight="1"> <requestFocus></requestFocus> </EditText> </TableRow> <TableRow android:id="@+id/tableRow3" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:text="Comentrios" android:id="@+id/textView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge"></TextView> <EditText android:id="@+id/editText2" android:layout_height="wrap_content" android:layout_weight="1" android:layout_width="fill_parent"></EditText> </TableRow> </TableLayout> Rogrio C. Santos 101

Permite que seus filhos especifiquem exatamente as coordenadas x / y para exibio na tela. Margens no so suportadas, e a sobreposio de elementos permitida (embora no seja recomendvel).
Google recomenda no utilizar AbsoluteLayout a menos que voc tenha boas razes para us-lo, porque ele bem rgido e no funciona de acordo com visores de diferentes dispositivos.
Onde (0,0) canto superior esquerdo, e os valores aumentam conforme voc move para baixo ou para a direita.

Rogrio C. Santos

102

<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Button" android:layout_x="110dp" android:layout_y="18dp"></Button> <EditText android:layout_x="57dp" android:layout_height="wrap_content" android:id="@+id/editText1" android:layout_y="128dp" android:layout_width="172dp"> <requestFocus></requestFocus> </EditText> <TextView android:text="Nome" android:id="@+id/textView1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_x="101dp" android:layout_y="81dp"></TextView> <TextView android:text="Comentrios" android:id="@+id/textView2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_x="82dp" android:layout_y="208dp"></TextView> <EditText android:layout_height="wrap_content" android:layout_width="126dp" android:id="@+id/editText2" android:layout_x="68dp" android:layout_y="261dp"></EditText> </AbsoluteLayout>

Rogrio C. Santos

103

Permite que seus filhos especifiquem suas posies relativas a cada um (especifica por ID), ou a seu pai. De forma que voc pode alinhar dois elementos a direita ou por um seguido do outro ou ainda centralizados na tela. Elementos so renderizados na ordem dada.
Ento se o primeiro elemento centralizado na tela, os outros elementos sero alinhados relativamente ao centro da tela.

Rogrio C. Santos

104

Se usado XML para especificar este layout, um elemento referenciado deve ter sido listado antes que voc o referencie.
O exemplo a seguir mostra o RelativeLayout como elementos visvel e invisivelmente delineados. O objeto de layout raiz um objeto RelativeLayout.
Rogrio C. Santos 105

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignRight="@+id/textView1" android:text="Add"></Button> <EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:layout_below="@+id/textView1" android:layout_width="fill_parent"></EditText> <TextView android:text="Nome" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_below="@+id/button1" android:layout_alignParentLeft="true" android:layout_marginTop="20dp"></TextView> <TextView android:text="Comentrios" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_centerVertical="true" android:layout_alignLeft="@+id/button1"></TextView> <EditText android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_width="fill_parent"></EditText> </RelativeLayout> Rogrio C. Santos 106

Quando adiciona elementos em um RelativeLayout algumas novas propriedades aparecem.


Propriedades relacionadas ao LayoutParams.
subclasse de RelativeLayout para todos os elementos nesta tela, pois todos os elementos so filhos de um RelativeLayout. width, height, below, alignTop, toLeft e marginLeft.

Os parmetros de um RelativeLayout so:

Note que alguns destes parmetros suportam valores relativos a outros filhos por isso o nome RelativeLayout. Isto inclui as propriedades toLeft, alignTop e below, os quais indicam que o objeto deve estar a esquerda, ao topo ou abaixo, respectivamente.

Rogrio C. Santos

107

Como criar uma ViewGroup pelo Eclipse.


Click Boto direito no projeto -> New ->Other

Rogrio C. Santos

108

Selecione Android XML File -> Next

Rogrio C. Santos

109

Nome do arquivo.
Tipo de arquivo a ser criado (Layout). Lugar que ele ser salvo. Tipo de Layout (LinearLayou).

Rogrio C. Santos

110

Rogrio C. Santos

111

Rogrio C. Santos

112

Referenciando os objeto da tela


Declarando os objetos Button btOk; EditText edText; TextView txtResposta; Referenciando edText = (EditText) findViewById(R.id.edText); btOk = (Button) findViewById(R.id.btOk); txtResposta = (TextView) findViewById(R.id.txtResposta);

Rogrio C. Santos

113

Para que o boto execute alguma funcionalidade necessrio especificar um listener para ele. Criando um listener:
private OnClickListener lstOk = new OnClickListener() { //Quando executar o que ? Click? }; private OnClickListener lstOk = new OnClickListener() { @Override public void onClick(View v) { //O que queremos executar } };

Setando o listener no boto


btOk.setOnClickListener(lstOk );

Rogrio C. Santos

114

Quando clicar no boto queremos copiar o texto do edittext para o textView?


Ento devemos copiar chamando os mtodos de cada componente.
Nomes bem sugestivos.
private OnClickListener lstOk = new OnClickListener() { @Override public void onClick(View v) { txtResposta.setText(edText.getText()); }

};

Rogrio C. Santos

115

Crie o boto limpar

Ele deve limpar o Edit e o TextView.

Crie uma nova aplicao chamada MiniCalculadora.

Dever conter os nmeros de 0 a 9 (botes) Somente calcula Soma e Subtrao (1 boto para cada operao) Um boto de resultado (=) Um boto de Limpar (Limpar os 2 edits). Permite no mximo um nmero de 4 dgitos. Deve usar um edittext para o valor digitado Outro que contm o valor antigo e o operador vide figuras.

Rogrio C. Santos

116

Obs: O EditTExt somente trabalha com strings.


Rogrio C. Santos 117

O Android conta com vrias Widgets por padro.


Falaremos aqui das principais.

Rogrio C. Santos

118

Todas as tags do Views no Android tem suporte ao atributo id, com ele que conseguimos acessar nossa tela aps renderiz-la.
As declaraes de novos ids devem comear com @+id/ e depois disso damos o valor que vai ser o id.
<TagQualquer android:id="@+id/iddesejado" />

Rogrio C. Santos

119

O TextView usado para exibir texto para o usurio, assim como o JLabel do Swing.
Podemos controlar sua aparncia e tamanho pelo XML, basta modificar os atributos na tag TextView, alguns desses atributos so:
android:text: valor ser o texto do componente; android:textColor: O valor da cor no formato #RRGGBB em hexadecimal, a cor do texto; android:textSize: Tamanho da fonte, deve ser indicado em px, ex: 12px; android:textStyle: Style do texto (bold, italic); android:background: Uma cor no formato #RRGGBB ou um drawable;

Rogrio C. Santos

120

Alguns atributos so valores pr-defenidos como os do android:textStyle, mesmo assim, ainda possvel usar mais de um valor no atributo, aqui que entra o operador pipe |.
Por exemplo, se quisermos o texto em negrito usamos bold, em itlico usamos o valor italic, mas se quisermos que o texto seja negrito+itlico, podemos usar o pipe juntando os dois: bold|italic.
Rogrio C. Santos 121

Enquanto o TextView exibe texto como um JLabel, quem oferece ao usurio um campo para ele colocar texto o EditText (assim como o JTextField) que filho de TextView. Este componente no declara nenhum atributo novo, mas usa os do TextView, a diferena que ele realmente permite edio. Para tornar ele editvel ou no, usamos o atributo android:editable com true ou false (true o default).
O TextView mesmo com true no permite edio.
Rogrio C. Santos 122

um simples boto com algo escrito assim como o JButton.


atravs dele que o usurio sabe que alguma ao ser realizada quando clicar. Button e EditText estendem TextView e compartilham os atributos de texto.

Rogrio C. Santos

123

um boto que permite ao usurio alternar entre as opes marcado/desmarcado.


Ele tambm estende TextView, e o valor atribudo em android:text o texto visvel ao lado do CheckBox.
<CheckBox android:id="@+id/checkBox1" android:text="CheckBox" android:layout_height="wrap_content" android:layout_width="177dp"></CheckBox>

Rogrio C. Santos

124

JavaCode
CheckBox check = (CheckBox) findViewById(R.id.checkBox1); check.isChecked() Verifica se o checkbox est marcado. check.setChecked(boolean); Marca/desmarca via cdigo. Se tiver necessidade de executar alguma tarefa ao clicar no CheckBox , deve-se criar um listener, com tratamento de click. check.setOnClickListener(lstCheck);
private OnClickListener lstCheck = new OnClickListener() { @Override public void onClick(View v) { // Tarefa } };

Rogrio C. Santos

125

ToggleButton so botes como o CheckBox, mas indicam marcado/desmarcado com uma luz invs do efeito de desenho de um tick.
O atributo android:text no tem efeito nesse componente, por padro o texto alternado entre ON e OFF, sendo possvel usar os atributos como color, style, size e etc.. para modificar a aparncia desse texto. Esse componente tem dois atributos a mais para sua tag.
android:textOn: O texto que ser exibido quando estado for ON android:textOff: O texto que ser exibido quando estado for OFF
<ToggleButton android:text="ToggleButton" android:id="@+id/toggleButton1" android:layout_height="wrap_content" android:layout_width="wrap_content"> </ToggleButton>

Rogrio C. Santos

126

So botes como o CheckBox que permitem marc-lo, mas no possvel desmarc-lo.


Para se obter o efeito de seleo nica, necessrio adicionar eles dentro de um RadioGroup.
<RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content"> <RadioButton android:id="@+id/radioButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Op1"></RadioButton> <RadioButton android:id="@+id/radioButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Op1"></RadioButton> </RadioGroup>

Rogrio C. Santos

127

ListView um ViewGroup que mostra uma lista de itens.


Os itens so automaticamente inseridos na listas utilizando um ListAdapter. Vamos ver como isso funciona no exemplo a seguir.

Rogrio C. Santos

128

Criar um novo projeto.


Nome : HelloListView

Adicione o ListView no main.xml Vamos definir o layout de cada item da lista


Criar res/layout/list_item.xml
Projeto->New->Other->Android XML File ... Pg 27
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:textSize="16sp" > </TextView>
Rogrio C. Santos 129

Insira o seguinte cdigo no mtodo onCreate().

super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView lv = (ListView) findViewById(R.id.listView1); lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item,COUNTRIES)); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(),((TextView)view).getText(), Toast.LENGTH_SHORT).show(); } });

Crie Tambm um atributo esttico como a lista de elementos

private static final String [] COUNTRIES = { "Brazil", "Argentina","Mexico" };

Rogrio C. Santos

130

O ArrayAdapter o responsvel por administrar os elementos a serem renderizados na tela. Foi criado um listener que imprime o texto referente ao item clicado.
Ns criamos nosso layout R.layout.list_item, mas poderamos usar um j pr-definido como por exemplo

android.R.layout.simple_list_item_1.
Rogrio C. Santos

131

No exemplo, criamos uma lista hard-coded.


Se for uma lista fixa, sem adio de elementos, isso no uma boa prtica. Ento, poderamos cri-la como um array externo em forma de recurso.
Projeto->New->Other->Android XML File
File: list Tipo: Values
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="countries_array"> <item>Brazil</item> <item>Argentina</item> <item>Mxico</item> </string-array> </resources>

Rogrio C. Santos

132

Para utilizar o recurso, usamos o exemplo mostrado abaixo:

String[] countries = getResources().getStringArray(R.array.countries_array); setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, countries));

Rogrio C. Santos

133

Utilizando nossos conhecimentos, faam o programa a seguir:

Adicione um EditText e um Button

O programa permite que o usurio digite um novo pas. E o adicione na lista atravs do click no boto. Use List<String> no lugar de String [] Crie ArrayAdapter como um atributo da atividade. O mtodo notifyDataSetChanged() do array adapter notifica a view quando mudou algum valor na lista.

Dicas:

Rogrio C. Santos

134

Prof. Rogrio C. Santos www.rogeriocs.com.br

Um intent uma descrio abstrata de uma operao a ser executada.


Permite que uma aplicao selecione um Atividade com base na ao que deseja invocar e nos dados em que operam.

Pode ser considerada uma maneira em alto nvel de comunicao entre processos.

Rogrio C. Santos

136

Os objetos Intent so transmitidos de processo a processo, usando mtodos como startActivity e startActivityForResul.
A prpria classe Intent fornece construtores, accessor e outro utilitrios para manipular o contedo de um objeto Intent. Um conjunto importante de accessor so aqueles chamado de putExtra.

Possui vrios mtodos com mesmo nome mas argumentos diferentes. Permitindo anexar dados extra a uma Inteno. Esses dados podem ser usado para comunicao entre processos.

Rogrio C. Santos

137

Exemplo de como chamar a lista de contatos.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/")); startActivity(intent);

Chamar o primeiro elemento da lista.


Uri.parse("content://contacts/people/1"));

Posso simplesmente ter acesso ao telefone assim?


No, devemos pedir permisso a aplicao.

Rogrio C. Santos

138

Ento devemos pedir as permisses.


As permisses so inclusas no nosso AndroidManifest.xml
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

READ_CONTACTS: permite que a aplicao leia os dados da lista de contato.

Rogrio C. Santos

139

Chamar um browser e executar uma URL.

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.rogeriocs.com.br")); startActivity(intent);

Permisso
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Chamar a cmera.
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivity(intent);

Permisso
<uses-permission android:name="android.permission.CAMERA"></uses-permission>

Rogrio C. Santos

140

Discar um nmero.
Chamar um nmero.
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:(+49)12345789")); startActivity(intent);

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:(+49)12345789")); startActivity(intent);

Permisses
<uses-permission android:name="android.permission.CALL_PRIVILEGED"></uses-permission> <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

CALL_PHONE: permite iniciar uma chamada telefnica sem a necessidade do usurio confirmar. CALL_PRIVILEGED: inclui chamadas de emergncias.

Rogrio C. Santos

141

Recebendo o resultado de uma Atividade.


Vamos chamar nossa cmera.
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent, 0);

Utilizamos o startActiveForResult, que responsvel por pedir a Atividade chama que nos responda.
O 0 um valor escolhido para saber se foi a Atividade que chamamos que est nos respondendo.

Rogrio C. Santos

142

Para capturarmos a reposta devemos criar um mtodo que receber essa resposta.
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_CANCELED && requestCode == 0) { Toast.makeText(this, "Cancelado" , Toast.LENGTH_LONG).show(); } }

Recebemos a resposta quando cancelamos a cmera. public class HelloIntentsActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent, 0); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if (resultCode == Activity.RESULT_CANCELED && requestCode == 0) { Toast.makeText(this, "Cancelado" , Toast.LENGTH_LONG).show(); } } } Rogrio C. Santos 143

Como uma aplicao normalmente possui vrias telas, como faramos para cham-las e conversar entre elas?
Cada tela est relacionada a um Atividade e cada Atividade um novo processo.

Ento significa que a conversa entre telas uma conversa entre processos, tem algo haver com que foi visto?
Rogrio C. Santos 144

Sim, claro.
Vamos entender atravs de um exemplo. Vamos criar um novo projeto.

Rogrio C. Santos

145

Criar duas telas

Rogrio C. Santos

146

Criar duas Atividades.


A principal que se relaciona com a primeira tela. Normalmente j criada pelo plugin.

Criar a segunda Atividade (um classe comum que estende Activity). E deve se relacionar com a segunda tela.
Como? Lembre-se do mtodo setContentView()?

Rogrio C. Santos

147

Ex: Tela Principal

public class HelloActivitysActivity extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btTela2=(Button) findViewById(R.id.btTela2); } }

Segunda Tela
public class Tela2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tela2); } }

Rogrio C. Santos

148

Criar um listener para o boto da primeira tela.


Ex:
public class HelloActivitysActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btTela2=(Button) findViewById(R.id.btTela2); btTela2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { } }); } }

Rogrio C. Santos

149

O que devo colocar no click do boto?


A chamada da segunda tela. Como? Usando um intent.

Intent i = new Intent(getApplicationContext(), Tela2.class); startActivity(i);

getApplicationContext(): retorna o contexto da sua aplicao. Tela.Class: Referncia a qual Atividade queremos chamar. S isso funciona? Ainda no.

Rogrio C. Santos

150

Devemos registrar nossa Atividade no AndroidManifest.

<activity android:name="Tela2"> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity>

Isso deve ser feito para que a aplicao conhea sua atividades e a ao dessa atividade.

Rogrio C. Santos

151

Formato do seu AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.activitys" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloActivitysActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="Tela2"> <intent-filter> <action android:name="android.intent.action.VIEW"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> </application> </manifest>

Rogrio C. Santos

152

Tenho 2 atividades, como identifico qual a principal?


Isso configurado no AndroidManifest atravs da ao.
<action android:name="android.intent.action.MAIN" />

S se tem um MAIN em um aplicao.

Normalmente o VIEW usado para chamar as outras Atividades.


<action android:name="android.intent.action.VIEW"></action>

Rogrio C. Santos

153

Execute sua aplicao.


Quando for chamada a outra tela, para voltar a tela anterior pressione o boto de voltar O acontece se eu colocar as duas Atividades como VIEW? E como MAIN ?

Rogrio C. Santos

154

Agora vamos enviar um texto de uma tela a outra.

Rogrio C. Santos

155

Adicione o EditText na tela principal.


Ao clicar no boto capture o contedo do EditText. A novidade, agora voc deve inserir no intent o valor que deseja enviar. Como?
Com o putExtra.
intent.putExtra(nome, valor);

Rogrio C. Santos

156

Como fica no nosso exemplo:


Intent i = new Intent(getApplicationContext(), Tela2.class); String str = edText.getText().toString(); i.putExtra("texto", str); startActivity(i);

Como eu recebo o dado na outra Atividade?


Intent i = getIntent(); String str = i.getStringExtra("texto"); if(str!=null) { txt.setText(str); }

Rogrio C. Santos

157

public class HelloActivitysActivity extends Activity { EditText edText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btTela2=(Button) findViewById(R.id.btTela2); edText = (EditText) findViewById(R.id.edText); btTela2.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { Intent i = new Intent(getApplicationContext(), Tela2.class); String str = edText.getText().toString(); i.putExtra("texto", str); startActivity(i); }
}); }

public class Tela2 extends Activity { TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tela2); txt = (TextView) findViewById(R.id.txtView); Intent i = getIntent(); String str = i.getStringExtra("texto"); if(str!=null) { txt.setText(str); }
}

Rogrio C. Santos

158

Prof. Rogrio C. Santos www.rogeriocs.com.br

Rogrio C. Santos

15 9

Mesmo que voc tenha um bom conhecimento de programao e da Arquitetura Android, no significa que todas suas aplicaes rodaro de primeira.
Felizmente, o Eclipse e o SDK fornecem ferramentas de depurao e at alguns recursos que facilitam a criao do cdigo correto.

Rogrio C. Santos

160

Depurador do Elipse
LogCat Ponte de Depurao (ADB) DDMS TraceView

Rogrio C. Santos

161

O Eclipse fornece um depurador em nvel de cdigo-fonte que o SDK do Android conecta ao bytecode em execuo no Dalvik.
De modo que voc obtenha toda a capacidade de depurao que normalmente esperaria de um programa Java em execuo.

Rogrio C. Santos

162

Como us-lo. Vamos utilizar o nosso aplicativo anterior.


Crie um break point no inicio do onCreate da Atividade principal.
Execute Run -> Debug-> Android Applications Ou

Quando entrar em modo de Depurao a tela do eclipse mudar. Quem j est acostumado com o eclipse.

Rogrio C. Santos

163

Rogrio C. Santos

164

Os painis que aparecem so:


Debug
Mostra o rastreamento de uma execuo recente. Permite Continuar (Resume), suspender (Suspend), concluir (Terminate), avanar dentro do mtodo (Step Into), avanar sem entrar no mtodo (Step Over), avanar fora do mtodo (Step Return) etc.

Variables e BreakPoints Variables (Variveis) a mais importante.

Pode-se ver o contedo do valor atual das variveis que esto em escopo.

Rogrio C. Santos

165

Editor
Um guia com cada arquivo-fonte que j havia sido aberto na perspectiva Java. Permite visualizar no fonte aonde est o ponto de execuo do depurado. Mostra a estrutura de sua aplicao. Contm guias para cada uma destas visualizaes. A Console a mais til, e em algumas situaes podem contem informaes importantes.

Outline

Console/Tasks/Properties

Rogrio C. Santos

166

LogCat
As informaes obtidas foram bastantes diretas mas a maioria das aplicaes no so to simples como esse. Muito problemas so difceis de isolar e resolver. O Android fornece um recurso e log genricos que pode ajudar em muito desses problemas mais complexos.

H um painel LogCat na perspectiva de depurao e tambm da perspectiva DDMS (veremos mais adiante).

Rogrio C. Santos

167

Visualizando log de nossa aplicao.


Vamos utilizar a classe Log.
Log.d() Debug Log.e() Error Log.I() Inf Log.w() Warning Sintaxe: Log.d(TAG,MENSAGEM); TAG: Usada para identificar qual classe/atividade/servio est enviando o log.
Conveno para usar:
private static final String TAG = "MyActivity";

Rogrio C. Santos

168

Inclua logs utilizando a classe Log e toda sua aplicao.


Aonde se deseja que seja impresso informaes uteis da execuo do aplicativo.
Ex:
Log.d(TAG, "Entrou no onCreate"); Log.d(TAG, Saiu do onCreate");

Execute as aplicao e visualize o LogCat.

Rogrio C. Santos

169

Existe muita informao, como possvel encontrar algo til? Android fornece alguns filtros teis para a aplicao no arquivo de log. Na barra de ferramentas voc encontra os smbolos V,D,I,W e E. Eles restringem o escopo de mensagens exibidas, do seguinte modo

Rogrio C. Santos

170

V (Detalhado ou Verbos)
D (Depurao)
Mostra tudo Mostra informaes de depurao,informao,aviso e erro. (Por enquanto idntico a V) Mensagem de informao, aviso e erro.

I (Informaes) W (Warnings) E (Erros)

Mensagens de aviso e erro.


Mensagens apenas de erros.

Rogrio C. Santos

171

As colunas exibidas pelo log so:


Hora
Hora que a entrada do log foi realizada. Um dos tipos de entrada de log da lista anterior (D,I,W, E) Identificao do processo linux que est fazendo a entrada.

Prioridade (A coluna no nomeada) Pid

Tag

Uma identificao curta descrevendo a origem da entrada.


A entrada do log.

Mensagem

Rogrio C. Santos

172

Na tela de LogCat:
Filter : Permite filtrar o log com o texto digitado. cria um filtro, pode ser criado por pid de um processo. A linha abaixo um exemplo de como encontrar o pid de sua aplicao.
08-17 18:16:35.667: INFO/ActivityManager(62): Start proc com.activitys for activity com.activitys/.HelloActivitysActivity: pid=996 uid=10027 gids={}

Rogrio C. Santos

173

Android debug Bridge um utilitrio especial de depurao via linha de comando.


Ele permite controlar um dispositivo ou emulador a partir de seu host. Oferecendo um tipo de servio shell remoto ou terminal remoto.

Rogrio C. Santos

174

Para ativ-lo execute adb no console (windows) ou terminal (linux).

Rogrio C. Santos

175

O cliente se comunica com um servidor de adb que executado em segundo plano.


Se o servidor no estiver em execuo quando voc iniciar o cliente, este iniciar o servidor. O servidor se comunica com os deamons adb executados em um dispositivo ou em um emulador.
Tudo ocorre via TCP/IP.

Rogrio C. Santos

176

Comandos uteis
adb devices adb shell
Exibe uma lista de dispositivos que o servidor adb reconhece. Conecta a um shell em execuo no destino e fornece um prompt. um shell unix-like que permite comandos como ls,cat,rm,os etc. sqlite3 [caminho_para_o_bd]
Acessa uma base de dados. Veremos mais frente.

adb install [-l] [-r] arquivo.apk

Instalar ou reinstalar uma aplicao

-l bloqueia a aplicao no permitindo ser copiado para outro dispositivo -r reinstala sem substituir os dados

Rogrio C. Santos

177

Comandos uteis
adb uninstall [-k]
Desinstala a uma aplicao. Deve ser usado o nome completo do pacote em a extenso .apk.
adb uninstall com.pacote.MinhaApp

Rogrio C. Santos

178

DDMS: Dalvik Debug Monitor Service integrado ao Eclipse proporcionando uma interface orientada a janelas. Obtm informaes de depurao especfica do Android relativas ao dispositivo de destino. A perspectiva e acessado atravs do boto DDMS.

Rogrio C. Santos

179

Rogrio C. Santos

180

Devices
Lista de dispositivos de destino conectados ao Eclipse e os processos em execuo em cada um deles. O emulador rotulado com seu nmero de porta (5554)

Threads mostra as threads atualmente ativas no cliente selecionado.


Para habilitar deve clicar no boto UpdataThreads

Threads/Heap/File Explorer

Rogrio C. Santos

181

Threads/Heap/File Explorer

Heap mostra o estado da memria de heap da VM e atualizada a cada coleta de lixo.


Para habilit-la deve-se clicar no boto Update Heap.

FileExplorer

Para forar a coleta de lixo clique em Cause GC , na tela Heap. Mostra as pastas do dispositivo selecionado.

Rogrio C. Santos

182

Captura de tela
Captura e exibe o contedo mostrado atualmente no dispositivo.
possvel salvar em formato PNG.

Emulator Control (Controle de Emulador)


Fornece controle de emulao de Telefonia e Localizao.

Rogrio C. Santos

183

Um utilitrio que permite analisar como os mtodos dentro das classes esto interagindo. Rastrear o tempo relativo dedicado execuo de cada mtodo.
Ele consiste de duas partes:
Uma que habilitada antes de executar E uma que empregada aps a execuo para diagnosticar suas descobertas.

Rogrio C. Santos

184

Coleta de dados em tempo de execuo.

possvel ativar e desativar logs em sua aplicao. Quando ativados, determinadas rotinas so vinculadas sua aplicao, criando um arquivo de rastreamento binrio no dispositivo. O arquivo de trace, registra cada instanciao de mtodo e o tempo gasto em cada mtodo.

Anlise de rastreamento (Trace analysis)

Mostra graficamente os dados do arquivo binrio criado. Possibilitando uma analise mais apurada.

Rogrio C. Santos

185

Coleta de dados de rastreamento.

As rotinas de coleta de dados de rastreamento so fornecidas no SDK. O que precisa fazer :


Importar o pacote de Debug (android.os.Debug) para sua aplicao Chamar startMEtodTracing quando desejar comear a coletar informaes de rastreamento. Chamar stopMethod quando tiver concludo. Se tiver executando em um dispositivo necessrio inserir um SD. Se tiver em um emulador dever ser criado um SD virtual.

As rotinas registram as informaes um SD.

Rogrio C. Santos

186

Criando um SD virtual V para o console:


mksdcard -l ANDROID 1024M nome_arquivo Adicione o SD em seu emulador.
Opo SD Card
File: Localizao do arquivo.

Rogrio C. Santos

187

Modifique seu cdigo para permitir o trace.


import android.os.Debug; public class HelloActivitysActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Debug.startMethodTracing("mytrace"); } @Override protected void onDestroy() { super.onDestroy(); Debug.stopMethodTracing(); } }

Inclua permisso de escrita no SD Card


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Rogrio C. Santos

188

Copie o arquivo de trace para host (PC)


Digite no console:
adb pull sdcard/mytrace.trace mytrace.trace

Executando o traceview
No console digite:
traceview caminho_completo/mytrace.trace
Mesmo que esteja na raiz deve digitar o caminho completo.

Rogrio C. Santos

189

Rogrio C. Santos

190

Baseado na aplicao de lista anterior crie uma nova Aplicao que.


Tenha uma tela principal que ir chamar 2 outras telas.
Cadastrar e, Visualizar. A Cadastrar faz um cadastro de um item na lista. A Visualizar mostra a lista os itens cadastrados.
Caso esteja vazia mostre uma mensagem que a lista est vazia. (Use Toast)

Dica: Use uma lista esttica.

Rogrio C. Santos

191

Rogrio C. Santos

192

Prof. Rogrio C. Santos www.rogeriocs.com.br

Aplicaes mais complexas normalmente necessitam de algum tipo armazenamento de dados. Dependendo da situao, diferentes tipos de armazenamentos de dados podem ser utilizados.
Veremos 2 tipos de armazenamentos utilizados no Android:
Shared Preferences SqLite Databases

SharedePreferences uma interface que a aplicao pode usar para salvar dados de forma rpida e eficiente. Os dados so salvos em um arquivo XML no dispositivo.
Se a aplicao com.curso.app criar uma shared preference, o sistema Androis ir salvar o arquivo em no diretorio/data/data/com.curso.app/shared_prefs

O dado em Shared Preference salvo em par nome-valor.


usualmente utilizado para gravar dados simples da aplicao como configuraes, temas, login e senha etc.

O acesso a Shared Preferences feito atravs das Atividades (Activitys), utilizando getPreferences() e getSharedPreferences().

getPreferences()
Utilizado quando no necessrio vrios arquivos. No especificado o nome.

getSharedPreferences().
Permite criar vrios arquivos. Especifica o nome do arquivo.

Exemplo:

Gravando dados

SharedPreferences prefs = getSharedPreferences("myDataStorage",MODE_PRIVATE); Editor mEditor = prefs.edit(); mEditor.putString("username","datastorageuser1"); mEditor.putString("password","password1234"); mEditor.commit();

- Somente a aplicao tem acesso ao arquivo XML. MODE_WORLD_READABLE - Qualquer aplicao pode ler o arquivo XML. MODE_WORLD_WRITEABLE - Qualquer aplicao pode escrever no o arquivo XML.
MODE_PRIVATE

Lendo dados:
SharedPreferences prefs = getSharedPreferences("myDataStorage",MODE_PRIVATE); String username = prefs.getString("username", ""); String password = prefs.getString("password", "");

Exemplo:
Vamos persistir nossa lista.
void saveData() { SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit(); StringBuilder sb = new StringBuilder(); int i; for (i = 0; i < countries.size(); i++) sb.append( ((i == 0) ? "" : ";") + countries.get(i)); spe.putString("countries", sb.toString()); spe.commit(); } void loadData() { SharedPreferences sp = getPreferences(MODE_PRIVATE); String countryList = sp.getString("countries", "Argentina;Brazil;Mexico"); for (String country : countryList.split(";")) countries.add(country); }

. . . private OnClickListener lstAdd = new OnClickListener() @Override public void onClick(View v) { String str = edText.getText().toString(); countries.add(str); saveData(); adapter.notifyDataSetChanged(); } }; @Override public void onCreate(Bundle savedInstanceState) { ... loadData(); ... adapter = new ArrayAdapter<String>(this, R.layout.list_item,countries); ... }

Android fornece um gerenciador de banco de dados chamado SQlite.


SQLite um banco de dados relacional e permite execuo de comandos SQL. Cada aplicao que usa o SQLite tm sua prpria instncia do banco. Que por padro somente pode ser acessado pela aplicao. O banco de dados armazenado em /data/data/<package_name>/databases

DbHelper

SQLiteOpenHelper fornece funcionalidades para gerenciar criao e atualizao do banco de dados.

public class DbHelper extends SQLiteOpenHelper { public DbHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }

DbHelper
public DbHelper(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); }

O banco inicializado pelo construtor. Onde ele deve receber o contexto da aplicao, nome do banco de dados e a verso.
A verso que determina se onCreate() ou onUpgrade() sero executados.

As tabelas so adicionadas no onCreate() usando comandos SQL:


create table mytable(key_id integer primary key autoincrement, pais text not null);

public class DbHelper extends SQLiteOpenHelper { private String CREATE_TABLE="create table mytable(key_id integer primary key autoincrement, pais text not null);"; . . . @Override public void onCreate(SQLiteDatabase db) { Log.v("DBhelper onCreate","Creating all the tables"); try { db.execSQL(CREATE_TABLE); } catch(SQLiteException ex) { Log.v("Create table exception", ex.getMessage()); } } . . .

Vamos criar uma nova Classe chamada MyDb, que contm uma instncia do SQLiteDatabase e do nosso DbHelper.
Essa classe ser responsvel por conversar com o nosso banco.
MyDb() cria uma instncia DbHelper open() criar uma instncia do SQLiteDatabase utilizando nosso DBHelper e abre a conexo com o banco. close() fecha conexo com o banco. insert() insere um novo elemento na tabela. getPaises() l os dados relacionado aos pases da tabela e os salva um objeto Cursor e o retorna.

public class MyDB { private SQLiteDatabase m_db; private final Context m_context; private final DbHelper m_dbhelper; private final String DBNAME="MYDB"; private final int VERSION=1; public MyDB(Context cx) { m_context = cx; m_dbhelper = new DbHelper(m_context,DBNAME, null,VERSION); } public void close() { m_db.close(); } public void open() throws SQLiteException { try { m_db = m_dbhelper.getWritableDatabase(); } catch(SQLiteException ex) { Log.v("Open database exception caught", ex.getMessage()); m_db = m_dbhelper.getReadableDatabase(); } } public long insert(String pais) { try{ ContentValues newValue = new ContentValues(); newValue.put("pais",pais); return m_db.insert("mytable", null, newValue); }catch (SQLiteException ex) { Log.v("Insert into database exception caught",ex.getMessage()); return -1; } } public Cursor getPaises() { Cursor c = m_db.query("mytable", null, null,null, null, null, null); return c; } }

Em nossa Atividade vamos instanciar um objeto MyDB.


... MyDB m_dba; ... @Override public void onCreate(Bundle savedInstanceState) { . . . m_dba = new MyDB(this); m_dba.open(); ...

Vamos inserir no banco o novo dado.


. . . @Override public void onClick(View v) { String str = edText.getText().toString(); m_dba.insert(str); . . .

Eu quero mostrar uma alerta quando o dado for vazio e quando o dado for inserido com sucesso.

AlertDialog dialog = new AlertDialog.Builder(m_context).create(); dialog.setMessage("Dado inserido com sucesso!"); dialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {}}); dialog.show();

Agora como recuperar os dados do banco.


public void loadData() { Cursor c = m_dba.getPaises(); if(c.moveToFirst()) { do { countries.add(c.getString(c.getColumnIndex("pais"))); }while(c.moveToNext()); } c.close(); }

Agora eu quero modificar o nome de um Pas como eu fao?


Reutilizando nossa cdigo, vamos criar uma lista de key_ids. E Adicionar todo key_id nesta lista.
... List<Integer> lstIds; ... public void loadData() { Cursor c = m_dba.getPaises(); countries.clear(); lstIds.clear(); if(c.moveToFirst()) { do{ countries.add(c.getString(c.getColumnIndex("pais"))); lstIds.add(c.getInt(c.getColumnIndex("key_id"))); }while(c.moveToNext()); } c.close();

Depois vamos criar uma nova tela (Atividade) que permite atualizar e deletar o registro. Nesta tela ter um
EditText que recebera o texto a ser modificado. Boto de atualizar. Boto de deletar.

@Override protected void onCreate(Bundle savedInstanceState) {


public class Editar extends Activity { EditText edPais; Button btUp,btDel; MyDB m_dba; EntityPais m_ePais; private OnClickListener lstEvento = new OnClickListener() { @Override public void onClick(View v) { if(v==btDel) { m_dba.delete(m_ePais); } else if (v==btUp) { String str = edPais.getText().toString(); m_ePais.setNome(str); m_dba.update(m_ePais); } finish(); } }; super.onCreate(savedInstanceState); setContentView(R.layout.edit); Intent intent = getIntent(); if(intent==null) finish(); int id = intent.getIntExtra("id", 0); m_dba = ListDbActivity.getDba(); btUp = (Button) findViewById(R.id.btUpdate); btDel = (Button) findViewById(R.id.btDel); edPais = (EditText) findViewById(R.id.edPais); btUp.setOnClickListener(lstEvento); btDel.setOnClickListener(lstEvento); try { setDado(id); } catch (Exception e) { Log.d("Editar", e.getMessage()); finish(); }

private void setDado(int id) throws Exception { m_ePais = new EntityPais(); m_ePais.setId(id); Cursor c = m_dba.getPais(m_ePais); if(c.moveToFirst()) { String str = c.getString(c.getColumnIndex("pais")); m_ePais.setNome(str); edPais.setText(str); c.close(); } else { c.close(); throw new Exception("Dado no encontrado."); }
}

Vamos adicionar nosso 2 novos mtodos na classe MyDB.


Responsveis por deletar e atualizar o registro
public long update(EntityPais pais) { try{ ContentValues newValue = new ContentValues(); newValue.put("pais",pais.getNome()); return m_db.update("mytable", newValue, "key_id="+pais.getId(),null); }catch (SQLiteException ex) { Log.v("Update into database exception caught",ex.getMessage()); return -1; } } public long delete(EntityPais pais) { try{ return m_db.delete("mytable","key_id="+pais.getId(),null); }catch (SQLiteException ex) { Log.v("Delete into database exception caught",ex.getMessage()); return -1; } }

Agora devemos comunicar a tela principal com a tela de edio/deleo.


No evento do clique da lista, voc deve capturar qual o nome clicado e retornar seu id correspondente.
String str = ((TextView)view).getText().toString(); int tam = lstIds.size(); for (int i = 0; i < tam; i++) { if(countries.get(i).equals(str)){ Intent intent = new Intent(getApplicationContext(),Editar.class); intent.putExtra("id", lstIds.get(i)); startActivity(intent); break; } }

Prof. Rogrio C. Santos www.rogeriocs.com.br

Basicamente um jogo contm:


Imagens (Sprites) Msicas Enredo ou Histria Interface Regras I.A Controles

Tem como objetivo:


Divertir, Entreter Ensinar Trabalhar com habilidades Desenvolver novas Habilidades

Rogrio C. Santos

217

Gameplay a interao entre jogador e o jogo por meio de suas regras desafios e objetivos. Tambm conhecido como mecnica do jogo.
Exemplo: PacMan
3 nveis (fcil,mdio e difcil) e 10 fases Desafio: Comer as bolinhas sem ser pego pelos fantasmas Objetivos: Comer todas as bolinhas para passar de fase.

Rogrio C. Santos

218

Casuais
Puzzle

Jogos rpidos, curtos normalmente com controles simples. Jogos estilo tetris. Corrida, plataforma (Mario, Sonic), tiro e tiro em primeira pessoa. Jogos de estratgia. Neste estilo o jogador dever impedir que os inimigos atinjam determinado alvo. Explora as novas funcionalidades do celular como GPS e a cmera.

Ao e Arcade Games
Tower-defense

Inovao

Rogrio C. Santos

219

Todo jogo roda em um loop e basicamente contm os seguintes passos:


Processar eventos do usurio Processar lgica do jogo Desenhar na tela.

Rogrio C. Santos

220

Estrutura do jogo.
HelloGameActivity <Activity>

JetGame <ArcadeGame>

onDraw()

ArcadeGame <View>

Invalidate view Main Loop (Thread)

Rogrio C. Santos

221

Nossa classe base para criar os jogos.


public abstract class ArcadeGame extends View

Toda view deve ter um construtor para receber o context do aplicao e tambm um conjunto de atributos para serem processados corretamente pelo sistema.
public ArcadeGame(Context context) { super(context); m_context = context; }

public ArcadeGame(Context context, AttributeSet attrs) { super(context, attrs); m_context = context; }

Rogrio C. Santos

222

Sobrecarregamos o mtodo onLayout(). chamado pelo layou quando a view necessita de atribuir o tamanha e as posies de cada filho.
protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); try { // Init game initialize(); /** * start update task. Which will fire onDraw in the future */ startUpdateTimer(); } catch (Exception e) { // bug e.printStackTrace(); } }

ai que iniciamos o jogo e o loop principal.

Rogrio C. Santos

223

A classe que corresponde ao jogo.


public class JetGame extends ArcadeGame

Os mtodos abaixo capturam os eventos de teclado no Android.


public boolean onKeyUp(int keyCode, KeyEvent event) public boolean onKeyDown(int keyCode, KeyEvent event)

Rogrio C. Santos

224

O mtodo onDraw() chamado quando de deseja desenhar a tela.

Ele recebe um objeto Canvas que responsvel por desenhar objetos na tela. O Canvas possui vrios mtodos para desenhar na tela como bitmaps (imagens), figuras e texto.
Ex:
drawPoint(flaot x, float y,Paint paint) drawBitmap(Bitmap bitmap, float topLeftX, float topLeftY, Paint paint);
Desenha uma imagem na tela, na coordenada X,Y. Desenha um simples ponto na coordenada X,Y e usa um estilo de desenho com o Paint, null usa o estilo padro.

Rogrio C. Santos

225

Chamando nossa view na Atividade.

public class HelloGameActivity extends Activity { JetGame game; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); game = new JetGame(this); // Full screen getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(game); game.setFocusable(true); game.setFocusableInTouchMode(true); } ...

Rogrio C. Santos

226

Vamos agora entender como manipular um toque na tela.


Ao sobrecarregar o mtodo onTouchEvent em nossa classe JetGame j temos o controle de toque na tela. No exemplo, qualquer toque executa o boto de tiro.
@Override public boolean onTouchEvent(MotionEvent event) { if ( event.getAction() == MotionEvent.ACTION_DOWN){ fireKey(); } return true; }

Rogrio C. Santos

227

Vamos mover nossa nave via toque.


@Override public boolean onTouchEvent(MotionEvent event) { int tx = (int)event.getX(); int ty = (int)event.getY(); // Has the ship been touched. if so move it if ( tx >= spShip.x && tx <=spShip.x + spShip.w && ty >= spShip.y && ty <= spShip.y + spShip.h){ spShip.y = ty - (spShip.h/2); if(spShip.y>height-spShip.h) { spShip.y = height-spShip.h; } else if(spShip.y<yScoreSize){ spShip.y = yScoreSize; } } else if ( event.getAction() == MotionEvent.ACTION_DOWN){ fireKey(); } return true; }
Rogrio C. Santos 228

Trabalhando com acelermetros.

O acelermetro reporta a acelerao da gravidade exercida pela terra em 3 eixos de acelerao.


Rogrio C. Santos 229

No Android, para trabalhar com o acelermetro devemos implementar a interface SensorEventListener e registrar nosso novo listener.
Essa interface possui dois mtodos
public void onSensorChanged(SensorEvent event); public void onAccuracyChanged(Sensor sensor, int accuracy);

Rogrio C. Santos

230

onSensorChanged
chamado quando ocorre um novo evento no acelermetro.

onAccuracyChanged chamado quando ocorre mudana na preciso do acelermetro.

Rogrio C. Santos

231

Para registrar nosso listener, primeiramente devemos checar se existe um acelermetro instalado.
Para isso necessrio pegar uma instncia do SensorManager.
SensorManager manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

Agora checamos se existe um acelermetro.


Pode existir mais de 1.
if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0)

Rogrio C. Santos

232

Ento, se existe acelermetro vamos registrar nossa classe como listener.

Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0); manager.registerListener(this, accelerometer,SensorManager.SENSOR_DELAY_GAME);

Rogrio C. Santos

233

Modificaremos nossa classe do jogo para estender a AracadeGameSensor


public class JetGame extends ArcadeGameSensor

E implementar o mtodo responsvel por manipular os dados recebidos pelo acelermetro.


protected void sensorChanged(float accelX, float accelY, float accelZ) { spShip.y+=accelY; if(spShip.y>height-spShip.h) { spShip.y = height-spShip.h; } else if(spShip.y<yScoreSize){ spShip.y = yScoreSize; } }

Rogrio C. Santos

234

O melhor jeito de testar o acelermetro e usando um dispositivo. Porm, existe um aplicativo que ajuda a fazer os testes usando o emulador.
http://code.google.com/p/openintents/wiki/Sensor Simulator

Rogrio C. Santos

235

http://developer.android.com/
Desenvolvimento de Aplicaes Android , Rick Rogers, John Lombardo,Zigurd Mednieks Blake Meike O REILLY Novatec The Android Developer's Cookbook: Building Applications with the Android SDK (Developer's Library), James Steele, Nelson To Addison-Wesley
Rogrio C. Santos 236

Você também pode gostar