A navegação entre telas/páginas é uma necessidade comum da maioria das aplicações, sejam elas mobile, web ou desktop. No Android as telas da aplicação são representadas por activities e a navegação entre elas é feita principalmente usando as classes Intent e Bundle, como veremos a seguir.

Navegação básica

No Android a navegação entre activities é feita por meio da classe Intent, que representa uma ação a ser realizada (neste caso a navegação). Essa classe recebe em seu construtor as activities de origem e destino e em seguida devemos invocar o método startActivity da activity, passando a instância de Intent como parâmetro, como ilustra a Figura 1.

Navegação básica no Android
Figura 1. Navegação básica no Android

Abaixo temos o código com o qual fazemos essa navegação:

  Intent in = new Intent(LoginActivity.this, HomeActivity.class);
  startActivity(in);  

Esse código pode estar, por exemplo, no clique de um botão da LoginActivty a fim de navegar para a HomeActivity.

Navegação com passagem de parâmetros

É muito comum que ao navegarmos entre duas activities no Android seja necessário trafegar dados entre elas. Para isso utilizamos a classe Bundle, que irá encapsular as informações que queremos transportar entre as activities a “anexamos” ao nosso Intent, como ilustra a sequência de imagens a seguir:

Passo 1: Instanciar o Bundle e adicionar o dado a ser enviado Passo 2: Criar o intent e adicionar a ele o bundle Passo 3: Recuperar dados enviados por parâmetro
#PraCegoVer - Transcrição dos Slides Na navegação com passagem de dados: 1) Dado que queremos enviar para a segunda tela - Strong email = "email@mail.com";
2)Instância da classe Bundle - Bundle bundle = new Bundle();
3) Adicionar o dado no bundle - bundle.putString("email", email);
4) Criar o intent para a navegação entre as telas: Intent in = new Intent(LoginActivity.this, HomeActivity.class);
5) Adicionar ao bundle ao intent - in.putExtras(bundle); 6) Executar a ação de navegação - startActivity(in);

Recuperar dados enviados por parâmetro> 1) Recuperar os dados bundle através do Intent - Bundle bundle = getIntent().getExtras();
2) Obter o dado armazenado como texto no bundle a partir do seu identificador ("email") - String email = bundle.getString("email");
3) Exibir o dado na tela - mensagem.setText("Olá " + email);

Abaixo temos o código que faz isso:

public void entrar(View v){
    String emailUser = email.getText().toString();
    Bundle bundle = new Bundle();
    bundle.putString("email", emailUser);
    Intent in = new Intent(LoginActivity.this, HomeActivity.class);
    in.putExtras(bundle);
    startActivity(in);
  }

Linha 2: Capturamos o texto digitado no campo, e que deve ser passado para a segunda activity;

Linha 3: Instanciamos a classe Bundle, que conterá os dados a serem trafegados;

Linha 4: Adicionamos a variável string no bundle usando o método putString. Note que o dado é identificado pela chave "email";

Linha 5: Instanciamos a classe Intent, que representa a ação de navegação entre as duas activities;

Linha 6: Adicionamos o bundle no intent, assim os dados trafegarão para a segunda activity;

Linha 7: Executamos a ação de navegação propriamente dita.

Agora, na activity de destino precisamos obter o Bundle enviado pelo Intent para recuperar o e-mail que foi digitado pelo usuário e exibi-lo na HomeActivity. Para isso, no método onCreate da HomeActivity, capturamos o Bundle através do método getIntent().getExtras() que irá obter as informações que foram enviadas através do Intent. E com o método getString da classe Bundle, passando a chave “email”, conseguimos recuperar a informação que foi inserida na LoginActivity. Após isso, é só exibir o e-mail recuperado, como vemos no código abaixo:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        mensagem = (TextView) findViewById(R.id.textMensagem);
        Bundle bundle = getIntent().getExtras();
        String data = bundle.getString("email");
        mensagem.setText("Olá " + data);
  }

Linha 4: Capturamos o componente que irá exibir o e-mail do usuário e atribuimos à variável mensagem;

Linha 5: Capturamos o bundle enviado através do Intent e salvamos na variável bundle;

Linha 6: Recuperamos o conteúdo que possui a chave “email” e atribuímos à variável data;

Linha 7: Adicionamos o email do usuário, enviado através do bundle, no conteúdo da mensagem da nossa Activity.

Trafegando outros tipos de dados

De forma semelhante ao que fizemos para enviar uma string, podemos trafegar outros tipos de dado através do Bundle. Para isso, basta “anexar” um outro dado utilizando o método “put” referente a ele, como podemos ver na tabela abaixo:

Tipo de Dado Método
Integer putInt(chave, valor)
Char putChar(chave, valor)
Float putFloat(chave, valor)
Boolean putBoolean(chave, valor)

No código abaixo temos exemplos de uso desses métodos:

bundle.putInt("idade", 22);
  bundle.putBoolean("status", true);
  bundle.putChar("sexo", 'M');
  bundle.putFloat("salario", 2500);

Já para capturar esses valores devemos usar os métodos get referentes ao tipo de dado que estamos recebendo através do Bundle, como podemos ver na tabela abaixo:

Tipo de Dado Método
Integer getInt(chave)
Char getChar(chave)
Float getFloat(chave)
Boolean getBoolean(chave)

Abaixo temos exemplos de uso dessas funções:


  int idade = bundle.getInt("idade");
  boolean status = bundle.getBoolean("status");
  char sexo = bundle.getChar("sexo");
  float salario = bundle.getFloat("salario");
  

Trafegando objetos

Implementando Serializable Método putExtra Recuperando o objeto Pessoa do Intent
#PraCegoVer - Transcrição dos Slides Trafegando objetos entre telas: a classe a ser enviada deve implementar a interface Serializable - class Pessoa implements Serializable { //...}
Instanciar e preencher o objeto a ser enviado - Pessoa p = new Pessoa("João", "M", 22);
Intent in = new Intent(ActivityOrigem.this, ActiviyDestino.class);
Adicionar o objeto no Intent com o método putExtra - in.putExtra("pessoa", p);
startActivity(in);

É necessário fazer o cast explícito (Pessoa) e recuperar o objeto Pessoa do Intent - Pessoa p = (Pessoa)getIntent().getSerializableExtra("pessoa")

Para enviar um objeto como parâmetro entre activities precisamos adicioná-lo diretamente ao Intent utilizando o método putExtra, como podemos ver abaixo:


  Pessoa p = new Pessoa(emailUser, 22, 'M', 2500, true);
  Intent in = new Intent(LoginActivity.this, HomeActivity.class);
  in.putExtra("pessoa", p);
  

Linha 1: Criamos o objeto do tipo Pessoa passando seus atributos no construtor;

Linha 3: Utilizando o método putExtra criamos uma estrutura do tipo chave-valor onde a chave “pessoa” irá identificar o objeto que estamos passando como parâmetro através da nossa navegação.

É importante ressaltar que a classe Pessoa precisa implementar a interface Serializable para que seja possível enviá-la através da navegação:


  public class Pessoa implements Serializable {
  private String email;
  private int idade;
  private char sexo;
  private float salario;
  private boolean status;
  //construtor e métodos get e set
  

E para recuperar esse objeto e exibir suas informações na HomeActivity utilizamos o método getSerializableExtra, passando a chave que o identifica, como podemos ver abaixo:

Pessoa p = (Pessoa) getIntent().getSerializableExtra("pessoa");