Como ya se ha explicado, el elemento básico de una aplicación Android es una Activity la cual se puede asociar a una pantalla. Evidentemente una aplicación consta de varias pantallas y el flujo entre ellas marcará la funcionalidad que la aplicación podrá tener. Para poder gestionar este flujo de pantallas existen los intents que me permiten arrancar pantallas de forma simple o esperando un resultado concreto

Para este ejemplo se utilizará dos pantallas:

  • MainActivity junto con su xml correspondiente con un botón
  • SecondActivity junto con su xml correspondiente con un un botón y un EditText

Arrancar una segunda pantalla

Como se ha dicho, para poder arrancar una segunda pantalla existe un intento de acción donde se debe indicar el contexto en el que se encuentra el intento y la clase de la pantalla a la que se quiere acceder. Es importante saber que la segunda pantalla debe estar declarada en el AndroidManifest.xml ya que si no será inaccesible por parte de la compilación. Una vez creado el intent se ejecutará el método startActivity() pasándole como parámetro el intent creado con anterioridad

public class MainActivity extends AppCompatActivity {
    
    Button boton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        boton = findViewById(R.id.botonArrancar);
        boton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //arrancar la segunda actividad
                Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

Al mismo tiempo que se arranca una actividad, también es posible pasar un dato concreto mediante un extra asociado al intent. Para ello el objeto de tipo intent ejecuta el método putExtra() donde se le pasa por parámetros la clase asociada y el dato que se quiere pasar. La clave asociada es la que se utilizará para poder recuperar en dato en la actividad de destino. En el caso de se un objeto complejo se pasará como serializable por lo que la clase que crea el objeto debe implementar dicha interfaz

Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
//pasarle un dato concreto
intent.putExtra("clave_asociada","dato a pasar");
startActivity(intent);

Para poder recuperar el dato en la actividad destino primero se accede al intent que ha arrancado la actividad y se ejecuta el método getTipoExtra() pasando como parámetro la clave utilizada en el párrafo anterior.

public class SecondActivity extends AppCompatActivity {

    TextView texto;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        texto = findViewById(R.id.textoRecuperado);
        String recueprar = getIntent().getStringExtra("clave_asociada");
        texto.setText(recueprar);
    }
}

Arrancar segunda pantalla esperando resultado

En algunos casos no es suficiente con arrancar una pantalla, sino que se espera a que la pantalla arrancada procese información y devuelva un dato concreto. Para ello se ejecuta el método startActivityFromResult() al cual se le pasan los parámetros del intent que tiene la acción y un código de petición para poder manejar la respuesta

public class MainActivity extends AppCompatActivity {

    Button boton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        boton = findViewById(R.id.botonArrancar);
        boton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //arrancar la segunda actividad
                Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
                //pasarle un dato concreto
                intent.putExtra("clave_asociada","dato a pasar");
                // se arranca la actividad esperando un resultado de vuelta
                startActivityForResult(intent,1);
            }
        });
    }
}

La segunda actividad es arrancada un procesa los datos correspondientes. En el momento que quiera dar la respuesta se ejecuta el método setResult() al cual se le pasa un código de respuesta para ser procesado y un intento con los datos que formarán la respuesta y justo después se ejecutará el método finish() para que la actividad termine

public class SecondActivity extends AppCompatActivity {

    TextView texto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        texto = findViewById(R.id.textoRecuperado);
        String recueprar = getIntent().getStringExtra("clave_asociada");
        texto.setText(recueprar);

        Intent intentRespuesta = new Intent();
        intentRespuesta.putExtra("clave_respuesta",3);
        setResult(1,intentRespuesta);
        finish();
    }
}

En este punto la actividad uno vuelve a estar visible y para poder procesar la respuesta debe sobre escribir el método onActivityResult() con los siguientes parámetros:

  • código de petición de salida: el indicado en el intent que ha arrancado la segunda actividad
  • código de petición de entrada: el indicado en el setResult de la segunda actividad
  • intent: los datos que me ha dado la segunda actividad como respuesta

Con todos estos datos se puede evaluar cada uno de los códigos y extraer la información asociada al intent

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1){
            if (resultCode == 1){
                data.getStringExtra("clave_respuesta");
            }
        }
}