SlideShare uma empresa Scribd logo
Apresentação introdutória da
    plataforma Android




           Por: Júlio Cesar Bueno Cotta
   Mestrando em Ciência da Computação UFABC
    Graduado em Ciência da Computação UFV
Sumário

○ Introdução
     ■ Material didático
○ O que interessa!
○ Preparando o ambiente...
     ■ Antes de começar a programar...
     ■ Configurando o Eclipse
○ Finalmente..Hello World!
○ NotePad V1
○ NotePad V2
○ NotePad V3
Aviso




Atenção, muitos códigos fonte serão mostrados nesta
apresentação, não utilize Ctrl + C e Ctrl + V!

Escreva-os, você está aprendendo, não pode ter preguiça!
E afinal de contas são poucas linhas..por slide. :-D
Material didático

Muito material na internet sobre Android:

 ● Para usuários;
 ● Para desenvolvedores;
Material didático

Muito material na internet sobre Android:

 ● Para usuários;
 ● Para desenvolvedores;

O que interessa para nos:
http://developer.android.com/


Inglês é importante!
Material didático

Mas se Inglês não é seu forte, temos muito material em
Português...
    ○ Portal Android (forum)
    ○ Android Brasil - dev (Lista de e-mail)
    ○ Android Brasil (Lista de e-mail de usuários)
    ○ Android Brasil - Projetos
    ○ Eu Android (blog)
    ○ AndroidBlog
    ○ BlogDoAndroid
    ○ e muito mais...
Antes de começarmos a programar..

Vamos precisar de algumas ferramentas:

    ○ JDK
    ○ Eclipse 3.5
    ○ Eclipse plugin for Android
    ○ SDK Android

Você pode utilizar qualquer IDE,
mas o Google recomenda o Eclipse,
então, porque não?!
Configurando o Eclipse

- Faça o download do JDK para seu sistema operacional e instale;
- Faça o download do Eclipse classico e descompacte o arquivo em
"Meus Documentos";
- Faça o download do SDK do Android na versão .zip e descompacte
em "Meus Documentos";
- Abra o Eclipse e vá em Help > Install New Software > Add...> Add
Repository

https://dl-ssl.google.com/android/eclipse/

Fonte:
http://developer.android.com/sdk/installing.html
http://developer.android.com/sdk/eclipse-adt.html#installing
Configurando o Eclipse

Faça junto comigo...

Vamos "dizer" ao Eclipse a localização do SDK Android no
nosso HD, baixar o emulador da versão do Android desejada e
criar uma maquina virtual Android.

Como esta parte demora um pouco, vamos deixar sendo executada e
continuar a apresentação, mas qualquer dúvida é so me perguntar.




Um tutorial desta parte é encontrado aqui
http://www.androidbrasilprojetos.org/tutoriais/instalando-e-configurando-o-
android-sdkeclipse/
Introdução ao sistema...

● Android é um sistema operacional multi-usuário no qual cada
  aplicação é executada sob um usuário Linux diferente.
● Por padrão, o sistema atribui para cada aplicação um ID de
  usuário Linux e organiza as permissões de todos os arquivos da
  aplicação de modo que somente o usuário com aquele ID tenha
  acesso aos arquivos.
● Cada processo tem sua própria maquina virtual (VM), assim o
  código de uma aplicação é executado de maneira independente
  das outras.
Introdução ao sistema...

● Android é um sistema operacional multi-usuário no qual cada
  aplicação é executada sob um usuário Linux diferente.
● Por padrão, o sistema atribui para cada aplicação um ID de
  usuário Linux e organiza as permissões de todos os arquivos da
  aplicação de modo que somente o usuário com aquele ID tenha
  acesso aos arquivos.
● Cada processo tem sua própria maquina virtual (VM), assim o
  código de uma aplicação é executado de maneira independente
  das outras.
                Segurança e controle!
Introdução ao sistema...

Componentes de uma aplicação:

Activities
Uma Activity representa uma tela de interface com o usuário, é a unidade
básica para desenvolvimento de aplicações Android.
Uma Activity é implementada como uma subclasse de Activity ou uma
subclasse das classes filhas de Activity, exemplo ListActivity, TabActivity e
MapActivity.
Introdução ao sistema...

Exemplos...
Introdução ao sistema..


Services
Um Service é um componente que é executado em background executando
operações de longa duração. Services não possiuem interfaces com o usuário,
mas pode se comunicar com outros componentes através de chamadas
remotas.
Um Service é implementado como uma subclasse de Service.
Introdução ao sistema..

Content providers
Um content provider gerencia um conjunto compartilhado de dados de
aplicações.Content provider é implementado como uma subclasse
de ContentProvider e deve implementar um conjunto de métodos para ser util e
acessível por outras aplicações.
Broadcast receivers
Um broadcast receiver é um componente que responde a uma grande
variedade de mensagens de broadcast do sistema.Um broadcast receiver é
implementado como uma subclasse de BroadcastReceiver e cada broadcast é
integrado como uma Intent.
Activities...LifeCycle

O mais básico é saber
sobre como funcionam
as Activities...

onCreate()
onResume()
onPause()
onStop()
onDestroy()



Fonte:
http://developer.android.com/guide/topics/fundamentals/activities.html
Finalmente..Hello World!

Criar um novo Android Projeto, nomeio de "HelloAndroid".

O wizard vai pedir algumas informações:
  ● Project name: HelloAndroid
  ● Application name: Hello, Android <<= Nome que aparece na tela
  ● Package name: com.example.helloandroid
  ● Create Activity: HelloAndroid



Fonte:
http://developer.android.com/resources/tutorials/hello-world.html
Nossa primeira Activity
HelloAndroid.java

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);
  }
}
Nossa primeira Activity
HelloAndroid.java

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
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");
     setContentView(tv);
  }
}
Nossa primeira Activity
A estrutura básica de um projeto
                    Android
Projeto
  src/
  gen/
  res/
  AndroidManifest.xml
  default.properties



  Arquivo muito importante do projeto:
  AndroidManifest.xml
  Vamos falar dele depois...
Hello World again, mas pouco diferente

HelloAndroid.java

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);
  }
}
                  Igual a primeira versão do arquivo!
Hello World again, mas pouco diferente

/res/layout/main.xml



<?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"/>
Hello World again, mas pouco diferente

/res/values/strings.xml



<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="hello">Hello, Android! I am a string resource!</string>
   <string name="app_name">Hello, Android</string>
</resources>
Hello World

Parabéns, você acaba de executar seu primeiro programa
                      Android!
Hello World complete!

Você quer tentar o NotePad?
Hello World complete!

Você quer tentar o NotePad?
NotePad


       ○ O tutorial do NotePad é dividido em três execícios.
       ○ Em cada exercício partes diferentes do sistema são
         exploradas.
       ○ É muito didático!
       ○ É completo (lifecycle)!
       ○ Tratamento de eventos assincronos e acesso a DB.
       ○ Comunicação entre Activities.

