2012-04-05 15 views
5

Tengo 2 actividades AAA y BBB. Llamo a BBB desde AAA usando startActivityForResult (Intención, int). Después de que termine con BBB, presiono el botón Atrás para regresar a AAA. En BBB, anulo onPause() y establezco el resultado usando setResult (RESULT_OK).resultado no configurado en onPause() usando setResult() al presionar el botón Atrás

En AAA, compruebo mi resultado en onActivityResult (int requestCode, int resultCode, datos de intención) y sigo recibiendo RESULT_CANCELLED.

Después de pasar algún tiempo en google/stackoverflow, descubrí que si anulo onBackPressed() y establezco el resultado en él, entonces funciona absolutamente bien.

Lo que no entiendo es que, ¿por qué el resultado no se establece en onPause(), cuando en realidad se llama onPause() después de onBackPressed(). He revisado los flujos de actividades en los documentos Dev y tengo bastante claro qué se ha mencionado allí.

¿Alguien tiene alguna idea sobre este comportamiento o podría explicarlo mejor?

+1

Duplicado de http://stackoverflow.com/questions/2679250/setresult-does-not-work-when-back-button-pressed – pjv

Respuesta

0

Creo que el problema aquí podría ser que se invoque onPaused una vez que haya regresado a la actividad anterior. Vi un comportamiento similar en otras pruebas. Intente agregar algunas impresiones Log.d para confirmar el orden de la llamada onPause frente a la llamada onActivityResult.

+0

Lo comprobé, también el flujo de las actividades está organizado, por lo que no es el caso http://developer.android.com/guide/topics/fundamentals/activities.html#CoordinatingActivities – Shubhayu

4

Debería echar un vistazo a la referencia onActivityResult. http://developer.android.com/reference/android/app/Activity.html#onActivityResult%28int,%20int,%20android.content.Intent%29

Called when an activity you launched exits, giving you the requestCode you started it with, the resultCode it returned, and any additional data from it. The resultCode will be RESULT_CANCELED if the activity explicitly returned that, didn't return any result, or crashed during its operation. 

You will receive this call immediately before onResume() when your activity is re-starting. 

llamada setResult en finish(). Se puede llamar a Besause onPause() cuando se inicia una nueva actividad desde BBB.

+0

Tuve la opción de establecer el resultado anulando finish() o onBackPressed(). En cuanto a las 3 opciones donde podría ser RESULT_CANCELLED, definitivamente no es la opción de bloqueo. Podría ser la segunda opción. No sé cómo verificar eso. No estoy seguro de si alguna otra función establece el código de resultado después de que lo configuré explícitamente en Pausa(). También intenté llamar a finish() en onPause(). – Shubhayu

+0

¿Por qué llamas finish() en onPause()? onPause() llamado cuando va al fondo. Si presiona el botón de inicio desde BBB, se invocará onPause(). Y cuando también se llama a onBackpressed() llamado finish().Es por eso que setResult() en el trabajo onBackpressed(). ¿Por qué no pones el resultado en esos dos métodos? – Shaiful

+0

Estaba probando varias cosas tratando de descubrir el flujo y qué estaba causando el comportamiento. Acepto que se llamará a OnPause() cuando se hace clic en el botón Inicio, pero eso todavía no responde a mi pregunta de por qué el resultado que establecí explícitamente en onPause() no se propaga a AAA cuando hago clic en el botón Atrás. – Shubhayu

0

Probablemente el caso debe ser los métodos del ciclo de vida.

Al pulsar la tecla Atrás en la acreditación acctivty primer lugar onPause() se llama para que establezca algo en onPause() entonces este método es seguido por onStop() y más follwed por OnDestroy() porque se está terminando la actividad. Así que ahora si configura algo en onPause() se está configurando, pero como es seguido por onDestroy() el sistema operativo puede cancelar forzosamente su tarea cuando esta actividad finalice.

Además, si configuras algo en onPause(), si tu aplicación pierde el foco o se minimiza, también se puede llamar a OnPause(), ya que tu estabilidad de la aplicación puede perderse. Así que sugerimos no usar onPause(), mejor ir con onKeyUp() o onBackPressed().

+0

En realidad eso no debería ser un problema porque según los documentos Dev, el flujo está establecido http://developer.android.com/guide/topics/fundamentals/activities.html#CoordinatingActivities – Shubhayu

Cuestiones relacionadas