¿Cómo devolver el resultado "de una manera natural" cuando se llama la llamada Actividad?

Que esta funcionando bien

Tengo 2 actividades en mi aplicación. La primera actividad llama a la segunda actividad para obtener resultados.

La segunda actividad muestra un nuevo diseño y permite al usuario realizar ciertas acciones. Hay un botón "Aceptar". Cuando el usuario pulsa este botón, la segunda actividad termina y el usuario vuelve a la primera actividad.

Bajo el capó, la primera actividad llama segundo ativity como este:

Intent intent = new Intent(this, NextAct.class); intent.putExtra("input", input); this.startActivityForResult(intent, 99); 

Al pulsar el botón "OK", la segunda actividad regresa con un resultado como este:

 Intent intent = new Intent(); intent.putExtra("output", output); setResult(RESULT_OK, intent); finish(); 

Después de eso, se llama al onActivityResult de la primera actividad con resultados satisfactorios:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { // requestCode is 99 // resultCode is -1 // data holds my output } 

Por encima de la configuración funciona perfectamente

Lo que no está funcionando

Ahora tenía un requisito sencillo, quería que el usuario cerrar la segunda actividad no con un botón "Aceptar", pero de una manera natural con el botón "HARDWARE BACK".

He intentado mover la lógica setResult en métodos onStop y onDestroy de segunda actividad, pero resultó que onActivityResult de primera actividad se llama antes onStop o métodos onDestroy de segunda actividad y como resultado la lógica setResult no tiene la oportunidad de ejecutarse en absoluto.

Entonces intenté mover la lógica del setResult en onPause método de la segunda actividad como esto

 protected void onPause() { super.onPause(); Intent intent = new Intent(); intent.putExtra("output", output); setResult(RESULT_OK, intent); //finish(); enabling or disabling this does not work } 

Pero aunque onPause se está llamando antes de que onActivityResult y setResult se ejecuten correctamente, todavía obtengo todos los valores null en onActivityResult

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { // requestCode is 99 // resultCode is 0 // data comes as null } 

Necesito saber por qué esto está sucediendo y si onResume no es un lugar apropiado para poner la lógica setResult , ¿cuál es la forma más natural de hacerlo?

Muchas gracias.

Ahora tenía un requisito sencillo, quería que el usuario cerrar la segunda actividad no con un botón "Aceptar", pero de una manera natural con el botón "HARDWARE BACK".

Esto no suele ser "natural" para un escenario startActivityForResult() . El botón ATRÁS debe permitir al usuario decirle "No, no está bien" (es decir, cancelar).

Esto no significa que usted necesariamente tiene que tener un botón Aceptar. Por ejemplo, si NextAct era ListActivity , un patrón típico es para hacer clic en un elemento de lista para que se considere "OK" (es decir, llamar a setResult() y finish() de onListItemClick() ) y BACK para significar " T realmente significa comenzar NextAct , lo siento ".

Necesito saber por qué esto está sucediendo

Estás llamando a setResult() demasiado tarde. Si el usuario presiona BACK, en el momento de onPause() , ya se ha determinado el resultado ( RESULT_CANCELED ).

Si onResume no es un lugar apropiado para poner la lógica setResult

onResume() no sería un lugar apropiado para "poner lógica setResult"

¿Cuál es la forma más natural de hacerlo?

Posiblemente lo que tienes con el botón OK es la "forma más natural de hacerlo".

Sin embargo, si por alguna extraña razón realmente desea que el botón BACK signifique "Aceptar", sobrescriba onBackPressed() y llame a setResult() allí antes de encadenar a la superclase con super.onBackPressed() .

La mejor manera que encontré es anular el método finish ():

 @Override public void finish() { Intent data = new Intent(); data.putExtra(INTENT_PARAM_OPTIONS, options); setResult(RESULT_OK, data); super.finish(); } 

En ese caso, su actividad siempre devolverá los datos, incluso si el usuario presiona el botón de retroceso (o el botón de la barra de actividad hacia arriba).

Y creo que es perfectamente natural hacerlo en algunas circunstancias. Si usted tiene una actividad que se hace para editar una entidad grande (orden de envío por ejemplo) y una actividad más pequeña dentro de esa actividad que modifica una pequeña parte de la entidad grande (dirección de envío), también podría guardar siempre los cambios dentro de la actividad más pequeña , Porque el usuario puede cancelar todos los cambios cancelando la gran actividad.

Puede intentar anular onBackPressed o onKeyDown y setResult (RESULT_OK, intención) allí.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.