Comunicación entre actividades

Cuando una actividad ha de lanzar a otra actividad en muchos casos necesita enviarle cierta información.

video[Tutorial] Intercambio de datos entre actividades

Android nos permite este intercambio de datos utilizando el mecanismo que es descrito a continuación:

Cuando lances una actividad B, desde la actividad A, usa el siguiente código en A:

Intent intent = new Intent(this, MI_CLASE.class);
intent.putExtra("usuario", "Pepito Perez");
intent.putExtra("edad", 27);
startActivity(intent); 
val intent = Intent(this, MI_CLASE::class.java)
intent.putExtra("usuario", "Pepito Perez")
intent.putExtra("edad", 27)
startActivity(intent) 

En la actividad lanzada (B) podemos recoger los datos de la siguiente forma:

Bundle extras = getIntent().getExtras();
String s = extras.getString("usuario");
int i = extras.getInt("edad"); 
val extras = intent.extras
val s = extras?.getString("usuario")?:"sin usuario"
val i = extras?.getInt("edad")?:-1 

Cuando la actividad lanzada (B) termina, si lo desea, podrá enviar datos de vuelta. Para ello añade en la actividad B el siguiente código:

Intent intent = new Intent();
intent.putExtra("resultado","valor");
setResult(RESULT_OK, intent);
finish(); 
val intent = Intent()
intent.putExtra("resultado", "valor")
setResult(Activity.RESULT_OK, intent)
finish() 

Es posible que el trabajo realizado en la actividad B sea cancelado. Para este caso añade:

Intent intent = new Intent();
setResult(RESULT_CANCEL, intent);
finish(); 
val intent = Intent()
setResult(Activity.RESULT_CANCEL, intent)
finish() 

En la actividad que hizo la llamada (A) has de poder recoger estos datos. Para ello tendremos que lanzar la actividad con startActivityForResult(Intent, int) en lugar de startActivityForResult(Intent). Donde el segundo parámetro es un entero con un código que identifica a la actividad que lanzamos. Además, tendremos que sobrescribir el método onActivityResult(int, int, Intent). Donde, en el primer parámetro se devuelve el mismo código que indicamos cuando hicimos la llamada. El segundo, si el resultado ha sido ok o cancelado. Y el tercero, un Intent donde se incluyen las variables devueltas:

Intent intent = new Intent(this, MI_CLASE.class);
startActivityForResult(intent, 1234);
…
@Override protected void onActivityResult(int requestCode, int resultCode, 
                                          Intent data){
   if (requestCode==1234 && resultCode==RESULT_OK) {
      String res = data.getExtras().getString("resultado");
   }
} 
val intent = Intent(this, MI_CLASE::class.java)
startActivityForResult(intent, 1234)
…
override fun onActivityResult(requestCode: Int, resultCode: Int,
                              data: Intent?) {
   if (requestCode == 1234 && resultCode == Activity.RESULT_OK) {
      val res = data?.extras?.getString("resultado")?:"sin resultado"
   }
} 

Desde la actividad A se podrían llamar a varias actividades. Sin embargo, solo podemos tener un método onActivityResult(). Por esta razón, resulta necesario identificar cada actividad lanzada con un código. Así, podremos diferenciar entre los distintos datos devueltos.

Práctica: Comunicación entre actividades.

1.     Crea un nuevo proyecto con nombre ComunicacionActividades y tipo Empty Activity.

2.     El Layout de la actividad inicial ha de ser similar al que se muestra abajo a la izquierda.

3.   Introduce el código para que cuando se pulse el botón “Verificar” se arranque una segunda actividad. A esta actividad se le pasará como parámetro el nombre introducido en el EditText.

4.     El Layout correspondiente a la segunda actividad se muestra a la derecha.

5.    Al arrancar la actividad el texto del primer TextView ha de modificarse para que ponga “Hola ”+nombre recibido+”¿Aceptas las condiciones?”

6.    En esta actividad se podrán pulsar dos botones, de forma que se devuelva a la actividad principal el String “Aceptado” o “Rechazado”, según el botón pulsado. Al pulsar cualquier botón se regresará a la actividad anterior.

7.    En la actividad principal se modificará el texto del último TextView para que ponga “Resultado: Aceptado” o “Resultado: Rechazado”, según lo recibido.

Preguntas de repaso: Comunicación entre Actividades