setResult ne fonctionne pas lorsque le bouton BACK est enfoncé

J’essaie de définirResult après avoir appuyé sur le bouton BACK. J’appelle onDestroy

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

Mais quand il s’agit de

 onActivityResult(int requestCode, int resultCode, Intent data) 

le resultCode est 0 (RESULT_CANCELED) et les données sont ‘null’.

Alors, comment puis-je passer le résultat de l’activité terminée par le bouton RETOUR?

Vous devez remplacer la méthode onBackPressed () et définir le résultat avant l’appel à la superclasse, c.-à-d.

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

Activity résultat de l’ Activity doit être défini avant l’ appel de finish() . En cliquant sur BACK, vous appelez en fait finish() sur votre activity , vous pouvez donc utiliser l’extrait suivant:

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

Si vous appelez NavUtils.navigateUpFromSameTask(); dans onOptionsItemSelected() , finish() est appelé, mais vous obtiendrez le mauvais result code . Donc, vous devez appeler finish() pas navigateUpFromSameTask dans onOptionsItemSelected() . mauvaise demandeCode inActivityResult

Si vous souhaitez définir certains RESULT_CODE personnalisés dans l’événement onBackPressed , vous devez d’abord définir le result , puis appeler le super.onBackPressed() et vous recevrez le même RESULT_CODE dans la méthode onActivityResult l’activité de l’appelant onActivityResult

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

J’ai refait mon code. Au départ, j’ai préparé des données et les ai définies en tant activity result dans onDestroy (cela n’a pas fonctionné). Maintenant, je définis les données d’ activity chaque fois que les données à retourner sont mises à jour et n’ont rien dans onDestroy .

Refer onActivityResult (int, int, Intent) doc

La solution consiste à vérifier le resultCode pour la valeur Activity.RESULT_CENCELED . Si oui, alors cela signifie que soit BACK a été pressé ou l’activité s’est brisée. J’espère que ça marche pour vous les gars, ça marche pour moi :).

Vous devez remplacer onOptionsItemSelected comme ceci:

 @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 est trop tard dans la chaîne – remplacez plutôt onPause et vérifiez isFinishing() pour vérifier si votre activité est à la fin de son cycle de vie.

Essayez de substituer onBackPressed (à partir du niveau androïde 5), ou écrasez onKeyDown () et interceptez KeyEvent.BUTTON_BACK (voir Résultats de l’activité Android ).

Ne vous fiez à aucune logique exécutée dans onPause d’une activité lorsque vous revenez à la première. Selon les documents:

Les implémentations de cette méthode (onPause) doivent être très rapides car l’activité suivante ne sera pas reprise tant que cette méthode ne sera pas retournée

Voir http://goo.gl/8S2Y pour plus de détails.

Le moyen le plus sûr est de définir le résultat après chaque opération de modification du résultat est terminée (comme vous le mentionnez dans votre réponse)

Je colle la réponse peut être utile à d’autres personnes: quand un launcheMode défini avec Android: launchMode = “singleTask” je ne peux pas non plus obtenir le résultat, le doc dit:

  /* 

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. */

et:

  /* 

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. */