Original em : http://developer.android.com/resources/tutorials/notepad/notepad-ex1.html
NotePad


Antes de desenvolver o projeto..
Vamos pensar um pouco em como será a aplicação.

Sim, levantamento de requisitos!

"Eu gostaria de poder listar todas as notas guardadas na
aplicação."
"Eu gostaria de poder adicionar notas."
"Eu gostaria de poder editar uma nota."
NotePad




Agora que já temos formalizado mentalmente o que
         iremos fazer, vamos trabalhar!
NotePad V1


Fazer o download dos projetos em:
http://developer.android.com/resources/tutorials/notepad/codelab/NotepadCodeLab.zip

Crie um novo projeto Android no Eclipse (File > New > Android
Project) e configure para utilizar um código fonte já existente (opção
Create project from existing source) do projeto NotePadv1.
NotePad V1


      ○ Exercício número 1!
Missão do exercício:
Construir uma lista simples de notas que permita ao usuário adicionar notas,
mas não permita edita-las.

O que aprenderemos:
Este exercício demonstra o básico sobre ListActivity, a criação e manipulação
de opções de menu e a utilização do SQLite para armazenar as notas.
NotePad V1


Vamos estudar os arquivos fornecidos no projeto.
Abra o arquivo NotesDbAdapter.java

Note que:
  ○ SQLite nativo;
  ○ Constantes de banco são uma boa prática de programação;
  ○ Métodos para CRUD (Create,Read,Up,Del);
  ○ Android trabalha com Cursores;
NotePad V1


/**
* Retorna todas as notas no banco de dados em um Cursor.
**/
public Cursor fetchAllNotes() {
    return mDb.query(
            DATABASE_TABLE,
            new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY},
            null, null, null, null, null);
}
NotePad V1
/**
* Retorna somente a nota com o valor de rowId
**/
public Cursor fetchNote(long rowId) throws SQLException {
    Cursor mCursor =
      mDb.query(
                true,
                DATABASE_TABLE,
                new String[] {KEY_ROWID,KEY_TITLE,
KEY_BODY},                                   KEY_ROWID + "=" + rowId,
                null, null, null, null, null);
      if (mCursor != null) {
          mCursor.moveToFirst();
      }
      return mCursor;
    }
NotePad V1
mDb.query(
           true,
           DATABASE_TABLE,
           new String[] {KEY_ROWID,KEY_TITLE,
KEY_BODY},                     KEY_ROWID + "=" + rowId,
                   null, null, null, null, null);


query(boolean distinct, String table, String[] columns, String selection, String[]
selectionArgs, String groupBy, String having, String orderBy, String limit)
Query the given URL, returning a Cursor over the result set.

"SELECT KEY_ROWID,KEY_TITLE, KEY_BODY FROM DATABASE_TABLE
WHERE KEY_ROWID + "=" + rowId;"
NotePad V1
A tela com lista de notas fica definida em um arquivo XML.
Abrir o arquivo notepad_list.xml

<?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>
NotePad V1
<LinearLayout>             <RelativeLayout>              <TableLayout>
</LinearLayout>            </RelativeLayout>             </TableLayout>




fonte: http://developer.android.com/resources/tutorials/views/index.html
NotePad V1
Voltando ao layout do projeto...

<ListView android:id="@android:id/list"/>

<TextView android:id="@android:id/empty"
    android:text="@string/no_notes"/>

"list" e "empty" trabalham em conjunto, são ids defindos pelos
desenvolvedores do SDK Android.

"Se o objeto ListView de id list estiver vazio, mostre o conteúdo do TextView
de id empty"
NotePad V1


Mas onde está a definição dos itens da nossa lista?
Neste caso, cada linha da nossa lista conterá somente um
texto com o título da nota.

Criar o arquivo notes_row.xml

<?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"/>
NotePad V1

Agora, abra Notepadv1.java

Para que possamos mostrar uma lista na tela, temos que
utilizar como base uma ListActivity.

Então vamos mudar a declaração de herança da classe

public class Notepadv1 extends ListActivity
NotePad V1

Declare no inicio da classe um objeto para manipular os dados
do banco de dados:

  private NotesDbAdapter mDbHelper;


Através dele iremos executar as operações de CRUD, você se
lembra o que significa CRUD?
NotePad V1

Declare no inicio da classe um objeto para manipular os dados
do banco de dados:

  private NotesDbAdapter mDbHelper;


Através dele iremos executar as operações de CRUD, você se
lembra o que significa CRUD?
                           Create
                          Retrieve
                           Update
                           Delete
NotePad V1

Deixe o método OnCreate() assim:
 @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.notepad_list);
    mDbHelper = new NotesDbAdapter(this);
    mDbHelper.open();
    fillData();
  }

Nos ainda não declaramos fillData(), mas não se incomode com o
Eclipse reclamando..
NotePad V1

Então vamos implementa-lo:

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);
 }
NotePad V1

Porque implementar o método fillData() ao invés de
simplesmente colocar aquele código no corpo do método
onCreate()?




O que o método fillData() faz?
NotePad V1

Porque implementar o método fillData() ao invés de
simplesmente colocar aquele código no corpo do método
onCreate()?

Nos vamos precisar de chamar aquele código em outros
métodos!


O que o método fillData() faz?
Atualiza a lista na tela com o conteúdo do banco de dados!
Vamos dar mais uma olhada naquele código..
NotePad V1


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);
 }
NotePad V1

Precisamos de um modo de deixar o usuário adicionar notas a
nossa aplicação, para isso utilizaremos, inicialmente, o evento
de pressionar botão físico de Menu.

Vamos criar o menu com a mensagem "Add nota", para isso
sobrescrevemos o método onCreateOptionsMenu de ListActitivy.

Para poder perceber qual item do nosso menu foi apertado
temos que sobrescrever outro método, o onOptionsItemSelected.

Estes métodos são como queijo e goiabada, eles se
completam!
NotePad V1

Declare no inicio da classe:
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;
  }

No arquivo strings.xml, adicione:

<string name="menu_insert">Add Item</string>
NotePad V1

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case INSERT_ID:
       createNote();
       break;
    }

      return super.onOptionsItemSelected(item);
  }

Está quase acabando..só criarmos o método createNote()
NotePad V1

Declare no fim da classe:

private void createNote() {
     String noteName = "Note " + mNoteNumber++;
     mDbHelper.createNote(noteName, "");
     fillData();
   }

Cria notas vazias com nome "Note 1", "Note 2"...

Hora de testar..Execute a aplicação..
(Run As > Android Application.)
Troll

Mas seu programa não faz nada que
presta! Que isso?!
So tem como colocar notas vazias e
Com titulo automático!
NotePad V2

Você quer tentar o NotePad V2?
NotePad V2

Você quer tentar o NotePad V2?




               Depois do almoço? :-D
