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, MiClase.class);
intent.putExtra("usuario", "Pepito Perez");
intent.putExtra("edad", 27);
startActivity(intent); 
val intent = Intent(this, MiClase::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 usando un objeto de la clase ActivityResultLauncher, en lugar de startActivity(Intent). Este objeto permite definir un escuchador de evento, que será llamado cuando la actividad lanzada retorne. Crear este objeto como un atributo de la clase. Para ello introduce el siguiente código fuera de un método:
 

ActivityResultLauncher resoultLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback() {
           @Override
           public void onActivityResult(ActivityResult result) {
              if (result.getResultCode() == Activity.RESULT_OK) {
                 Intent data = result.getData();
                 //Acciones a realizar
              }
           }
        }); 
var resultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data
        //Acciones a realizar
    }
} 
Para realizar la llamada reemplaza startActivity() por el siguiente código:
Intent intent = new Intent(this, MI_CLASE.class);
…
startActivity(intent);
resultLauncher.launch(intent);
 
val intent = Intent(this, MI_CLASE::class.java)
startActivity (intent)
…
resultLauncher.launch(intent)
 

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. NOTA: Para extraer el texto introducido en un EditText  a un string utiliza editText.getText().toString().

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