Introdução ao Android
           Minicurso, 4h



    Rodrigo Rocha Gomes e Souza
        11 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




                                             4.0
                                                    4.1, 4.2

                                                        2.2
                                            2.3




http://developer.android.com/about/dashboards/index.html
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
Layout
                                   res/layout/activity_main.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>
strings.xml
                                  res/values/strings.xml


<?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>


  útil para traduzir um app para vários idiomas
        (um arquivo strings.xml por idioma)
Código Java
                                  src/.../MainActivity.java




public class MainActivity extends Activity {

	   @Override
	   protected void onCreate(Bundle savedInstanceState) {
	   	 super.onCreate(savedInstanceState);
	   	 setContentView(R.layout.activity_main);
	   }
}
R (arquivo gerado pelo compilador)
                                                    gen/R.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;
       }
       ...
   }



  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
Ids!
                                  res/layout/activity_main.xml
       <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>
R (arquivo gerado pelo compilador)


                                                  gen/R.java



  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;
      }
      ...
  }
Clique!
                                res/layout/activity_main.xml
 <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>
Chama método botaoClicado

                                  src/.../MainActivity.java


public class MainActivity extends Activity {

	   @Override
	   protected void onCreate(Bundle savedInstanceState) {
	   	 super.onCreate(savedInstanceState);
	   	 setContentView(R.layout.activity_main);
	   }

	   public void botaoClicado(View v) {
	   	
	   }
}
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 Log
Log.v    // Verbose
Log.d    // Debug
Log.i    // Info
Log.w    // Warning
Log.e    // Error
Log.wtf // What a Terrible Failure
Alterar o TextView (usa findViewById)


                                   src/.../MainActivity.java



public class MainActivity extends Activity {

	   ...

	   public void botaoClicado(View v) {
	   	 TextView tv = (TextView)findViewById(R.id.textView1);
	   	 tv.setText("Clique!");
	   }
}
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

                ativa

                                       parcialmente
  onResume                 onPause        visível


               onRestart
    onStart                 onStop      não visível




   onCreate                onDestroy    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.
Preferências

             SharedPreferences prefs = PreferenceManager
             	 	 .getDefaultSharedPreferences(this);
Salvando
             Editor editor = prefs.edit();
             editor.putString("texto", texto);
             editor.commit();




             SharedPreferences prefs = PreferenceManager
             	 	 .getDefaultSharedPreferences(this);
Carregando
             String texto = prefs.getString("texto", "");
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
Abrindo outra Activity

                                MainActivity.java



Intent intent = new Intent(this, OutraActivity.class);
startActivity(intent);




         Pode ser chamado, por exemplo,
             ao clicar em um botão.

    A nova Activity é empilhada sobre a atual.
Fechando a Activity

                  OutraActivity



                  finish();


        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
Passando dados de uma Activity para outra
                                      MainActivity.java


Intent intent = new Intent(this, OutraActivity.class);
intent.putExtra(“pi”, 3.14);
startActivity(intent);


                                     OutraActivity.java


        Bundle extras = getIntent().getExtras()
        if (extras != null) {
            float x = extra.getFloat(“pi”);
        }


            Pode ser chamado no onCreate()
Retornando dados de uma Activity

Intent intent = new Intent(this, OutraActivity.class);
                                                          MainActivity.java
startActivityForResult(intent, 1234);



        Intent data = new Intent();
        data.putExtra(“pi”, 3.14);           OutraActivity.java
        setResult(RESULT_OK, data);
        finish();




@Override
protected void onActivityResult(int requestCode,
                                                          MainActivity.java
                                int resultCode,
                                Intent data) {
  if (requestCode == 1234 && resultCode == RESULT_OK) {
    float pi = data.getFloat(“pi”);
  }
}
Prática
Intents Implícitos

   // Abrir navegador
Intent 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
ListView: funcionamento

                            ListView


             ArrayAdapter

  String
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);
ArrayAdapter




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);
ListView: interação



listView.setOnItemClickListener(new OnItemClickListener() {
	 @Override
	 public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {

	   	   // ...

	 }
});
Prática

Sistema para guardar palestras e cursos do SIECOMP.