NotePad V2

      ○ Exercício número 2!
Missão do exercício:
Nesta versão vamos adicionar a possibilidade de apagar uma nota e vamos
adicionar uma segunda Activity que nos permita adicionar e editar notas.

O que aprenderemos:
Como adicionar uma nova Activity, ao Android manifest, como passar dados
entre Activities, e a utilizar um layout de tela mais avanço. Também vamos ver
o funcionamento do método startActivityForResult().
NotePad V2

Crie um novo projeto Android no Eclipse
(File > New > Android Project) e configure para utilizar um
código fonte já existente (opção Create project from existing
source) do projeto NotePadv2.
NotePad V2



Vamos dar um confere no que mudou do do V1 para o V2.

/res/values/strings.xml
Há novas strings definidas.

/src/com/android/demo/notepad2/NotePadV2.java
Novas constantes, novos métodos são sobrescritos e a
definição do Cursor mNotesCursor.
NotePad V2

Vamos dar uma olhada no método fillData(), ele foi modificado pa
utilizar o Cursor mNotesCursor
private void fillData() {
     mNotesCursor = mDbHelper.fetchAllNotes();
     startManagingCursor(mNotesCursor);

      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, mNotesCursor,
from, to);
     setListAdapter(notes);

  }
NotePad V2




                 Pois bem...
Como podemos deixar o usuário apagar uma nota?
NotePad V2




                 Pois bem...
Como podemos deixar o usuário apagar uma nota?

  Ele deve, de algum modo, selecionar um item da
lista para podermos saber sobre qual item ele quer
                  aplicar uma ação.
NotePad V2


Antes de mais nada, vamos adicionar a seguinte linha ao
onCreate() do NotePadV2:

             registerForContextMenu(getListView());

Ela permite que os itens da lista (ListView) se registrem no
menu de contexto.
Como nossa Activity estende ListActivity basta usar
getListView() para recuperar a lista que está sendo usada no
layout.

               setContentView(R.layout.notes_list);
NotePad V2

Para saber qual item da lista foi selecionado a classe
ListActivity possui alguns métodos...

Se você exectuar um long press sobre um item da lista será
criado um menu de contexto chamando o método:
 @Override
  public void onCreateContextMenu(ContextMenu menu, View v,
       ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

      // TODO: fill in rest of method
  }

Não confundir com public boolean onCreateOptionsMenu(Menu menu)!
NotePad V2

Lembre-se, o que você quer é adicionar uma opção ao objeto "menu" de modo
que permita que o item selecionado seja removido!

  @Override
  public void onCreateContextMenu(ContextMenu menu, View v,
       ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, DELETE_ID, 0, R.string.menu_delete);

 }
Quando você executar um long press apareceráum menu com o texto escrito em
R.string.menu_delete. <string name="menu_delete">Delete Note</string>
NotePad V2

Você ainda não especificou o que irá acontecer quando o
usuário escolher esse item de menu...
    @Override
    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);
}
NotePad V2


...
switch(item.getItemId()) {
    case DELETE_ID:
      AdapterContextMenuInfo info =
      (AdapterContextMenuInfo) item.getMenuInfo();
       mDbHelper.deleteNote(info.id);
...
onContextItemSelected() é chamado pelo sistema quando um item é
selecionado, veja que para saber qual item do menu foi selecionado é
utiliado a constante DELETE_ID. O ID do elemento selecionado
dentro do DB é info.id!
                      Mas como isso é possível?
NotePad V2
                   "Isso não é magia, é tecnologia!"
public Cursor fetchAllNotes() {
  return mDb.query(
          DATABASE_TABLE,
          new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY},
          null, null, null, null, null);
}

Quando buscamos todas as notas no banco, o Cursor retornado, traz o
conteúdo da coluna KEY_ROWID.
public static final String KEY_ROWID = "_id";

Se você utilizar a coluna ID como "_id" na suas aplicações, o Android quase
que faz mágica!

Veja o próximo slide..
NotePad V2
mNotesCursor recebe o retorno de fetchAllNotes() e é passado como
parâmetro para o construtor de SimpleCursorAdapter.
O SimpleCursorAdapter() procura por uma coluna "_id" e já associa cada item
da lista a ser mostrado (NotesDbAdapter.KEY_TITLE) com aquele ID!

private void fillData() {
     mNotesCursor = mDbHelper.fetchAllNotes();
     startManagingCursor(mNotesCursor);
     String[] from = new String[] { NotesDbAdapter.KEY_TITLE };
     int[] to = new int[] { R.id.text1 };

     SimpleCursorAdapter notes =
        new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor,
from, to);
     setListAdapter(notes);

  }
NotePad V2

Vamos modificar o método createNote() para permitir a criação
de notas de maneira mais "profissional".

Vamos criar uma nova tela (leia-se Activity) para permitir a
entrada de dados para a criação e edição das notas.

Na nova tela, vamos entrar com o título da nota e com o corpo
da nota, mas toda a parte de acesso ao DB fica em NotePad.
java e teremos que retornar esses valores.

A mesma tela pode criar ou editar uma nota, ok?
NotePad V2

No arquivo NotePadV2.java temos o método:
  private void createNote() {
     // TODO: fill in implementation

  }
Que não faz nada...
NotePad V2

No arquivo NotePadV2.java temos o método:
  private void createNote() {
     Intent i = new Intent(this, NoteEdit.class);
     startActivityForResult(i, ACTIVITY_CREATE);
  }

Declara a intenção de lançar uma nova Activity passando o
contexto como primeiro parâmetro e qual Activity como
segundo parâmetro para o construtor da Intent.

O método startActivityForResult() inicia uma Intent e também
recebe como parâmetro a constante ACTIVITY_CREATE que
serve como identificador do porque a Intent foi iniciada.
NotePad V2


Três perguntas podem vir a sua mente...
1° Porque tenho que identificar o motivo pelo qual criei uma
Intent?




2° Porque aquele método tem no nome "ForResult" ?



3° Nós já almoçamos?
NotePad V2


Três perguntas podem vir a sua mente.
1° Porque tenho que identificar o motivo pelo qual criei uma
Intent?
 Porque nos vamos iniciar a mesma Activity para criar uma
nota e para editar uma nota e temos que saber diferenciar
cada caso.

2° Porque aquele método tem no nome "ForResult" ?
Porque quando a Activity iniciada pelo método terminar sua
execução, nós vamos querer saber qual foi o resultado dela.

3° Nós já almoçamos?
Espero que sim, senão eu estarei morrendo de fome!
NotePad V2

Ignore o Eclipse reclamando que não existe a classe NoteEdit.
java e vamos continuar preenchendo o corpo dos métodos...
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    // TODO: fill in rest of method
}

Este método é chamado quando clicamos em um item da lista de
notas. O que deve acontecer com fizermos isso?
NotePad V2

