Android- Volviendo a la actividad anterior con diferente valor de intención

Tengo una aplicación que tiene esta transición:

A -> B -> C -> D-> C 

Al ingresar a C , tengo que verificar una bandera. Luego tengo que pasarlo como bash (digamos intentX = false ) a D Después de hacer algo en D , luego volverá a C después de presionar un botón. Lo que hice fue simplemente pasar de nuevo la intentX con el valor verdadero, luego iniciar la actividad C nuevamente. Entonces, ¿qué sucede es que creó otra actividad C.

Lo que quiero que suceda es que no tendré que comenzar una nueva Actividad C, sino usar la C anterior simplemente llamando a super.onBackPressed() . Pero no puedo pasar el nuevo valor de la intentX . ¿Hay alguna otra forma de lograr lo que quiero? Podría haberme perdido algo.

Lo que quiere es startActivityForResult() . Cuando pasa de C a D , en lugar de utilizar startActivity() utilice en su lugar startActivityForResult() . Luego, cuando desee regresar de D a C , use setResult() que puede incluir un objeto Intent con extras para volver a C

No recomiendo hacer esto en onBackPressed() si no es necesario porque no será lo que el usuario espera. En cambio, debe regresar con estos datos con un evento como un clic de Button .

Entonces, en C harás algo como

  Intent i = new Intent(new Intent(C.this, D.class); startActivityForResult(i, 0); 

luego en D cuando estés listo para regresar

  Intent i = new Intent(); i.putExtra(); // insert your extras here setResult(0, i); 

Luego, cuando regrese a C , ingresará este método ( tomado de los Documentos )

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PICK_CONTACT_REQUEST) { if (resultCode == RESULT_OK) { // A contact was picked. Here we will just display it // to the user. startActivity(new Intent(Intent.ACTION_VIEW, data)); /* can also get the extra sent back through data using data.getStringExtra("someKey"); assuming the extra was a String */ } 

Hay algunos casos donde startActivityForResult no es realmente necesario o no es práctico cambiar todas las llamadas a startActivity para startActivityForResult.

Si es necesario el simple caso de comenzar una actividad anterior ‘nuevamente’, mi recomendación es: utilizar el indicador FLAG_ACTIVITY_CLEAR_TOP.

Citando una breve descripción :

Si se establece, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades que se encuentren encima se cerrarán y esta intención se entregará al (ahora encendido arriba) actividad anterior como un nuevo propósito.

Por ejemplo, considere una tarea que consista en las actividades: A, B, C, D. Si D llama a startActivity () con un Intento que se resuelve en el componente de la actividad B, entonces C y D estarán terminados y B recibirá el Intento dado , dando como resultado que la stack sea ahora: A, B.

Entonces este ejemplo

  // From ActivityD Intent intent = new Intent(getApplicationContext(), ActivityB.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // The flag we wanted intent.putExtra(ActivityB.SOME_EXTRA_THAT_I_NEED_CHANGED, SomeValue); // Example of changing the intent to get something new.. startActivity(intent); 

Donde obtendrás ese nuevo bash se define por qué modo de lanzamiento y qué banderas usaron para iniciarlo (en este caso nuestro ActivityB).

La instancia actualmente en ejecución de la actividad B en el ejemplo anterior recibirá el nuevo bash que está comenzando aquí en su método onNewIntent (), o se terminará y se reiniciará con el nuevo bash. Si ha declarado que su modo de lanzamiento es “múltiple” (el valor predeterminado) y no ha configurado FLAG_ACTIVITY_SINGLE_TOP en el mismo bash, entonces se terminará y se volverá a crear; para todos los demás modos de ejecución o si se establece FLAG_ACTIVITY_SINGLE_TOP, este Intent se entregará a la instancia actual onNewIntent ().