introdução ao android (minicurso 4h)
DESCRIPTION
Minicurso ministrado no X SIECOMP, 11 de março de 2013, UEFSTRANSCRIPT
Introdução ao AndroidMinicurso, 4h
Rodrigo Rocha Gomes e Souza11 de março de 2013
X SIECOMP, UEFS
Apresentação
Vocês
Quem tem um aparelho Android?
Quem programa em Java?
Quem já programou pra Android, pelo menos um Hello World?
Quem já programou pra outra plataforma móvel?
Eu
Doutorando em Ciência da Computação na UFBA
Analista de TI no CPD-UFBA
Professor estagiário da disciplina “Aplicações para Dispositivos Móveis”, na UFBA
Fundador da RoDen Apps (iOS)
Conteúdo
Ambiente de desenvolvimento (ADT)
Alô mundo
Estrutura de um app
Ciclo de vida
Múltiplas telas
Salvando e lendo preferências
ListView
Método
Um pequeno app para cada conceito
Ao final, um app completo para anotar suas palestras favoritas
Horário
De 14h a 18h
Pausa de 15 a 20 min no meio do minicurso
Android
Dispositivos
Smartphones: 240x320, 320x480, 480x800...
Tablets: 480x800, 600x1024, 800x1280...
TVs, consoles, computador pessoal...
Android, o sistema operacional
Comprado pela Google em 2005
Anunciado em 2007, lançado em 2008
Usa o kernel do Linux
Roda uma máquina virtual Java própria: Dalvik VM
Muitas bibliotecas Java funcionam sem alterações na Dalvik, mas nem todas
Empacotamento
Versões
1.0: muito antiga
2.0: smartphones
3.0: tablets
4.0: smartphones e tablets
Versões
http://developer.android.com/about/dashboards/index.html
2.3
4.0
2.2
4.1, 4.2
Ambiente de desenvolvimento
http://developer.android.com/tools/sdk/eclipse-adt.html
Emulador / Android Virtual Device (AVD)
Prática
Abrir o ambiente de desenvolvimento
Criar e executar uma AVD
Abrir o SDK Manager
Prática
Abrir o DDMS. Aba Emulator Control.
Simule uma ligação telefônica
Alô, Mundo!
Novo projeto
Novo projeto
Estrutura do app
src/ - código-fonte
res/ - telas, strings, ícone do app...
assets/ - outros arquivos usados por seu app (imagem, música, texto...)
gen/ - código-fonte gerado automaticamente
AndroidManifest.xml - configuração do app (nome, versão do Android, telas, permissões...)
Activity
Equivale a uma tela.
Ao criar um projeto, uma Activity (Main) é criada
Cada Activity é definida em dois arquivos...
res/layout/activity_nome.xml (visual)
src/.../NomeActivity.java (comportamento)
... e é listada no arquivo
AndroidManifest.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" />
</RelativeLayout>
res/layout/activity_main.xml
Layout
<?xml version="1.0" encoding="utf-8"?><resources>
<string name="app_name">Alo Mundo</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string>
</resources>
res/values/strings.xml
strings.xml
útil para traduzir um app para vários idiomas(um arquivo strings.xml por idioma)
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
src/.../MainActivity.java
Código Java
public final class R { public static final class layout { public static final int activity_main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; public static final int hello_world=0x7f040001; public static final int menu_settings=0x7f040002; } ...}
gen/R.java
R (arquivo gerado pelo compilador)
Cada recurso é identificado por um número.O compilador gera constantes para facilitar o
uso de recursos no código-fonte.
Prática
Substitua, no arquivo strings.xml, “Hello world!” por “Alo mundo!”
Execute o app.
Interação
Adicionar um botão
<RelativeLayout ... >
<TextView android:id="@+id/textView1" ... />
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="21dp" android:text="Button" />
</RelativeLayout>
res/layout/activity_main.xml
Ids!
public final class R { public static final class id { public static final int button1=0x7f070001; public static final int menu_settings=0x7f070002; public static final int textView1=0x7f070000; } ...}
gen/R.java
R (arquivo gerado pelo compilador)
<RelativeLayout ... >
<TextView android:id="@+id/textView1" ... />
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="21dp" android:text="Button" android:onClick="botaoClicado" />
</RelativeLayout>
res/layout/activity_main.xml
Clique!
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
public void botaoClicado(View v) { }}
src/.../MainActivity.java
Chama método botaoClicado
O que fazer quando clicar no botão?
1. Exibir algo na tela
2. Exibir algo no log
3. Mudar o texto do TextView
Toast (mensagem na tela)
Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT).show();
Log (não aparece para o usuário)
Log.i("minhatag", "Minha mensagem")
// Métodos de LogLog.v // VerboseLog.d // DebugLog.i // InfoLog.w // WarningLog.e // ErrorLog.wtf // What a Terrible Failure
public class MainActivity extends Activity {
...
public void botaoClicado(View v) { TextView tv = (TextView)findViewById(R.id.textView1); tv.setText("Clique!"); }}
src/.../MainActivity.java
Alterar o TextView (usa findViewById)
Prática
Adicione um campo de texto (EditText)
Ao clicar no botão, altere o TextView para o valor do campo de texto (use getText()).
Boa prática: crie um atributo para cada view e inicialize todos no onCreate (usando findViewbyId)
Ciclo de Vida de uma Activity
Ciclo de vida de uma Activity
onCreate
onStart
onResume onPause
onStop
onDestroy
ativa
onRestart
parcialmente visível
não visível
destruída
Prática
Implemente os métodos do ciclo de vida de uma activity para emitir uma mensagem de log para cada um
Tente fazer com que onDestroy seja chamado
Prática
Rotacione o dispositivo (Ctrl+F11). Quais métodos são chamados?
Preferências
Preferências
Como salvar dados para que eles possam ser acessados da próxima vez que o app seja executado?
SharedPreferences é uma forma conveniente de salvar pequenas quantidades de dados.
SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this);
Editor editor = prefs.edit();editor.putString("texto", texto);editor.commit();
Preferências
SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this);
String texto = prefs.getString("texto", "");
Salvando
Carregando
Prática
Faça o app guardar o texto
Carregue no onCreate, salve no onDestroy
Boa prática: use atributos static final para as chaves
Pausa
Intents
Intents
São mensagens que seu programa envia para o sistema para requisitar funcionalidades de outros componentes
Exemplo: uma Activity envia um Intent para requisitar ao sistema que outra Activity seja aberta
Outro exemplo: uma Activity envia um Intent para requisitar ao sistema que abra um navegador na página www.google.com
Intent intent = new Intent(this, OutraActivity.class);startActivity(intent);
MainActivity.java
Abrindo outra Activity
Pode ser chamado, por exemplo, ao clicar em um botão.
A nova Activity é empilhada sobre a atual.
finish();
OutraActivity
Fechando a Activity
Quando uma Activity é fechada (desempilhada), o sistema mostra
a Activity anterior, que estava abaixo da atual.
OutraActivity deve se fechar, e não empilhar MainActivity.
Prática
Crie um projeto.
Crie uma nova Activity, chamada OutraActivity
Na MainActivity, adicione um botão que, ao ser clicado, abre OutraActivity
Na OutraActivity, adicione um botão que, ao ser chamado, feche a Activity
Intent intent = new Intent(this, OutraActivity.class);intent.putExtra(“pi”, 3.14);startActivity(intent);
MainActivity.java
Passando dados de uma Activity para outra
Bundle extras = getIntent().getExtras()if (extras != null) { float x = extra.getFloat(“pi”);}
OutraActivity.java
Pode ser chamado no onCreate()
Intent intent = new Intent(this, OutraActivity.class);startActivityForResult(intent, 1234); MainActivity.java
Retornando dados de uma Activity
Intent data = new Intent();data.putExtra(“pi”, 3.14);setResult(RESULT_OK, data);finish();
OutraActivity.java
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1234 && resultCode == RESULT_OK) { float pi = data.getFloat(“pi”); } }
MainActivity.java
Prática
Intents Implícitos
// Abrir navegadorIntent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));startActivity(intent);
// Enviar mensagem (SMS)Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(android.content.Intent.EXTRA_TEXT, "Oi!");startActivity(intent);
ListView
String
ArrayAdapter
ListView
ListView: funcionamento
ListView
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<ListView android:id="@+id/mylist" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView>
</LinearLayout>
ListView
ListView listView = (ListView) findViewById(R.id.mylist);
listView.setAdapter(adapter);
ListView listView = (ListView) findViewById(R.id.mylist);
String[] values = new String[] { “Ada”, “Basic”, “C++” };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, // layout de um item values);
listView.setAdapter(adapter);
ArrayAdapter
listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// ...
}});
ListView: interação
Prática
Sistema para guardar palestras e cursos do SIECOMP.