Anda di halaman 1dari 125

Luciano Soares

Enylton Coelho
Desenvolvimento para Smartphone -
Android Bsico
Mdulo II
1. Build
2. Permisses
3. Rever HelloWorld
4. Logs
5. Exemplo de Log com HelloWorld
6. Testes
7. Exemplo Test
8. Persistncia de dados
9. Exemplo Notepad
10. Debugging
11. Debugging no Eclipse
12. Exemplo do HelloWorld e do Notepad com debugging
13. extra: Assinatura de Aplicaes
14. extra: Verses
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Construindo e Rodando
(Building & Running)
! Durante o processo de build, seu projeto Android
compilado e empacotado em um arquivo binrio .apk. Este
arquivo contem os arquivos .dex (arquivos .class convertidos
para o byte code do Dalvik),uma verso binrio do
AndroidManifest.xml, os arquivos de recursos compiladores
(resources.arsc) e no compilados.
! O Eclipse gera automaticamente o arquivo .apk na pasta bin
do projeto continuamente.
! Em ambientes no Eclipse necessrio usar Ant para gerar os
arquivos para o Android.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Diagrama da Construo de Aplicaes
! De uma maneira geral a construo de uma aplicao segue a
seguinte linha.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Detalhamento do Processo de Construo
! O Android Asset Packaging Tool (aapt) coleta os
recursos em XML e compila eles. Um arquivo
R.java tambm produzido para voc poder
referenciar no seu cdigo.
! A ferramenta aidl converte qualquer
interface .aidl
! Todo o cdigo Java, incluindo R.java e .aidl so
compilados e so gerados arquivos .class
! A ferramenta dex converte os arquivos .class
para o byte code do Dalvik.
! Recursos no compilveis (como imagens) e os
arquivos .dex so enviados para o apkbuilder
para empacotar eles em um .apk.
! O .apk assinado com uma chave de debug ou
release para poder ser instalado em um
dispositivo.
! Finalmente se alinha o arquvo .apk com a
ferramenta zipalign para reduzir o consume de
memria no dispositivo.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rodando Aplicao
! Emulador
! Crie uma AVD
! selecione Run > Run (ou Run > Debug)
! Se algum emulador estiver ligado e desanexado ele ira
perguntar onde deseja rodar a aplicao
! Dispositivo
! Conecte o dispositivo na USB
! Ligue o USB Debugging no dispositivo.
! Verifique com adb devices se ele esta reconhecido
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Iniciando AVD manualmente
! Uma AVD pode ser iniciada manualmente
! Quando isso feito opes adicionais so exibidas
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Configurao Para Rodar Aplicao
! Existem opes que podem ser selecionadas para permitir
que uma ou outra forma de operao seja feita com cada
projeto.
! Selecione o Run > Run Configurations...
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Segurana e Permisses
! Android um sistema operacional privilege-separated.
! Cada aplicao roda com uma identificao distinta (usurio
UID e grupo GID). Isso definido no momento da instalao.
! A arquitetura de segurana do Android define que nenhuma
aplicao, por padro, tem permisso de fazer operaes que
impactem outra aplicaes, o sistema operacional ou o usurio.
! Android no tem ferramentas para dar permisses
dinamicamente (em tempo de execuo) por poder
comprometer a experincia do usurio.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usurio Compartilhado
(sharedUserId)
! O sharedUserId pode ser definido como um atributo no
AndroidManifest.xml em diferentes pacotes permitindo
assim que eles tenham o mesmo usurio UID.
! Apensa aplicaes com as mesma assinatura e definidas o
mesmo usurio compartilhado (sharedUserId) podero tem o
mesmo usurio (UID).
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando as Permisses
! Para se poder usar os recursos protegidos dos dispositivos deve ser
incluido no arquivo AndroidManifest.xml uma ou mais marcaes
de <uses-permission> para declarar a permisso que a aplicao
necessita.
! Caso uma aplicao tente acessa um recurso no explicitamente
permitido, uma mensagem de Log ser gerada.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Revendo Hello World
! Para rodar a aplicao Hello World voc precisa instalar uma
plataforma Android em seu ambiente SDK se voc ainda no
o fez
! Crie um emulador pelo Android Virtual Device (AVD). Este
AVD define a imagem do sistema e as configurao do
sistema emulado
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Projeto Android
1. No Eclipse: File > New > Project.
2. Selecione "Android Project" >
Next.
3. Preencha os detalhes do projeto
com os seguintes valores:
! Project name: HelloAndroid
! Application name: Hello, Android
! Package name:
com.example.helloandroid
! Create Activity: HelloAndroid
4. Finish.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rever HelloWorld
package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exerccio
! Encontre o arquivo .apk no diretrio bin
! Teste rodar o aplicativo no seu dispositivo
! Inicie uma AVD manualmente
! Teste rodar o aplicativo no emulador
! Tente rodar em verses diferentes da plataforma Android
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Lendo e Gerando Logs
! O sistema de log do Android prove mecanismos para coletar
e visualizar depuraes do sistema pelo usurio.
! O Logcat exibe mensagens de log do sistema no qual incluem
informaes como quando o emulador lana um erro e
mensagens que voc programou no seu sistema
! Se pode rodar o LogCat atravs do ADB ou pelo DDMS
! As mensagens podem ser lidas em tempo real
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
A Classe Log
Esta classe possui uma srie de mtodos para log, entre eles:
! v(String, String) (verbose)
! d(String, String) (debug)
! i(String, String) (informao)
! w(String, String) (aviso)
! e(String, String) (erro)
Por exemplo:

Retorna:
Log.i("MyActivity", "MyClass.getView() get item number " + position);
I/MyActivity( 1557): MyClass.getView() get item number 1
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Outras Informaes de Log
! Logs do tipo Debug so compilados mas removidos em
compilaes em release, os Logs tipo Error, warning w info
so sempre mantidos.
! Uma boa conveno definir um Tag nica para sua classe
! A variante com 3 parmetros permite logar tambm as
excees quando elas existem, por exemplo:
private static final String TAG = "MyActivity";
public static int v (String tag, String msg, Throwable tr)
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando LogCat
! Voc pode usar o LogCat de seu console, de uma shell do seu
dispositivo ou do DDMS
! No console do seu computador basta chamar:
! Dentro do shell do dispositivo chame:
! Ou seno clique na perspectiva do DDMS por exemplo:
adb logcat
logcat
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Filtrando as Sadas de Log
Toda mensagem de log tem um tag e um priority associado com
ela, assim possvel tambm filtrar os Logs de diversas formas:
! V Verbose (menor prioridade)
! D Debug
! I Info
! W Warning
! E Error
! F Fatal
! S Silent (maior prioridade, nada exibido)
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo de Log com HelloWorld
! Inclua algumas chamada de log na sua aplicao e
verifique se algo aparece no log do sistema
! Filtre pelos diversos nveis de informao
! Tente rodar o logcat pela linha de comando
public class HelloAndroid extends Activity {
private static final String TAG = "HelloAndroid";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"Aplicao iniciada");
setContentView(R.layout.main);
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Testes
! O Android j integra todo um sistema de testes para as
aplicaes. Permitindo fazer testes desde o unitrio (unit) at
testar todo o framework sendo usado.
! As ferramentas de testes so baseadas no Junit. Contudo o
Android possui algumas extenses para testes mais
especficos.
! As ferramentas de testes esto disponveis no Eclipse com o
ADT. Estas ferramentas tambm podem ser usadas em outras
IDEs.
! Para estressas a interface grfica existe o Monkey Runner.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Framework de Test
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Estrutura dos Testes
! Cada teste realizado de forma isolada para um mdulo
especfico da aplicao que se deseja testar.
! No Android so usadas ferramentas de testes especficas para
ler o pacote de testes e a aplicao sendo testada e a aplicao
roda sobre um testador especfico para Android.
! Os testes so feitos da mesma forma que um projeto
convencional de uma aplicao.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Ferramentas do Android para Testes
! O sistema automaticamente configura o pacote de teste para
usar o InstrumentationTestRunner, para rodas o testes JUnit
! Cria um nome apropriado para o pacote de teste associado
com o nome da aplicao em teste, prevenindo assim
conflitos do desenvolvimento com o sistema.
! Automaticamente cria os arquivos de projeto para a
construo, compilao, execuo e teste do projeto, alm
dos arquivos de manifest, estrutura de diretrio, etc.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
API de Teste
! A Classe do JUnit TestCase usada para fazer os testes
unittio. J o Android extende essa classe para o
AndroidTestCase, usado para testar objetos especficos do
Android.
! Para rodas as aplicaes de teste chamado um rodador de
testes chamado InstrumentationTestRunner.
! Em aplicaes Android tambm no suporto se controlar os
comportamentos do ciclo de vida da aplicao. Porm com o
Android instrumentation, voc pode invocar as chamadas de
callback no seu cdigo de teste.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo de Teste de uma Activity
// Inicia a Activity principal da aplicao em teste
mActivity = getActivity();

// Usa um handle para o principal objeto da interface de usurio da Activity (um Spinner)
mSpinner = (Spinner)mActivity.findViewById(com.android.example.spinner.R.id.Spinner01);

// Define o Spinner em uma posio conhecida
mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION);

// Para a activity ( o mtodo onDestroy() deve salvar o estado do Spinner )
mActivity.finish();

// Recomece a Activity ( o mtodo onResume() deve retornar o estado do Spinner )
mActivity = getActivity();

// Recupere a posio atual do Spinner
int currentPosition = mActivity.getSpinnerPosition();