Ignore o Eclipse reclamando que não existe a classe NoteEdit.
java e vamos continuar preenchendo o corpo dos métodos...
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    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)));

...Continua....
NotePad V2

...
      i.putExtra(NotesDbAdapter.KEY_ROWID, id);
      i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
      c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)));

...

Você passa valores de uma Activity para outra através de Extras adicionados
na Intent antes de iniciar a nova Activity.
Cada Extra defini um identificador único e um valor.
Exemplo:
"NotesDbAdapter.KEY_ROWID" é um identificador e "id" um valor a ser
passado para a Activity associada a Intent "i".
 NotesDbAdapter.KEY_TITLE é o identificador e o resultado de c.getString() o
valor.
NotePad V2

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

...Parte mostrada anteriomente...

     i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
     c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY)));

     startActivityForResult(i, ACTIVITY_EDIT);
 }
         O que o método onListItemClick() está fazendo?
NotePad V2

Ele está passando todos os dados de uma Note para a Activity
NoteEdit.class.

NoteEdit não precisa buscar no banco de dados as
informações relativas a Note que estará sendo editada, basta
pegar a partir dos Extras incluídos na chamada.
NotePad V2

Método completo:
   @Override
   protected void onListItemClick(ListView l, View v, int position, long id) {
     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);
   }
Acesso a variável local é muito mais "barato" do que acesso a variáveis
globais.
NotePad V2

Quando NoteEdit terminar de executar será chamado o método
onActivityResult(), nele iremos fazer a real edição das
informações no banco de dados.

  @Override
  protected void onActivityResult(int requestCode, int
resultCode, Intent intent) {
     super.onActivityResult(requestCode, resultCode, intent);

      // TODO: fill in rest of method

  }
NotePad V2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
   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;
...Continua... Retiramos dos "Extras" valores que foram adicionados em
NoteEdit. Não são os mesmos valores dos slides atras.
NotePad V2
...Continuação...

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;
}

NoteEdit pode ter sido chamada par criar uma nota (ACTIVITY_CREATE) ou
para editar uma nota (ACTIVITY_EDIT), combase no requestCode sabemos
qual é o caso.
NotePad V2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
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;
}
NotePad V2
Agora vamos estudar o layout da tela de edição de Notes, abra
o arquivo /res/layout/note_edit.xml
Elementos novos:

  <EditText android:id="@+id/title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_weight="1"/>

  <Button android:id="@+id/confirm"
     android:text="@string/confirm"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
NotePad V2
A classe NoteEdit.java irá utilizar o layout note_edit.xml e
"amarrar" objetos Java aos objetos descritos no arquivo XML.

Depois disso precisamos verificar se foram passadas variáveis
para a Activity, se sim, mostra-los nos campos de texto.

Também precisamos definir o "valor de retorno" da Activity, ou
seja, definir quais dados serão passados a Activity NotePadV2
quando NoteEdit terminar sua execução.
NotePad V2
Crie a classe NoteEdit.java e preencha o onCreate() com:
  private EditText mTitleText;
  private EditText mBodyText;
  private Long mRowId;

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

  mTitleText = (EditText) findViewById(R.id.title);
  mBodyText = (EditText) findViewById(R.id.body);

  Button confirmButton = (Button) findViewById(R.id.confirm);

   mRowId = null;
   Bundle extras = getIntent().getExtras();
...Continua...
NotePad V2
  if (extras != null) {
      //Se chegar aqui estamos editando uma nota!
      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);
     }
   }
...Continua...
NotePad V2
confirmButton.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
     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();
   }     }); }
NotePad V2

Antes de executar o V2, temos que adicionar a Activity
NoteEdit ao AndroidManifest.xml, este é o arquivo de controle
da aplicação, nele listamos quais Activities serão chamadas no
decorrer da execução da aplicação, quais permissões a
aplicação possui, entre outros.
NotePad V2

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.demo.notepad2">
  <application android:icon="@drawable/icon">
    <activity android:name=".Notepadv2" 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>
NotePad V2

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.demo.notepad2">
  <application android:icon="@drawable/icon">
    <activity android:name=".Notepadv2" 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=".NoteEdit"></activity>
  </application>
</manifest>
NotePad V2

Esta aplicação tem somente duas Activities e não possui
permissões.
Entre as possíveis permissões existentes, temos:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission
       android:name="android.permission.INTERNET" />
<uses-permission
       android:name="android.permission.ACCESS_NETWORK_STATE" />

Mais explicações aqui:
http://developer.android.com/guide/topics/security/security.html
NotePad V2

Agora sim, execute a aplicação no emulador e vamos ver o
resultado!
NotePad V2

Parabéns, você acaba de terminar o segundo exercício!

Mais conteúdo relacionado

PDF
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
PPT
Introdução à programação para Android
PDF
Desenvolvendo para Android
PDF
Google android pdf
PDF
Desenvolvimento móvel com Google Android
PDF
2017 08-11 - Androidos V - Minicurso - Introdução ao android
PDF
Introdução ao android - siecomp 2015.1
PDF
Introdução ao Android Studio
Desenvolvendo aplicações em Java para o Google Android - Ranieri de Souza Fer...
Introdução à programação para Android
Desenvolvendo para Android
Google android pdf
Desenvolvimento móvel com Google Android
2017 08-11 - Androidos V - Minicurso - Introdução ao android
Introdução ao android - siecomp 2015.1
Introdução ao Android Studio

Mais procurados (20)

PDF
Android Studio
PPTX
Introdução ao desenvolvimento de apps para Android - Dia 2/2
PPT
Jugday - Java Básico
PDF
Introducao Spring ROO
PDF
Capítulo 01 - Fundamentos de Android e o HelloWorld
PDF
Minicurso de Android
PDF
Curso de Groovy
PDF
Seminário SD - Ambiente de Desenvolvimento para Android
PDF
Introdução ao Desenvolvimento Android
PPTX
Atividades e Intenções (Android)
PPTX
Aula02 android hands_on
ODP
Android Studio: Primeiros Passos
ODP
Pesl introducao a programacao para android
PDF
Android Aula 5
PDF
Caelum Day In Rio
PPTX
Introdução à plataforma Android
PDF
Android - Conceito e Arquitetura
PDF
Apostila passo a passo como programar em android edição03
PDF
Tutorial de Instalação Eclipse + Android SDK
Android Studio
Introdução ao desenvolvimento de apps para Android - Dia 2/2
Jugday - Java Básico
Introducao Spring ROO
Capítulo 01 - Fundamentos de Android e o HelloWorld
Minicurso de Android
Curso de Groovy
Seminário SD - Ambiente de Desenvolvimento para Android
Introdução ao Desenvolvimento Android
Atividades e Intenções (Android)
Aula02 android hands_on
Android Studio: Primeiros Passos
Pesl introducao a programacao para android
Android Aula 5
Caelum Day In Rio
Introdução à plataforma Android
Android - Conceito e Arquitetura
Apostila passo a passo como programar em android edição03
Tutorial de Instalação Eclipse + Android SDK
Anúncio

