setResult no funciona cuando se presiona el botón ATRÁS

Intento establecer el resultado después de presionar el botón ATRÁS. Llamo a Destroy

Intent data = new Intent(); setResult(RESULT_OK, data) 

Pero cuando se trata de

 onActivityResult(int requestCode, int resultCode, Intent data) 

el resultCode es 0 (RESULT_CANCELED) y los datos son ‘nulos’.

Entonces, ¿cómo puedo pasar el resultado de la actividad terminada por el botón ATRÁS?

Necesita reemplazar el método onBackPressed () y establecer el resultado antes de la llamada a la superclase, es decir,

 @Override public void onBackPressed() { Bundle bundle = new Bundle(); bundle.putString(FIELD_A, mA.getText().toString()); Intent mIntent = new Intent(); mIntent.putExtras(bundle); setResult(RESULT_OK, mIntent); super.onBackPressed(); } 

Activity resultado de la Activity debe establecerse antes de llamar a finish() . Al hacer clic en ATRÁS, realizamos una llamada a finish() en su activity , para que pueda usar el siguiente fragmento de código:

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

Si llama a NavUtils.navigateUpFromSameTask(); en onOptionsItemSelected() , se llama a finish() , pero obtendrá el result code incorrecto. Por lo tanto, debe llamar a finish() no a navigateUpFromSameTask en onOptionsItemSelected() . Código de solicitud incorrecto en onActivityResult

Si desea establecer un RESULT_CODE personalizado en el evento onBackPressed , primero debe establecer el result y luego llamar al super.onBackPressed() y recibirá el mismo RESULT_CODE en el método onActivityResult la actividad de la persona que llama.

  @Override public void onBackPressed() { setResult(SOME_INTEGER); super.onBackPressed(); } 

Refactoré mi código. Inicialmente preparé algunos datos y los configuré como activity result en onDestroy (esto no funcionó). Ahora configuro datos de activity cada vez que se actualizan los datos que se van a devolver, y no tengo nada en onDestroy .

Consulte onActivityResult (int, int, Intent) doc

La solución es verificar el código de resultado para el valor Activity.RESULT_CENCELED . Si es así, significa que se presionó BACK o la actividad se bloqueó. Espero que funcione para ustedes, funciona para mí :).

Debe anular onOptionsItemSelected como este:

 @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case android.R.id.home: final Intent mIntent = new Intent(); mIntent.putExtra("param", "value"); setResult(RESULT_OK, mIntent); finish(); return true; default: return super.onOptionsItemSelected(item); } } 

onDestroy es demasiado tarde en la cadena; en su lugar, anula onPause y isFinishing() para verificar si tu actividad se encuentra al final de su ciclo de vida.

Intente anular onBackPressed (desde el nivel 5 de Android) o anule onKeyDown () y capture KeyEvent.BUTTON_BACK (vea los resultados de la actividad de Android ). Esto funciona bien para mí.

No confíe en ninguna lógica ejecutada en OnPause de una actividad cuando regrese a la inicial. De acuerdo con los documentos:

Las implementaciones de este método (onPause) deben ser muy rápidas porque la próxima actividad no se reanudará hasta que este método regrese

Ver http://goo.gl/8S2Y para más detalles.

La forma más segura es establecer el resultado después de completar cada operación de alteración de resultados (como mencionas en tu respuesta)

pego la respuesta puede ser útil para otras personas: cuando un set launcheMode con android: launchMode = “singleTask” tampoco puedo obtener el resultado, el documento dice:

  /* 

Note that this method should only be used with Intent protocols * that are defined to return a result. In other protocols (such as * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may * not get the result when you expect. For example, if the activity you * are launching uses the singleTask launch mode, it will not run in your * task and thus you will immediately receive a cancel result. */

y:

  /* 

As a special case, if you call startActivityForResult() with a requestCode * >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your * activity, then your window will not be displayed until a result is * returned back from the started activity. This is to avoid visible * flickering when redirecting to another activity. */