Introdução ao Android (minicurso 4h)

  • 1.
    Introdução ao Android Minicurso, 4h Rodrigo Rocha Gomes e Souza 11 de março de 2013 X SIECOMP, UEFS
  • 2.
  • 3.
    Vocês Quem tem umaparelho Android? Quem programa em Java? Quem já programou pra Android, pelo menos um Hello World? Quem já programou pra outra plataforma móvel?
  • 4.
    Eu Doutorando em Ciênciada 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)
  • 5.
    Conteúdo Ambiente de desenvolvimento(ADT) Alô mundo Estrutura de um app Ciclo de vida Múltiplas telas Salvando e lendo preferências ListView
  • 6.
    Método Um pequeno apppara cada conceito Ao final, um app completo para anotar suas palestras favoritas
  • 7.
    Horário De 14h a18h Pausa de 15 a 20 min no meio do minicurso
  • 8.
  • 9.
    Dispositivos Smartphones: 240x320, 320x480,480x800... Tablets: 480x800, 600x1024, 800x1280... TVs, consoles, computador pessoal...
  • 10.
    Android, o sistemaoperacional 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
  • 11.
  • 12.
    Versões 1.0: muito antiga 2.0:smartphones 3.0: tablets 4.0: smartphones e tablets
  • 13.
    Versões 4.0 4.1, 4.2 2.2 2.3 http://developer.android.com/about/dashboards/index.html
  • 15.
  • 16.
  • 18.
    Emulador / AndroidVirtual Device (AVD)
  • 19.
    Prática Abrir o ambientede desenvolvimento Criar e executar uma AVD Abrir o SDK Manager
  • 20.
    Prática Abrir o DDMS.Aba Emulator Control. Simule uma ligação telefônica
  • 21.
  • 22.
  • 23.
  • 24.
    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...)
  • 25.
    Activity Equivale a umatela. 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
  • 26.
    Layout res/layout/activity_main.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>
  • 27.
    strings.xml res/values/strings.xml <?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> útil para traduzir um app para vários idiomas (um arquivo strings.xml por idioma)
  • 28.
    Código Java src/.../MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
  • 29.
    R (arquivo geradopelo compilador) gen/R.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; } ... } Cada recurso é identificado por um número. O compilador gera constantes para facilitar o uso de recursos no código-fonte.
  • 30.
    Prática Substitua, no arquivostrings.xml, “Hello world!” por “Alo mundo!” Execute o app.
  • 31.
  • 32.
  • 33.
    Ids! res/layout/activity_main.xml <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>
  • 34.
    R (arquivo geradopelo compilador) gen/R.java 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; } ... }
  • 35.
    Clique! res/layout/activity_main.xml <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>
  • 36.
    Chama método botaoClicado src/.../MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void botaoClicado(View v) { } }
  • 37.
    O que fazerquando clicar no botão? 1. Exibir algo na tela 2. Exibir algo no log 3. Mudar o texto do TextView
  • 38.
    Toast (mensagem natela) Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT).show();
  • 39.
    Log (não aparecepara o usuário) Log.i("minhatag", "Minha mensagem") // Métodos de Log Log.v // Verbose Log.d // Debug Log.i // Info Log.w // Warning Log.e // Error Log.wtf // What a Terrible Failure
  • 40.
    Alterar o TextView(usa findViewById) src/.../MainActivity.java public class MainActivity extends Activity { ... public void botaoClicado(View v) { TextView tv = (TextView)findViewById(R.id.textView1); tv.setText("Clique!"); } }
  • 41.
    Prática Adicione um campode 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)
  • 42.
    Ciclo de Vidade uma Activity
  • 43.
    Ciclo de vidade uma Activity ativa parcialmente onResume onPause visível onRestart onStart onStop não visível onCreate onDestroy destruída
  • 44.
    Prática Implemente os métodosdo ciclo de vida de uma activity para emitir uma mensagem de log para cada um Tente fazer com que onDestroy seja chamado
  • 45.
    Prática Rotacione o dispositivo(Ctrl+F11). Quais métodos são chamados?
  • 46.
  • 47.
    Preferências Como salvar dadospara que eles possam ser acessados da próxima vez que o app seja executado? SharedPreferences é uma forma conveniente de salvar pequenas quantidades de dados.
  • 48.
    Preferências SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); Salvando Editor editor = prefs.edit(); editor.putString("texto", texto); editor.commit(); SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); Carregando String texto = prefs.getString("texto", "");
  • 49.
    Prática Faça o appguardar o texto Carregue no onCreate, salve no onDestroy Boa prática: use atributos static final para as chaves
  • 50.
  • 51.
  • 52.
    Intents São mensagens queseu 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
  • 53.
    Abrindo outra Activity MainActivity.java Intent intent = new Intent(this, OutraActivity.class); startActivity(intent); Pode ser chamado, por exemplo, ao clicar em um botão. A nova Activity é empilhada sobre a atual.
  • 54.
    Fechando a Activity OutraActivity finish(); 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.
  • 55.
    Prática Crie um projeto. Crieuma 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
  • 56.
    Passando dados deuma Activity para outra MainActivity.java Intent intent = new Intent(this, OutraActivity.class); intent.putExtra(“pi”, 3.14); startActivity(intent); OutraActivity.java Bundle extras = getIntent().getExtras() if (extras != null) { float x = extra.getFloat(“pi”); } Pode ser chamado no onCreate()
  • 57.
    Retornando dados deuma Activity Intent intent = new Intent(this, OutraActivity.class); MainActivity.java startActivityForResult(intent, 1234); Intent data = new Intent(); data.putExtra(“pi”, 3.14); OutraActivity.java setResult(RESULT_OK, data); finish(); @Override protected void onActivityResult(int requestCode, MainActivity.java int resultCode, Intent data) { if (requestCode == 1234 && resultCode == RESULT_OK) { float pi = data.getFloat(“pi”); } }
  • 58.
  • 59.
    Intents Implícitos // Abrir navegador Intent 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);
  • 60.
  • 61.
    ListView: funcionamento ListView ArrayAdapter String
  • 62.
    ListView <?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns: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>
  • 63.
    ListView ListView listView =(ListView) findViewById(R.id.mylist); listView.setAdapter(adapter);
  • 64.
    ArrayAdapter 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);
  • 65.
    ListView: interação listView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // ... } });
  • 66.
    Prática Sistema para guardarpalestras e cursos do SIECOMP.