Destaque (19)

PPTX
Dia 1 android diogo henrique
PDF
Hello World Android
PDF
Hello world ao mundo mobile focado no android
PDF
Android Secomp 2011
PDF
Aula 02 fundamentos
PPTX
Minicurso2013
ODP
Hello World Android
PPT
Desenvolvendo Soluções com Android
PDF
Minicurso Programação Android
PPTX
Slidshared
PDF
Aula android 01.pdf
PPTX
Introdução ao desenvolvimento de apps para Android - Dia 1/2
PPT
Implantação de um ERP - Vantagens e Dificuldades
PPTX
Cenário do mercado erp
PDF
Sistema De Gestao Empresarial Erp
PPS
Sobre Erp (Basico)
PPTX
SIG: MRP, ERP, CRM e SCM
PPTX
Sistema Operacional Android
PDF
Desenvolvimento Android: Faça da maneira certa
Dia 1 android diogo henrique
Hello World Android
Hello world ao mundo mobile focado no android
Android Secomp 2011
Aula 02 fundamentos
Minicurso2013
Hello World Android
Desenvolvendo Soluções com Android
Minicurso Programação Android
Slidshared
Aula android 01.pdf
Introdução ao desenvolvimento de apps para Android - Dia 1/2
Implantação de um ERP - Vantagens e Dificuldades
Cenário do mercado erp
Sistema De Gestao Empresarial Erp
Sobre Erp (Basico)
SIG: MRP, ERP, CRM e SCM
Sistema Operacional Android
Desenvolvimento Android: Faça da maneira certa
Anúncio

Semelhante a Apresentacao android por Júlio Cesar Bueno Cotta (20)

PDF
Introdução ao android e plataforma android
PDF
Introdução ao Android (minicurso 4h)
PDF
Apostila android
PDF
Apostila android
PDF
Apostila android
PDF
Android Core Aula 6 - Desenvolvimento de aplicações Android
PPTX
Computação Móvel 2012.2 - Android
PDF
Introdução à programação em Android - Alcides Maya 16.04.2013
PDF
Aulas Google Android
PDF
Primeira aula desenvolvimento para Android
PDF
Descomplicando o Android
PPTX
Oficina Sesc Android - V1
PPTX
Aula01 - introdução, Activity
PDF
Minicurso iniciando com Android no Androidos Day
PDF
Android Aula 2
PDF
Apostila android
PDF
Introdução a Plataforma Android
PDF
Desenvolvimento de Aplicativos para a Plataforma Android
PDF
Android 2303
Introdução ao android e plataforma android
Introdução ao Android (minicurso 4h)
Apostila android
Apostila android
Apostila android
Android Core Aula 6 - Desenvolvimento de aplicações Android
Computação Móvel 2012.2 - Android
Introdução à programação em Android - Alcides Maya 16.04.2013
Aulas Google Android
Primeira aula desenvolvimento para Android
Descomplicando o Android
Oficina Sesc Android - V1
Aula01 - introdução, Activity
Minicurso iniciando com Android no Androidos Day
Android Aula 2
Apostila android
Introdução a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma Android
Android 2303

Último (20)

PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
PPTX
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PPTX
Émile Durkheim slide elaborado muito bom
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Aula 18 - Manipulacao De Arquivos python
Processos na gestão de transportes, TM100 Col18
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Apple Pippin Uma breve introdução. - David Glotz
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
COBITxITIL-Entenda as diferença em uso governança TI
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Émile Durkheim slide elaborado muito bom
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx

Apresentacao android por Júlio Cesar Bueno Cotta

  • 1. Apresentação introdutória da plataforma Android Por: Júlio Cesar Bueno Cotta Mestrando em Ciência da Computação UFABC Graduado em Ciência da Computação UFV
  • 2. Sumário ○ Introdução ■ Material didático ○ O que interessa! ○ Preparando o ambiente... ■ Antes de começar a programar... ■ Configurando o Eclipse ○ Finalmente..Hello World! ○ NotePad V1 ○ NotePad V2 ○ NotePad V3
  • 3. Aviso Atenção, muitos códigos fonte serão mostrados nesta apresentação, não utilize Ctrl + C e Ctrl + V! Escreva-os, você está aprendendo, não pode ter preguiça! E afinal de contas são poucas linhas..por slide. :-D
  • 4. Material didático Muito material na internet sobre Android: ● Para usuários; ● Para desenvolvedores;
  • 5. Material didático Muito material na internet sobre Android: ● Para usuários; ● Para desenvolvedores; O que interessa para nos: http://developer.android.com/ Inglês é importante!
  • 6. Material didático Mas se Inglês não é seu forte, temos muito material em Português... ○ Portal Android (forum) ○ Android Brasil - dev (Lista de e-mail) ○ Android Brasil (Lista de e-mail de usuários) ○ Android Brasil - Projetos ○ Eu Android (blog) ○ AndroidBlog ○ BlogDoAndroid ○ e muito mais...
  • 7. Antes de começarmos a programar.. Vamos precisar de algumas ferramentas: ○ JDK ○ Eclipse 3.5 ○ Eclipse plugin for Android ○ SDK Android Você pode utilizar qualquer IDE, mas o Google recomenda o Eclipse, então, porque não?!
  • 8. Configurando o Eclipse - Faça o download do JDK para seu sistema operacional e instale; - Faça o download do Eclipse classico e descompacte o arquivo em "Meus Documentos"; - Faça o download do SDK do Android na versão .zip e descompacte em "Meus Documentos"; - Abra o Eclipse e vá em Help > Install New Software > Add...> Add Repository https://dl-ssl.google.com/android/eclipse/ Fonte: http://developer.android.com/sdk/installing.html http://developer.android.com/sdk/eclipse-adt.html#installing
  • 9. Configurando o Eclipse Faça junto comigo... Vamos "dizer" ao Eclipse a localização do SDK Android no nosso HD, baixar o emulador da versão do Android desejada e criar uma maquina virtual Android. Como esta parte demora um pouco, vamos deixar sendo executada e continuar a apresentação, mas qualquer dúvida é so me perguntar. Um tutorial desta parte é encontrado aqui http://www.androidbrasilprojetos.org/tutoriais/instalando-e-configurando-o- android-sdkeclipse/
  • 10. Introdução ao sistema... ● Android é um sistema operacional multi-usuário no qual cada aplicação é executada sob um usuário Linux diferente. ● Por padrão, o sistema atribui para cada aplicação um ID de usuário Linux e organiza as permissões de todos os arquivos da aplicação de modo que somente o usuário com aquele ID tenha acesso aos arquivos. ● Cada processo tem sua própria maquina virtual (VM), assim o código de uma aplicação é executado de maneira independente das outras.
  • 11. Introdução ao sistema... ● Android é um sistema operacional multi-usuário no qual cada aplicação é executada sob um usuário Linux diferente. ● Por padrão, o sistema atribui para cada aplicação um ID de usuário Linux e organiza as permissões de todos os arquivos da aplicação de modo que somente o usuário com aquele ID tenha acesso aos arquivos. ● Cada processo tem sua própria maquina virtual (VM), assim o código de uma aplicação é executado de maneira independente das outras. Segurança e controle!
  • 12. Introdução ao sistema... Componentes de uma aplicação: Activities Uma Activity representa uma tela de interface com o usuário, é a unidade básica para desenvolvimento de aplicações Android. Uma Activity é implementada como uma subclasse de Activity ou uma subclasse das classes filhas de Activity, exemplo ListActivity, TabActivity e MapActivity.
  • 14. Introdução ao sistema.. Services Um Service é um componente que é executado em background executando operações de longa duração. Services não possiuem interfaces com o usuário, mas pode se comunicar com outros componentes através de chamadas remotas. Um Service é implementado como uma subclasse de Service.
  • 15. Introdução ao sistema.. Content providers Um content provider gerencia um conjunto compartilhado de dados de aplicações.Content provider é implementado como uma subclasse de ContentProvider e deve implementar um conjunto de métodos para ser util e acessível por outras aplicações. Broadcast receivers Um broadcast receiver é um componente que responde a uma grande variedade de mensagens de broadcast do sistema.Um broadcast receiver é implementado como uma subclasse de BroadcastReceiver e cada broadcast é integrado como uma Intent.
  • 16. Activities...LifeCycle O mais básico é saber sobre como funcionam as Activities... onCreate() onResume() onPause() onStop() onDestroy() Fonte: http://developer.android.com/guide/topics/fundamentals/activities.html
  • 17. Finalmente..Hello World! Criar um novo Android Projeto, nomeio de "HelloAndroid". O wizard vai pedir algumas informações: ● Project name: HelloAndroid ● Application name: Hello, Android <<= Nome que aparece na tela ● Package name: com.example.helloandroid ● Create Activity: HelloAndroid Fonte: http://developer.android.com/resources/tutorials/hello-world.html
  • 18. Nossa primeira Activity HelloAndroid.java 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); } }
  • 19. Nossa primeira Activity HelloAndroid.java package com.example.helloandroid; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; 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"); setContentView(tv); } }
  • 21. A estrutura básica de um projeto Android Projeto src/ gen/ res/ AndroidManifest.xml default.properties Arquivo muito importante do projeto: AndroidManifest.xml Vamos falar dele depois...
  • 22. Hello World again, mas pouco diferente HelloAndroid.java 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); } } Igual a primeira versão do arquivo!
  • 23. Hello World again, mas pouco diferente /res/layout/main.xml <?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"/>
  • 24. Hello World again, mas pouco diferente /res/values/strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello, Android! I am a string resource!</string> <string name="app_name">Hello, Android</string> </resources>
  • 25. Hello World Parabéns, você acaba de executar seu primeiro programa Android!
  • 26. Hello World complete! Você quer tentar o NotePad?
  • 27. Hello World complete! Você quer tentar o NotePad?
  • 28. NotePad ○ O tutorial do NotePad é dividido em três execícios. ○ Em cada exercício partes diferentes do sistema são exploradas. ○ É muito didático! ○ É completo (lifecycle)! ○ Tratamento de eventos assincronos e acesso a DB. ○ Comunicação entre Activities. Original em : http://developer.android.com/resources/tutorials/notepad/notepad-ex1.html
  • 29. NotePad Antes de desenvolver o projeto.. Vamos pensar um pouco em como será a aplicação. Sim, levantamento de requisitos! "Eu gostaria de poder listar todas as notas guardadas na aplicação." "Eu gostaria de poder adicionar notas." "Eu gostaria de poder editar uma nota."
  • 30. NotePad Agora que já temos formalizado mentalmente o que iremos fazer, vamos trabalhar!
  • 31. NotePad V1 Fazer o download dos projetos em: http://developer.android.com/resources/tutorials/notepad/codelab/NotepadCodeLab.zip Crie um novo projeto Android no Eclipse (File > New > Android Project) e configure para utilizar um código fonte já existente (opção Create project from existing source) do projeto NotePadv1.
  • 32. NotePad V1 ○ Exercício número 1! Missão do exercício: Construir uma lista simples de notas que permita ao usuário adicionar notas, mas não permita edita-las. O que aprenderemos: Este exercício demonstra o básico sobre ListActivity, a criação e manipulação de opções de menu e a utilização do SQLite para armazenar as notas.
  • 33. NotePad V1 Vamos estudar os arquivos fornecidos no projeto. Abra o arquivo NotesDbAdapter.java Note que: ○ SQLite nativo; ○ Constantes de banco são uma boa prática de programação; ○ Métodos para CRUD (Create,Read,Up,Del); ○ Android trabalha com Cursores;
  • 34. NotePad V1 /** * Retorna todas as notas no banco de dados em um Cursor. **/ public Cursor fetchAllNotes() { return mDb.query( DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY}, null, null, null, null, null); }
  • 35. NotePad V1 /** * Retorna somente a nota com o valor de rowId **/ public Cursor fetchNote(long rowId) throws SQLException { Cursor mCursor = mDb.query( true, DATABASE_TABLE, new String[] {KEY_ROWID,KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; }
  • 36. NotePad V1 mDb.query( true, DATABASE_TABLE, new String[] {KEY_ROWID,KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, null, null, null, null); query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) Query the given URL, returning a Cursor over the result set. "SELECT KEY_ROWID,KEY_TITLE, KEY_BODY FROM DATABASE_TABLE WHERE KEY_ROWID + "=" + rowId;"
  • 37. NotePad V1 A tela com lista de notas fica definida em um arquivo XML. Abrir o arquivo notepad_list.xml <?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>
  • 38. NotePad V1 <LinearLayout> <RelativeLayout> <TableLayout> </LinearLayout> </RelativeLayout> </TableLayout> fonte: http://developer.android.com/resources/tutorials/views/index.html
  • 39. NotePad V1 Voltando ao layout do projeto... <ListView android:id="@android:id/list"/> <TextView android:id="@android:id/empty" android:text="@string/no_notes"/> "list" e "empty" trabalham em conjunto, são ids defindos pelos desenvolvedores do SDK Android. "Se o objeto ListView de id list estiver vazio, mostre o conteúdo do TextView de id empty"
  • 40. NotePad V1 Mas onde está a definição dos itens da nossa lista? Neste caso, cada linha da nossa lista conterá somente um texto com o título da nota. Criar o arquivo notes_row.xml <?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"/>
  • 41. NotePad V1 Agora, abra Notepadv1.java Para que possamos mostrar uma lista na tela, temos que utilizar como base uma ListActivity. Então vamos mudar a declaração de herança da classe public class Notepadv1 extends ListActivity
  • 42. NotePad V1 Declare no inicio da classe um objeto para manipular os dados do banco de dados: private NotesDbAdapter mDbHelper; Através dele iremos executar as operações de CRUD, você se lembra o que significa CRUD?
  • 43. NotePad V1 Declare no inicio da classe um objeto para manipular os dados do banco de dados: private NotesDbAdapter mDbHelper; Através dele iremos executar as operações de CRUD, você se lembra o que significa CRUD? Create Retrieve Update Delete
  • 44. NotePad V1 Deixe o método OnCreate() assim: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notepad_list); mDbHelper = new NotesDbAdapter(this); mDbHelper.open(); fillData(); } Nos ainda não declaramos fillData(), mas não se incomode com o Eclipse reclamando..
  • 45. NotePad V1 Então vamos implementa-lo: 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); }
  • 46. NotePad V1 Porque implementar o método fillData() ao invés de simplesmente colocar aquele código no corpo do método onCreate()? O que o método fillData() faz?
  • 47. NotePad V1 Porque implementar o método fillData() ao invés de simplesmente colocar aquele código no corpo do método onCreate()? Nos vamos precisar de chamar aquele código em outros métodos! O que o método fillData() faz? Atualiza a lista na tela com o conteúdo do banco de dados! Vamos dar mais uma olhada naquele código..
  • 48. NotePad V1 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); }
  • 49. NotePad V1 Precisamos de um modo de deixar o usuário adicionar notas a nossa aplicação, para isso utilizaremos, inicialmente, o evento de pressionar botão físico de Menu. Vamos criar o menu com a mensagem "Add nota", para isso sobrescrevemos o método onCreateOptionsMenu de ListActitivy. Para poder perceber qual item do nosso menu foi apertado temos que sobrescrever outro método, o onOptionsItemSelected. Estes métodos são como queijo e goiabada, eles se completam!
  • 50. NotePad V1 Declare no inicio da classe: 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; } No arquivo strings.xml, adicione: <string name="menu_insert">Add Item</string>
  • 51. NotePad V1 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case INSERT_ID: createNote(); break; } return super.onOptionsItemSelected(item); } Está quase acabando..só criarmos o método createNote()
  • 52. NotePad V1 Declare no fim da classe: private void createNote() { String noteName = "Note " + mNoteNumber++; mDbHelper.createNote(noteName, ""); fillData(); } Cria notas vazias com nome "Note 1", "Note 2"... Hora de testar..Execute a aplicação.. (Run As > Android Application.)
  • 53. Troll Mas seu programa não faz nada que presta! Que isso?! So tem como colocar notas vazias e Com titulo automático!
  • 54. NotePad V2 Você quer tentar o NotePad V2?
  • 55. NotePad V2 Você quer tentar o NotePad V2? Depois do almoço? :-D
  • 56. NotePad V2 ○ Exercício número 2! Missão do exercício: Nesta versão vamos adicionar a possibilidade de apagar uma nota e vamos adicionar uma segunda Activity que nos permita adicionar e editar notas. O que aprenderemos: Como adicionar uma nova Activity, ao Android manifest, como passar dados entre Activities, e a utilizar um layout de tela mais avanço. Também vamos ver o funcionamento do método startActivityForResult().
  • 57. NotePad V2 Crie um novo projeto Android no Eclipse (File > New > Android Project) e configure para utilizar um código fonte já existente (opção Create project from existing source) do projeto NotePadv2.
  • 58. NotePad V2 Vamos dar um confere no que mudou do do V1 para o V2. /res/values/strings.xml Há novas strings definidas. /src/com/android/demo/notepad2/NotePadV2.java Novas constantes, novos métodos são sobrescritos e a definição do Cursor mNotesCursor.
  • 59. NotePad V2 Vamos dar uma olhada no método fillData(), ele foi modificado pa utilizar o Cursor mNotesCursor private void fillData() { mNotesCursor = mDbHelper.fetchAllNotes(); startManagingCursor(mNotesCursor); 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, mNotesCursor, from, to); setListAdapter(notes); }
  • 60. NotePad V2 Pois bem... Como podemos deixar o usuário apagar uma nota?
  • 61. NotePad V2 Pois bem... Como podemos deixar o usuário apagar uma nota? Ele deve, de algum modo, selecionar um item da lista para podermos saber sobre qual item ele quer aplicar uma ação.
  • 62. NotePad V2 Antes de mais nada, vamos adicionar a seguinte linha ao onCreate() do NotePadV2: registerForContextMenu(getListView()); Ela permite que os itens da lista (ListView) se registrem no menu de contexto. Como nossa Activity estende ListActivity basta usar getListView() para recuperar a lista que está sendo usada no layout. setContentView(R.layout.notes_list);
  • 63. NotePad V2 Para saber qual item da lista foi selecionado a classe ListActivity possui alguns métodos... Se você exectuar um long press sobre um item da lista será criado um menu de contexto chamando o método: @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); // TODO: fill in rest of method } Não confundir com public boolean onCreateOptionsMenu(Menu menu)!
  • 64. NotePad V2 Lembre-se, o que você quer é adicionar uma opção ao objeto "menu" de modo que permita que o item selecionado seja removido! @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, DELETE_ID, 0, R.string.menu_delete); } Quando você executar um long press apareceráum menu com o texto escrito em R.string.menu_delete. <string name="menu_delete">Delete Note</string>
  • 65. NotePad V2 Você ainda não especificou o que irá acontecer quando o usuário escolher esse item de menu... @Override 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); }
  • 66. NotePad V2 ... switch(item.getItemId()) { case DELETE_ID: AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); mDbHelper.deleteNote(info.id); ... onContextItemSelected() é chamado pelo sistema quando um item é selecionado, veja que para saber qual item do menu foi selecionado é utiliado a constante DELETE_ID. O ID do elemento selecionado dentro do DB é info.id! Mas como isso é possível?
  • 67. NotePad V2 "Isso não é magia, é tecnologia!" public Cursor fetchAllNotes() { return mDb.query( DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY}, null, null, null, null, null); } Quando buscamos todas as notas no banco, o Cursor retornado, traz o conteúdo da coluna KEY_ROWID. public static final String KEY_ROWID = "_id"; Se você utilizar a coluna ID como "_id" na suas aplicações, o Android quase que faz mágica! Veja o próximo slide..
  • 68. NotePad V2 mNotesCursor recebe o retorno de fetchAllNotes() e é passado como parâmetro para o construtor de SimpleCursorAdapter. O SimpleCursorAdapter() procura por uma coluna "_id" e já associa cada item da lista a ser mostrado (NotesDbAdapter.KEY_TITLE) com aquele ID! private void fillData() { mNotesCursor = mDbHelper.fetchAllNotes(); startManagingCursor(mNotesCursor); String[] from = new String[] { NotesDbAdapter.KEY_TITLE }; int[] to = new int[] { R.id.text1 }; SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, mNotesCursor, from, to); setListAdapter(notes); }
  • 69. NotePad V2 Vamos modificar o método createNote() para permitir a criação de notas de maneira mais "profissional". Vamos criar uma nova tela (leia-se Activity) para permitir a entrada de dados para a criação e edição das notas. Na nova tela, vamos entrar com o título da nota e com o corpo da nota, mas toda a parte de acesso ao DB fica em NotePad. java e teremos que retornar esses valores. A mesma tela pode criar ou editar uma nota, ok?
  • 70. NotePad V2 No arquivo NotePadV2.java temos o método: private void createNote() { // TODO: fill in implementation } Que não faz nada...
  • 71. NotePad V2 No arquivo NotePadV2.java temos o método: private void createNote() { Intent i = new Intent(this, NoteEdit.class); startActivityForResult(i, ACTIVITY_CREATE); } Declara a intenção de lançar uma nova Activity passando o contexto como primeiro parâmetro e qual Activity como segundo parâmetro para o construtor da Intent. O método startActivityForResult() inicia uma Intent e também recebe como parâmetro a constante ACTIVITY_CREATE que serve como identificador do porque a Intent foi iniciada.
  • 72. NotePad V2 Três perguntas podem vir a sua mente... 1° Porque tenho que identificar o motivo pelo qual criei uma Intent? 2° Porque aquele método tem no nome "ForResult" ? 3° Nós já almoçamos?
  • 73. NotePad V2 Três perguntas podem vir a sua mente. 1° Porque tenho que identificar o motivo pelo qual criei uma Intent? Porque nos vamos iniciar a mesma Activity para criar uma nota e para editar uma nota e temos que saber diferenciar cada caso. 2° Porque aquele método tem no nome "ForResult" ? Porque quando a Activity iniciada pelo método terminar sua execução, nós vamos querer saber qual foi o resultado dela. 3° Nós já almoçamos? Espero que sim, senão eu estarei morrendo de fome!
  • 74. NotePad V2 Ignore o Eclipse reclamando que não existe a classe NoteEdit. java e vamos continuar preenchendo o corpo dos métodos... @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // TODO: fill in rest of method } Este método é chamado quando clicamos em um item da lista de notas. O que deve acontecer com fizermos isso?
  • 75. NotePad V2 Ignore o Eclipse reclamando que não existe a classe NoteEdit. java e vamos continuar preenchendo o corpo dos métodos... @Override protected void onListItemClick(ListView l, View v, int position, long id) { 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))); ...Continua....
  • 76. NotePad V2 ... i.putExtra(NotesDbAdapter.KEY_ROWID, id); i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString( c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE))); ... Você passa valores de uma Activity para outra através de Extras adicionados na Intent antes de iniciar a nova Activity. Cada Extra defini um identificador único e um valor. Exemplo: "NotesDbAdapter.KEY_ROWID" é um identificador e "id" um valor a ser passado para a Activity associada a Intent "i". NotesDbAdapter.KEY_TITLE é o identificador e o resultado de c.getString() o valor.
  • 77. NotePad V2 @Override protected void onListItemClick(ListView l, View v, int position, long id) { ...Parte mostrada anteriomente... i.putExtra(NotesDbAdapter.KEY_BODY, c.getString( c.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY))); startActivityForResult(i, ACTIVITY_EDIT); } O que o método onListItemClick() está fazendo?
  • 78. NotePad V2 Ele está passando todos os dados de uma Note para a Activity NoteEdit.class. NoteEdit não precisa buscar no banco de dados as informações relativas a Note que estará sendo editada, basta pegar a partir dos Extras incluídos na chamada.
  • 79. NotePad V2 Método completo: @Override protected void onListItemClick(ListView l, View v, int position, long id) { 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); } Acesso a variável local é muito mais "barato" do que acesso a variáveis globais.
  • 80. NotePad V2 Quando NoteEdit terminar de executar será chamado o método onActivityResult(), nele iremos fazer a real edição das informações no banco de dados. @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); // TODO: fill in rest of method }
  • 81. NotePad V2 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 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; ...Continua... Retiramos dos "Extras" valores que foram adicionados em NoteEdit. Não são os mesmos valores dos slides atras.
  • 82. NotePad V2 ...Continuação... 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; } NoteEdit pode ter sido chamada par criar uma nota (ACTIVITY_CREATE) ou para editar uma nota (ACTIVITY_EDIT), combase no requestCode sabemos qual é o caso.
  • 83. NotePad V2 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 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; }
  • 84. NotePad V2 Agora vamos estudar o layout da tela de edição de Notes, abra o arquivo /res/layout/note_edit.xml Elementos novos: <EditText android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"/> <Button android:id="@+id/confirm" android:text="@string/confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" />
  • 85. NotePad V2 A classe NoteEdit.java irá utilizar o layout note_edit.xml e "amarrar" objetos Java aos objetos descritos no arquivo XML. Depois disso precisamos verificar se foram passadas variáveis para a Activity, se sim, mostra-los nos campos de texto. Também precisamos definir o "valor de retorno" da Activity, ou seja, definir quais dados serão passados a Activity NotePadV2 quando NoteEdit terminar sua execução.
  • 86. NotePad V2 Crie a classe NoteEdit.java e preencha o onCreate() com: private EditText mTitleText; private EditText mBodyText; private Long mRowId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.note_edit); mTitleText = (EditText) findViewById(R.id.title); mBodyText = (EditText) findViewById(R.id.body); Button confirmButton = (Button) findViewById(R.id.confirm); mRowId = null; Bundle extras = getIntent().getExtras(); ...Continua...
  • 87. NotePad V2 if (extras != null) { //Se chegar aqui estamos editando uma nota! 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); } } ...Continua...
  • 88. NotePad V2 confirmButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { 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(); } }); }
  • 89. NotePad V2 Antes de executar o V2, temos que adicionar a Activity NoteEdit ao AndroidManifest.xml, este é o arquivo de controle da aplicação, nele listamos quais Activities serão chamadas no decorrer da execução da aplicação, quais permissões a aplicação possui, entre outros.
  • 90. NotePad V2 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.demo.notepad2"> <application android:icon="@drawable/icon"> <activity android:name=".Notepadv2" 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>
  • 91. NotePad V2 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.demo.notepad2"> <application android:icon="@drawable/icon"> <activity android:name=".Notepadv2" 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=".NoteEdit"></activity> </application> </manifest>
  • 92. NotePad V2 Esta aplicação tem somente duas Activities e não possui permissões. Entre as possíveis permissões existentes, temos: <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> Mais explicações aqui: http://developer.android.com/guide/topics/security/security.html
  • 93. NotePad V2 Agora sim, execute a aplicação no emulador e vamos ver o resultado!
  • 94. NotePad V2 Parabéns, você acaba de terminar o segundo exercício!