Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Rogrio C. Santos
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
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
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
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
Licena essencial pois permite que os fabricantes usem , modifiquem o cdigo do Android mantendo o proprietrio ou no.
Rogrio C. Santos
14
Operadoras
Semicondutores
Rogrio C. Santos
15
Comercializao
http://www.openhandsetalliance.com/oha_members.html
Rogrio C. Santos
16
Rogrio C. Santos
18
Mashups mveis
Aplicaes intercambiveis
Rogrio C. Santos
19
Rogrio C. Santos
20
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
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
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
Podem interagir com os usurios e solicitar dados ou servios de outras Atividades ou Servios por meio de Intenes.
Rogrio C. Santos 36
Quando a atividade no estiver ativa ela pode ser eliminada pelo sistema para economizar memria e bateria.
Rogrio C. Santos 37
Rogrio C. Santos
38
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
A atividade solicitante (Cliente) envia uma Inteno, ficando na responsabilidade do framework decidir qual aplicativo deve receber a solicitao.
Rogrio C. Santos
40
Rogrio C. Santos
41
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
Rogrio C. Santos
44
Android SDK
http://developer.android.com/sdk/index.html
Rogrio C. Santos
46
http://developer.android.com/sdk/index.html
Rogrio C. Santos
47
Rogrio C. Santos
48
Rogrio C. Santos
49
Clicar em OK
Rogrio C. Santos
50
O Velho
Next-> Next -> Finish
Reinicie o Eclipse
Rogrio C. Santos
51
Rogrio C. Santos
52
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:
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
Compilar
Testar
Rogrio C. Santos
62
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
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
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
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
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
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
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.
Os seguintes so os views groups mais comuns que voc vai usar nas suas aplicaes.
FrameLayout LinearLayout TableLayout AbsoluteLayout RelativeLayout
Rogrio C. Santos
92
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
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
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
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
Rogrio C. Santos
108
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
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 } };
Rogrio C. Santos
114
};
Rogrio C. Santos
115
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
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
Rogrio C. Santos
123
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
Rogrio C. Santos
127
Rogrio C. Santos
128
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(); } });
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
Rogrio C. Santos
132
Rogrio C. Santos
133
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
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
Rogrio C. Santos
138
Rogrio C. Santos
139
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);
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
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
Rogrio C. Santos
146
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
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
Rogrio C. Santos
149
getApplicationContext(): retorna o contexto da sua aplicao. Tela.Class: Referncia a qual Atividade queremos chamar. S isso funciona? Ainda no.
Rogrio C. Santos
150
Isso deve ser feito para que a aplicao conhea sua atividades e a ao dessa atividade.
Rogrio C. Santos
151
<?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
Rogrio C. Santos
153
Rogrio C. Santos
154
Rogrio C. Santos
155
Rogrio C. Santos
156
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
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
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
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
Rogrio C. Santos
168
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.
Rogrio C. Santos
171
Tag
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
Rogrio C. Santos
174
Rogrio C. Santos
175
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.
-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/Heap/File Explorer
Rogrio C. Santos
181
Threads/Heap/File Explorer
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.
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
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.
Mostra graficamente os dados do arquivo binrio criado. Possibilitando uma analise mais apurada.
Rogrio C. Santos
185
Rogrio C. Santos
186
Rogrio C. Santos
187
Rogrio C. Santos
188
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
Rogrio C. Santos
191
Rogrio C. Santos
192
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 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
- 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); ... }
DbHelper
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.
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; } }
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();
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.
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."); }
}
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
Rogrio C. Santos
220
Estrutura do jogo.
HelloGameActivity <Activity>
JetGame <ArcadeGame>
onDraw()
ArcadeGame <View>
Rogrio C. Santos
221
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; }
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(); } }
Rogrio C. Santos
223
Rogrio C. Santos
224
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
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
Rogrio C. Santos
227
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.
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);
Rogrio C. Santos
232
Rogrio C. Santos
233
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