// Faa um teste assertivo da posio atual e da definida no inicio da aplicao
assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Classes Assertivas (Asserts)
O uso de mtodos assertivos mais conveniente que os logs e
resulta em uma melhor desempenho da aplicao
! Alm das assertivas do JUnit, a API de teste do Android ainda
prove classes como MoreAsserts e a ViewAsserts
! MoreAsserts contem assertivas mais poderosas, como por
exemplo assertContainsRegex(String, String), que faz a
verificao por expresses regulares
! O ViewAsserts contem assertivas teis para checar as Views.
Por exemplo existe a assertHasScreenCoordinates(View,
View, int, int) que testa se uma View tem uma posio
particular em X e Y. Estes testes simplifica a validao
geomtrica e slinhamento na interface do usurio.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Execuo dos Testes
! Os testes rodados dentro do Eclipse so exibidos dentro da
janela do JUnit. Seno vo para o STDOUT
! As ferramentas do Android nomeiam os pacotes de testes
criados adicionando ".test" no nome do pacote da aplicao
em teste.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Testando com o Eclipse e ADT
! O Eclipse permite criar um projeto de teste rapidamente e
conectar ele com a aplicao que se deseja testar. Quando se
cria um projeto de teste automaticamente inserido a tag
<instrumentation> no arquivo de manifest
! Tambm rapidamente possvel importar as classes da
aplicao sendo testada para serem inspecionadas
! Se pode criar configuraes para os testes com flags passadas
para o framework de teste do Android
! Finalmente possvel testar os pacotes sem precisar deixar o
Eclipse para isso. O ADT faz o build e empacota ambas as
aplicaes, instala elas, roda os testes e exibe os resultados
em janelas especficas do Eclipse
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Criando um projeto de teste
! Um projeto de teste usa uma estrutura de diretrio como
uma aplicao de Android normal
! Para criar o projeto v em File > New > Android Test
Project
! Uma sugesto colocar o texto Test no final no nome do
projeto para mais facilmente identificar o seu uso.
! No Test Target panel, selecione um Project Android existente
! No Build Target panel, selecione a plataforma SDK Android
! Clique em Finish para finalizar
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Criando o Pacote de Testes
! Sua classe de teste principal deve extender algum dos caso de
testes do Android ou do JUnit
! Crie um construtor para sua classe sem argumentos, isso um
requisito do Junit
! Para controlar o teste necessrio implementar os mtodos
setUp() e tearDown()
! Outra conveno implementar o mtodo testPreconditions()
para fazer as primeiras verificaes de sua aplicao
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rodando os testes
! Rode um teste da mesma forma que voc roda uma
aplicao, selecione Run As... > Android JUnit Test pelo
menu de contexto ou pelo menu Run principal
! O progresso do teste aparece na janela de console
! Os resultados dos testes aparecem na janela do JUnit
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Crie um Projeto de Teste
! No Eclipse, selecione
New >
Project >
Android >
Android Test Project
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Definindo Parmetros do Teste
! Test Project Name: "HelloAndroidTest"
! Test Target: Selecione "An existing
Android project", clique em Browse, e
selecione "HelloAndroid" da lista de
projetos
! Build Target: Defina uma plataforma
para a execuo dos testes
! Application name: "HelloAndroidTest"
! Package name:
"com.example.helloandroid.test
! Clique em Finish
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Adicionando a Classe de Caso de Teste
! Abra o diretrio src/ e encontre o pacote
com.example.helloandroid.test.
! Clique com o boto da direita e selecione New > Class
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Definindo Classe de Teste
! Name: "HelloAndroidTest (nome da classe de testes)
! Superclass: android.test.ActivityInstrumentationTestCase2<HelloAndroid>
! A superclasse parametrizada com um classe Activity
! Click Finish.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Construtor da Classe de Teste
! Importe a classe a ser testada
! Adicione um construtor sem argumentos
import com.example.helloandroid.HelloAndroid;
public HelloAndroidTest() {
super("com.example.helloandroid", HelloAndroid.class);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Adicione o Mtodo de setUp
! Adicione algumas classes membro e importa quando
necessrio o pacote das classes usadas.
! Adicione o cdigo de set up
import android.widget.TextView;
private HelloAndroid mActivity;
private TextView mView;
private String resourceString;
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = this.getActivity();
mView = (TextView) mActivity.findViewById(com.example.helloandroid.R.id.textview);
resourceString = mActivity.getString(com.example.helloandroid.R.string.hello);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Adicione os Teste
! Adicione o teste de pr-condies
! Adicione o teste unitrio
public void testPreconditions() {
assertNotNull(mView);
}
public void testText() {
assertEquals(resourceString,(String)mView.getText());
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Teste Completo
package com.example.helloandroid.test;
import com.example.helloandroid.HelloAndroid;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.TextView;
public class HelloAndroidTest extends ActivityInstrumentationTestCase2<HelloAndroid> {
private HelloAndroid mActivity; // the activity under test
private TextView mView; // the activity's TextView (the only view)
private String resourceString;
public HelloAndroidTest() {
super("com.example.helloandroid", HelloAndroid.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = this.getActivity();
mView = (TextView) mActivity.findViewById(com.example.helloandroid.R.id.textview);
resourceString = mActivity.getString(com.example.helloandroid.R.string.hello);
}
public void testPreconditions() {
assertNotNull(mView);
}
public void testText() {
assertEquals(resourceString,(String)mView.getText());
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rodando os Testes
! No Package Explorer clique com o boto da direita no
projeto HelloAndroidTest e selecione Run As > Android
JUnit Test
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Visualizando os Testes
! Uma janela do JUnit deve abrir e exibir a informao dos
testes.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exerccio
! Coloque um erro no teste e verifique o resultado. Por
exemplo o que aconteceria se a janela fosse criada
dinamicamente assim:
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("Hello, Android! I am a string resource!");
setContentView(tv);
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Armazenamento de Dados
Para persistir dados no Android necessrio verificar as necessidades de sua
aplicao, como se os dados devem ser privados para a sua aplicao ou assesvel
por outras aplicaes, quanto de espao vai ser necessrio para armazenar, as
principais opes so :
! Shared Preferences Armazena dados primitivos em um par chave-valor.
! Internal Storage Armazena os dados privados na memria do dispositivo.
! External Storage Armazena dados pblicos em rea externa compartilhada.
! SQLite Databases Armazena estrutura de dados em base de dados privada.
! Network Connection Armazena dados na web em servidor na rede.
Um provedor de contedo (content provider) um componente opcional que
expe e grava dados para sua aplicao, dependendo das restries criadas.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Shared Preferences
A classe SharedPreferences prove um framework genrico que
permite salvar e recuperar dados pelo tipo de dados chave-
valor. Estes dados persistem pelas sesses de usurios (mesmo
se a aplicao foi morta).
! getSharedPreferences() - Use this if you need multiple
preferences files identified by name, which you specify with
the first parameter.
! getPreferences() - Use this if you need only one preferences
file for your Activity. Because this will be the only
preferences file for your Activity, you don't supply a name.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Para Gravar Valores
! Chame edit() para pegar o SharedPreferences.Editor.
! Adicione valores com mtodos como
! putBoolean()
! putString()
! Salve os novos valores com a chamada commit()
! Para ler os valores usar mtodos de SharedPreferences
! getBoolean()
! getString()
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo que salva uma Preferncia

public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";

protected void onCreate(Bundle state){
super.onCreate(state);
. . .
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); // Restore preferences
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}

protected void onStop(){
super.onStop();
. . .
// We need an Editor object to make preference changes. All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
editor.commit(); // Commit the edits!
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando o Armazenamento Interno
! Por padro, arquivos armazenados no sistema de
armazenamento interno so privados para a aplicao e outro
aplicativos no podem acessar os dados. Quando o usurio
desinstala o aplicativo os arquivos tambm so removidos.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Trabalhando com Arquivos Internos
! Para gravar chame openFileOutput() com o nome do arquivo
e o modo de operao para ter um FileOutputStream, grave
o arquivo com write().
! Para ler chema openFileInput() com o nome do arquivo para
ter um FileInputStream, leia com read().
! Feche o arquivo com o mtodo close().
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo de Acesso de Arquivos Internos
String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
Modos de Operao:
MODE_PRIVATE
MODE_APPEND
MODE_WORLD_READABLE
MODE_WORLD_WRITEABLE
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Salvando Arquivos de Cache
! Para dados temporrios possvel se usar um cache em vez
de se usar a memria persistente.
! Para se acessar o cache possvel acessar com o mtodo
getCacheDir() para abrir um diretrio de cache e salvar seus
dados temporrios
! O sistema do Android pode apagar os arquivos quando achar
necessrio e quando a aplicao desinstalada, os arquivos
so removidos definitivamente.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Outros Mtodos de Arquivos
! getFilesDir() Recupera o caminho absoluto do diretrio do
sistema de arquivos onde os arquivos so salvos.
! getDir() Cria um diretrio (ou abre um existente) para um
armazenamento interno do sistema de arquivos.
! deleteFile() Apaga os arquivos salvos no sistema de arquivos
interno.
! fileList() Lista os arquivos salvos por sua aplicao.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando o Armazenamento Externo
! Cada dispositivo compatvel com Android possui suporte para
um sistema de armazenamento externo compartilhado que
voc pode usar para salvar arquivos. Este pode ser uma media
removvel (normalmente cartes SD) ou at mesmo uma
rea interna (no removvel).
! Arquivos salvos na rea externa so visvel por todos os
aplicativos, e inclusive pode ser manipulado pelo usurio
quando por exemplo este anexa a um computador por USB
ou bluetooth.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Verificando Disponibilidade de Mdia
! Voc deve sempre chamar getExternalStorageState() para
verificar se uma mdia esta disponvel.
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Acessando Arquivos Externos
! Na API nvel 8 ou superior, use o getExternalFilesDir() para abrir
um arquivo externo.
! Na API Level 7 ou inferior, use o getExternalStorageDirectory(),
para abrir um arquivo externo. Contudo salve seu arquivo no
seguinte diretrio:
/Android/data/<package_name>/files/
! Caso se desinstale a aplicao este diretrio e seu contedo sero
removidos.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Salvando Arquivos para Compartilhar
! Se voc deseja salvar arquivos que no so especficos para sua
aplicao e no deletados quando a aplicao for desinstalada, grave
em um diretrio pblico.
! Na API nvel 8 ou superior, use getExternalStoragePublicDirectory(),
passando o tipo de diretrio que voc quer, como
DIRECTORY_MUSIC, DIRECTORY_PICTURES,
DIRECTORY_RINGTONES. Este mtodo cria o diretrio se
necessrio.
! Na API nvel 7 ou inferior, use getExternalStorageDirectory() para
abrir o arquivo pelo diretrio raiz, ento salve o arquivo em um
diretrio correspondente.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Estrutura de Diretrios
! Music/ - Musicas do Usurio
! Podcasts/ - Podcasts
! Ringtones/ - Ringtones
! Alarms/ - Sons de Alarm.
! Notifications/ - Sons de Notificaes
! Pictures/ - Todas as fotos (menos tiradas com a cmera).
! Movies/ - Todos os filmes (menos tirados com a cmera).
! Download/ - Downloads diversos
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando Banco de Dados
! Android prove um suporte completo para o banco de dados
SQLite.Qualquer banco de dados criado por sua aplicao ;e
acessvel diretamente pelo nome.
! Os banco de dados no so acessvel externamente as
aplicaes.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo de Uso de Banco de Dados

! Para acessar um banco de dados SQLite extenda a classe
SQLiteOpenHelper e sobrescreva o mtodo onCreate().
public class DictionaryOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);;
DictionaryOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Uso do SQL
! O SQLiteOpenHelper ajuda no acesso de banco de dados,
chame getWritableDatabase() e getReadableDatabase() para
recuperar os banco de dados, ambos retornam um objeto
SQLiteDatabase que representa o banco de dados e prove
mtodos SQLite para as operaes.
! Para pesquisas SQLite execute SQLiteDatabase query(), que
aceita vrios parametros de pesquisa. Para pesquisas mais
complexas use o SQLiteQueryBuilder, que prove mtodos
mais convenientes para algumas pesquisas
! Pesquisas SQLite retornam um objeto Cursor que aponta
para a linha encontrada na pesquisa. O Cursor o mecanismo
usado para navegar nas linhas e colunas do banco de dados
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando Conexes de Rede
Para usar conexes de rede, diversas ferramentas ja existem,
verifique os pacotes padres de acesso a rede:
! java.net.*
! android.net.*
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo de Acesso de Bando de Dados
! Copie e abra o arquivo Notepadv1
! Inicie um novo Projeto clicando File > New > Android Project
! Na janela de dialogo selecione: Create project from existing
source
! Clique no Browse e navegue para onde voc deixou o arquivo
compiado
! O nome do projeto e outras propriedades ja so preenchidas
automaticamente.
! Selecione o Build Target no caso o mnimo o 2.2
! Adicione o Min SDK Version no caso a verso 8
! Clique em Finish.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Crie um Layout Para o Aplicativo
! Abra o arquivo notepad_list.xml no res/layout
! Acerte o layout com um ListView e um TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_notes"/>

</LinearLayout>
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Detalhes dos Layout XML
! O smbolo @ no incio da definio do android:id indica que o arquivo
deve ser compilado para permitir o recursos ser identificado (id).
! O smbolo de mais (+) significa que um novo recurso nomeado que
precisa ser criado e adicionado no arquivo de recursos (R.java)
! O android tambm fornece uma srie de recursos identificveis
internos ao sistema, eles so definidor como @android:id/
! Quando usado o ListActivity a ListView deve ter o nome de
"@android:id/list" para que o ListActivity encontre ela.
! A View com o nome @android:id/empty usada automaticamente
quando um ListAdapter no possui dados no ListView.
! possvel definir um View alternativo quando o View atual esta vazio
com o comando setEmptyView(View)
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Preparar para ListView
! Fazer View para as linhas do ListView, para isso crie um novo
arquivo em res/layout chamado notes_row.xml
! Defina uma TextView para usar (No esquea do cabealho XML)
! Troque a herana do da classe Notepadv1 de Activity para
ListActivity, importe as novas classes.
<?xml version="1.0" encoding="utf-8"?>
<TextView android:id="@+id/text1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
public class Notepadv1 extends ListActivity
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o onCreate()
! No mtodo onCreate chame super.onCreate() com o parmetro savedInstanceState
j passado
! Chame setContentView() e passe o R.layout.notepad_list
! Defina um objeto chamado mDbHelper da classe NotesDbAdapter
! No mtodo onCreate instancie o NotesDbAdapter para o mDbHelper e passe this
! Chame o mtodo open() do mDbHelper para abrir (ou criar) o banco de dados.
! Chame o mtodo fillData() para ler os dados e popular o ListView
private NotesDbAdapter mDbHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notepad_list);
mDbHelper = new NotesDbAdapter(this);
mDbHelper.open();
fillData();
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o onCreateOptionsMenu()
! Em strings.xml (res/values) adicione uma nova string chamada
de "menu_insert" com seu valor para Adicionar Item

! Em Notepadv1 crie uma constante posicionadora de menu

! No mtodo onCreateOptionsMenu() capture o valor
retornado para repasar ele no final
! Adicione o item de menu com menu.add()
<string name="menu_insert">Adicionar Item</string>
public static final int INSERT_ID = Menu.FIRST;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, INSERT_ID, 0, R.string.menu_insert);
return result;
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o onOptionsItemSelected()
! O mtodo super.onOptionsItemSelected(item) vai para o
final deste mtodo para pegarmos o evento primeiro
! Use um switch no item.getItemId() para caso INSERT_ID,
chamar o mtodo createNote() e retornar true
! Retorne o resultado da superclasse onOptionsItemSelected()
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case INSERT_ID:
createNote();
return true;
}
return super.onOptionsItemSelected(item);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o createNote()
! Construa a String noteName com "Note e o contador
definido.
! Chame o mDbHelper.createNote() usando o noteName
recm criado como ttulo e "" para o corpo do texto
! Chame fillData() para popular a lista de anotaes
private void createNote() {
String noteName = "Note " + mNoteNumber++;
mDbHelper.createNote(noteName, "");
fillData();
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o fillData()
! Faa um adapter para definir o ListActivity
private void fillData() {
// Get all of the notes from the database and create the item list
Cursor c = mDbHelper.fetchAllNotes();
startManagingCursor(c);

String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
int[] to = new int[] { R.id.text1 };

// Now create an array adapter and set it to display using our row
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
CursorAdapter e SimpleCursorAdapter
! O Cursor Adapter um Adapter que expes os dados de um
Cursor para um ListView. O Cursor deve incluir um coluna
nomeada "_id" ou essa classe no funionar.
! O SimpleCursorAdapter herda de CursosAdapter.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Verificar Aplicao
! Neste momento a aplicao j deve fazer algo mnimo
! selecione Run As > Android Application.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Notepadv2
! Importe o projeto Notepadv2
! Este novo projeto ja vem com alguns pontos ja preparados
para o treinamento
! Siga os mesmos passos do Notepadv1
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Crie um Menu de Contexto
! Para registrar cada item da lista do ListView para o menu de
contexto chame registerForContextMenu() e passe o
ListView. Faa isso no mtodo onCreate()
! Adicione um callback no onCreateContextMenu() para que
quando um item seja clicado seja definido um sinal de deleo.
registerForContextMenu(getListView());
public void onCreateContextMenu(Menu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, DELETE_ID, 0, R.string.menu_delete);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva a onContextItemSelected()
! Crie um switch para o evento que foi definido.
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()) {
case DELETE_ID:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mDbHelper.deleteNote(info.id);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Conclua a createNote()
! Crie um novo Intent para criar uma anotao
(ACTIVITY_CREATE) usando a classe NoteEdit
! Dispare o Intent com a chamada startActivityForResult()
Intent i = new Intent(this, NoteEdit.class);
startActivityForResult(i, ACTIVITY_CREATE);
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva a onListItemClick()
! Crie o Intent, passe os dados por ele e chame a nova Activity
super.onListItemClick(l, v, position, id);
Cursor c = mNotesCursor;
c.moveToPosition(position);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
startActivityForResult(i, ACTIVITY_EDIT);
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Deselvolva a onActivityResult()
! Trate os dois eventos que podem ter sido gerados
super.onActivityResult(requestCode, resultCode, intent);
Bundle extras = intent.getExtras();
switch(requestCode) {
case ACTIVITY_CREATE:
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelper.createNote(title, body);
fillData();
break;
case ACTIVITY_EDIT:
Long mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
if (mRowId != null) {
String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);
String editBody = extras.getString(NotesDbAdapter.KEY_BODY);
mDbHelper.updateNote(mRowId, editTitle, editBody);
}
fillData();
break;
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva Classe NoteEdit
! Verifique a note_edit.xml
! Clique com o boto da direita em
com.android.demo.notepad2 e selecione New > Class
! Preencha Name com NoteEdit
! Para Superclasse entre com android.app.Activity
! Clique Finish.
! Na classe NoteEdit resultante, clique com o boto da direita e
chame o Source > Override/Implement Methods...
! Busque e ative o onCreate(Bundle)
! Clique em OK.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Deselvolva o novo onCreate()
! Defina o layout a ser usado
! Troque o ttulo da Activity
! Encontre os componentes EditText e Buttons
setContentView(R.layout.note_edit);
setTitle(R.string.edit_note);
mTitleText = (EditText) findViewById(R.id.title);
mBodyText = (EditText) findViewById(R.id.body);
Button confirmButton = (Button) findViewById(R.id.confirm);
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Cont. onCreate()
! Declare um Long mRowId privado para armazenar a linha sendo editada
! Adicione cdigo para iniciar o title, body e mRowId dos extras do Bundle
no Intent
mRowId = null;
Bundle extras = getIntent().getExtras();
if (extras != null) {
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);

if (title != null) {
mTitleText.setText(title);
}
if (body != null) {
mBodyText.setText(body);
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o onClickListener()
! Faa um mtodo para quando o usurio pressionar o boto de
confirmao
confirmButton.setOnClickListener(new View.OnClickListener() {

public void onClick(View view) {

}

});
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Preencha o onClick()
! Crie um Bundle e coloque o ttulo e o corpo do texto nele
! Coloque a informao em um Intent e termine a Activity
Bundle bundle = new Bundle();

bundle.putString(NotesDbAdapter.KEY_TITLE, mTitleText.getText().toString());
bundle.putString(NotesDbAdapter.KEY_BODY, mBodyText.getText().toString());
if (mRowId != null) {
bundle.putLong(NotesDbAdapter.KEY_ROWID, mRowId);
}
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
finish();
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Defina nova Activity no Manifest
! De um duplo clique no arquivo AndroidManifest.xml
! Clique na aba Application no editor do Manifest
! Clique Add... na sesso de Application Nodes section
(se aparecerem botes de seleo, escolha o superior)
! Confirme que "(A) Activity" esta selecionado no painel de
seleo e clique em OK.
! Clique no novo n de "Activity" node e escreva .NoteEdit
no campo do nome a direita
! Pressione Enter
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Teste a nova Aplicao
! A aplicao dever ser funcional agora
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Notepadv3
! Importe o projeto Notepadv3
! Este novo projeto ja vem com alguns pontos ja preparados
para o treinamento
! Siga os mesmos passos do Notepadv1
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Deixando cdigo Enxuto
! Remova os extras passados por Bundle do NoteEdit
! Tambm apague as propriedades passadas pelos extras do
Bundle
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
if (title != null) {
mTitleText.setText(title);
}
if (body != null) {
mBodyText.setText(body);
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Passando Helpes para NoteEdit
! Crie um atributo da classe chamado de mDbHelper do tipo
NotesDbAdapter
! Instancie o novo atributo e inicialize
private NotesDbAdapter mDbHelper;
mDbHelper = new NotesDbAdapter(this);

mDbHelper.open();
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Cont.
! Atualize cdigo que inicia o mRowId

! Com um novo cdigo
mRowId = null;
Bundle extras = getIntent().getExtras();
if (extras != null) {
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
}
mRowId = (savedInstanceState == null) ? null :
(Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID);
if (mRowId == null) {
Bundle extras = getIntent().getExtras();
mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID)
: null;
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Cont.
! Popule os campos na inicializao
! Remova a criao do Bundle no onClick()
populateFields();
public void onClick(View view) {
setResult(RESULT_OK);
finish();
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o populateFields()
private void populateFields() {
if (mRowId != null) {
Cursor note = mDbHelper.fetchNote(mRowId);
startManagingCursor(note);
mTitleText.setText(note.getString(
note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));
mBodyText.setText(note.getString(
note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Salve o estado da Activity
! Defina a onSaveInstanceState()
! Defina onPause() e onResume()
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveState();
outState.putSerializable(NotesDbAdapter.KEY_ROWID, mRowId);
}
@Override
protected void onPause() {
super.onPause();
saveState();
}
@Override
protected void onResume() {
super.onResume();
populateFields();
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Desenvolva o saveState()
! Salve tanto o ttulo quanto o corpo do texto
private void saveState() {
String title = mTitleText.getText().toString();
String body = mBodyText.getText().toString();

if (mRowId == null) {
long id = mDbHelper.createNote(title, body);
if (id > 0) {
mRowId = id;
}
} else {
mDbHelper.updateNote(mRowId, title, body);
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Remova o onActivityResult()
! Remova o cdigo interno do sistema
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
super.onActivityResult(requestCode, resultCode, intent);
fillData();
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Limpeza Final
! Remova as linhas na qual se define o ttulo e o corpo do texto
no onListItemClick()
! Remova tambm
Cursor c = mNotesCursor;
c.moveToPosition(position);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
c.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
c.getColumnIndex(NotesDbAdapter.KEY_BODY)));
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rode a Aplicao Completa
! Teste se tudo esta funcionando bem
! Tente fazer algumas modificaes no cdigo para verificar se
voc entendeu bem os conceitos apresentados
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Depurao (Debugging)
! O SDK do Android prove as ferramentas necessrias para
voc poder depurar seus aplicativos. Para depurar
necessrio suporte ao JDWP (Java Debug Wire Protocol),
com ele possvel fazer operaes como step, ver o valor das
variveis, pausar a execuo do aplicativo
! No Eclipse, um depurador compatvel com JDWP ja esta
includo e no necessita nenhuma instalao
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Principais Componentes do Debug
! Adb O adb age como um middleman entre o dispositivo e o ambiente
de desenvolvimento, permitindo por exmplo sincronizar e mover
arquivos, alm de meios de comunicao com o dispositivo conectado
! Dalvik Debug Monitor Server - DDMS um programa grfico que
comunica com o dispositivo atravs do adb. DDMS pode capturar telas, as
thread de operao e informao da pilha (stack)
! Dispositivo e Emulador A aplicao precisa rodar em um dispositivo ou
AVD para ser debugado. Um daemon adb roda do dipositivo (ou
emulador) e prove meios para o host adb fazer a comunicao
! JDWP debugger - A maquina Virtual Dalvik suporta o protocolo JDWP
permitindo debugadores se comunicar com a mquina virtual. Cada
aplicao em sua mquina virtual expe um porta que se conecta via
DDMS. DDMS possui um concentrador de portas caso diversas aplicaes
se comuniquem ao mesmo tempo
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Ambiente de Debugging
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Ferramentas de Depurao Adicionais
! Heirarchy Viewer e layoutopt Programa Grficos que
permitem depurar e otimizar a interface do usurio
! Traceview Programa grfico que rastreia chamadas de
mtodos e seus tempos que podem ajudar a otimizar o
aplicativo
! Aplicao Dev Tools - O Dev Tools permite visualizar
informaes do sistema rodando como por exemplo o uso de
CPU e a taxa de quadros por segundo
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Debugando com o Eclipse e ADT
! Com o Eclipse e o plugin ADT possvel usar o Java
Debugger integrado junto com o DDMS
! O Eclipse possui o Debugger e o DDMS como perspectivas,
que so Views do Eclipse configuradas para exibir certos tabs
e janelas
! Eclipse tambm se responsabiliza por iniciar o host ADB
automaticamente.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
A Perspectiva Debug no Eclipse
! Debug Exibe o estado das threads das Aplicaes Android
! Variables Exibe as variveis do cdigo em execuo
! Breakpoints Exibe uma lista dos breakpoints definidos para
a sua aplicao
! LogCat Permite visualizar o log do sistema em tempo real
(O LogCat tambm visvel na perspectiva do DDMS)
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Perspectiva DDMS
! Devices Apresenta uma lista dos dispositivos e AVDs
conectados pelo ADB
! Emulator Control Permite controlar recursos do Emulador
! LogCat - Permite visualizar o log do sistema em tempo real
! Threads Mostra as threads rodando
! Heap Exibe o uso de memria heap para a mquina virtual
! Allocation Tracker Exibe memria alocada para objetos
! File Explorer Gerenciador de Arquivos do Dispositivo
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando DDMS
! Android fornecido com uma ferramenta de debug chamado
de Dalvik Debug Monitor Server (DDMS), que prove
servios de port-forwarding, captura de tela, informaes de
thread e heap, logcat, processos, estado da comunicao de
radio, chamdas de voz e SMS, localizao, dentre outras
funcionalidades.
! DDMS funciona ambos com o emulador e dispositivos
conectados. Se ambos estiverem conectados o padro
visualizar o emulador
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rodando o DDMS
! No Eclipse:
! Window > Open Perspective > Other... > DDMS.
! Linha de comando:
! ddms (ou ./ddms em Mac/Linux) no diretrio tools/
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Tela do DDMS

Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Visualizando o uso do heap
O DDMS permite que voc veja quanta memria heap um processo est
usando.
1. Na aba Devices, selecione o processo que voc deseja ver a
informao de memria heap.
2. Clique no boto Update Heap para capturar a informao de
memria head do processo.
3. Na aba Heap, clique Cause GC para invocar o garbage collection,
permitindo assim ver a coleo do heap.Para atualizaes clique no
Cause GC denovo.
4. Clique em um tipo de objeto na lista para mostrar um grfico de
barras como nmero de objetos alocados para um tamanho
particular de memria em bytes.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rastreando Alocao de Memria para Objetos
DDMS prove recursos para rastrear objetos que esto sendo alocados
na memria para visualizar quais classes e threads esto os alocando
1. No tab Devices, selecione o processo a ser rastreado
2. Na tab Allocation Tracker, clique no boto Start Tracking para
iniciar o rastreamento
3. Clique no Get Allocations para ver uma lista dos objetos alocados.
Voc pode clicar em Get Allocations de novo para adicionar na lista
os novos objetos alocados
4. Para parar o rastreamento ou limpar a janela e recomear clique
no boto de stop
5. Clique em uma linha especfica para ver mais detalhes como o
mtodo e a linha que foi chamada de cdigo.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Trabalhando com o Sistema de Arquivos
DDMS prove uma tab para gerenciar os arquivos no dispositivo,
ou emulador.
1. Na tab Devices, selecione o dispositivo que voc deseja ver
o sistema de arquivos
2. Para copiar o arquivo para o dispositivo, selecione o
arquivo e clique em Pull
3. Para copiar o arquivo do dispositivo clique em Push
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Examinando as Informaes da Thread
A aba Threads no DDMS exibe a informao das threads
rodando no sistema no momento.
1. Na aba Devices, selecione a thread do processo que voc
deseja examinar.
2. Clique no boto Update Threads.
3. Na aba Threads, voc pode ver as informaes da thread
selecionada.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Usando o LogCat
LogCat integrado ao DDMS e exibe as mensagens de log do
seu dispositivos. As mensagens de log podem ser geradas com a
classe Log desenvolvida na aplicao e outras mensagens do
sistema como excees lanadas. As mensagens podem ser
filtradas com os seguintes botes:
! Verbose
! Debug
! Info
! Warn
! Error
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Emulatando operaes de Telefone e
Localizao
O Controle do emulador permite a
voc simular chamadas de voz e o
estado da rede de dados, isto til
para voc testar a robustez da sua
aplicao nos diferentes tipos de
redes.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Debugando seu Projeto
! Introduza um bug no seu cdigo.
package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Object o = null;
o.toString();
setContentView(R.layout.main);
}
}
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Rode Aplicao em Debug
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Exemplo do Notepad com debugging
! Rode o programa e veja os conceitos aplicados se voc
consegue rastrear
! Defina breackpoints por exemplo nos onCreate(), onPause(),
onSaveInstanceState() e onResume() da classe NoteEdit
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Assinando as Aplicaes
! Todas as aplicaes Android (arquivos .apk) precisam ser
assinados com uma certificado na qual a chave privada
possuida pelo desenvolvedor
! O certificado no precisa ser assinado por uma autoridade
certificadora, perfeitamente possvel (e normal) assinar
uma aplicao por voc mesmo
! O sistema do Android usa os certificados como meio de
identificar o autor de uma aplicao e definir uma relao de
confiana entre as aplicaes
! O sistema do Android no instala ou roda aplicaes que no
seja assinada apropriadamente
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Assinatura em modo debug e release
! Enquanto desenvolvendo e testando voc pode compilar em
modo debug normalmente. O modo debug usa o utilitrio
Keytool includo no JDK para criar as chaves.
! Durante as compilaes o chave de debug usada para assinar
o arquivo .apk, como a chave conhecida no necessrio
ficar pedindo a senha para o desenvolvedor a cada compilao
! Quando sua aplicao estiver pronta para ser entregue, voc
deve assinar ela com a sua chave privada
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Assinando suas Aplicaes
! O sistema do Android teste a data de validade do certificado
de assinatura durante a instalao. Se a aplicao vencer
depois de instalada ela continua funcionando normalmente.
! As ferramentas Keytool e Jarsigner so normalmente usadas
para assinar a aplicao
! Uma vez assinado, uso a ferramenta zipalign para otimizar o
aplicativo alinhando os dados no arquivo
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Assinando para a Distribuio Pblica
Para fazer uma assinatura de release, voc deve:
1. Obter um chave privada
2. Compilar a aplicao no modo release
3. Assinar sua aplicao com sua chave privada
4. Alinhar o arquivo .apk final
Com o Eclipse e ADT voc pode fazer:
1. File > Export.
2. Abra a pasta Android
3. Selecione Export Android Application e clique em Next.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Criao de Chave
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Finalizando Apk
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Verses das Aplicaes
! Os usurios precisam saber informaes especficas da verso
do aplicativo instalado em seu dispositivo para por exemplo
fazer atualizaes
! Se voc publicar outras aplicaes as verses podem ser
usadas para determinar a compatibilidade e dependncias
! Servios no qual voc vai publicar sua aplicao tambm
podem querem apresentar a verso para o usurio
! O sistema do Android no checa a verso da aplicao
! O sistema do Android entretanto checa a verso de
compatibilidade que definida no atributo minSdkVersion do
Manifest.
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Definindo a Verso de seu aplicativo
Para definir a verso de sua aplicao, defina os seguintes
atributos no arquivo manifest, voc deve sempre definir os dois:
! android:versionCode Um nmero inteiro que representa
a verso da aplicao em relao as outras
! android:versionName Um texto que reprensenta a verso
de sua aplicao
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.package.name"
android:versionCode="2"
android:versionName="1.1">
<application android:icon="@drawable/icon" android:label="@string/app_name">
...
</application>
</manifest>
Luciano Pereira Soares lpsoares@gmail.com - 29/07/11
Especificando Requisitos de API
Se sua aplicao requisita um verso mnima de plataforma
Andoird, ou projetada para somente suportar uma faixa de
verses da plataforma, voc pode definir este requisito no
arquivo manifest:
! android:minSdkVersion A verso mnima da plataforma
Android para rodar a aplicao
! android:targetSdkVersion A verso da plataforma
Android na qual o aplicativo foi projetado para rodar a
aplicao, isso permite que a aplicao use mais recursos que
os definidos na verso mnima
! android:maxSdkVersion A verso mnima da plataforma
Android para rodar a aplicao

Anda mungkin juga menyukai