Comment retourner un résultat à travers plusieurs activités

Dans certaines parties de ma candidature, il y a une structure d’activités comme celle-ci:

entrer la description de l'image ici

Activity A est mon activité à la maison où je reviens après chaque processus ou stream.
Activity B est une simple activité de confirmation.
Activity C est une autre activité de confirmation.
Activity D effectue un certain processus et finalement, le résultat est renvoyé à mon activité à domicile ( Activity A ).

Exigences:

Activity B et C :

  • doit être là et ne peut pas être fusionné en un.
  • quand il est cliqué sur le bouton d’annulation, il appelle finish() et ne fait rien.
  • quand on clique sur le bouton OK, il suit le stream et l’activité en cours appelle finish()

Question:

Je pensais utiliser startActivityForResult() mais je ne l’ai jamais utilisé pour transmettre un résultat via plusieurs activités.
Je pensais aussi à passer un handler (créé dans l’ Activity A ) qui appelle une méthode sur l’ Activity A et qui est exécuté sur l’ Activity D

Comment pourrais-je le mettre en œuvre?

Vous pouvez utiliser l’indicateur d’intention FLAG_ACTIVITY_FORWARD_RESULT comme décrit dans Intent lors du démarrage des activités B et C

final statique public int FLAG_ACTIVITY_FORWARD_RESULT

Depuis: API Niveau 1

Si cette option est utilisée et que cette intention est utilisée pour lancer une nouvelle activité à partir d’une activité existante, la cible de réponse de l’activité existante sera transférée à la nouvelle activité. De cette manière, la nouvelle activité peut appeler setResult(int) et renvoyer ce résultat à la cible de réponse de l’activité d’origine.

De cette façon, A devrait récupérer toutes les données renvoyées dans les extras renvoyés par D

Yup, super formatage. Et vous pouvez – et probablement devriez – certainement appeler startActivityForResult() partir de chacune des activités A, B et C (et ne finish() pas finish() tout de suite). En B et C, vous pouvez vérifier le résultat et finish() , en renvoyant le résultat à A.

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if((resultCode == RESULT_OK) && (requestCode == MY_RESULT_CODE)) { setResult(RESULT_OK, data); finish(); } } 

Si vous souhaitez que B et C disparaissent, procédez comme suit:

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { setResult(resultCode, data); finish(); } 

Je sais que c’est une très vieille question mais je voulais mettre une solution valide, utiliser onNewIntent() et la traiter comme onActivityResult() .

Dans l’activité D, vous structurez votre intention en tant que

 Intent intent = new Intent(yourContext, Activity_A.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("someName", data); startActivity(intent); finish(); 

puis dans Activity_A

 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // update your UI intent.getSerializableExtra(... } 

Vous pourriez faire B et C en tant que dialogs qui sont déclenchés à partir de A et seulement si B et C sont ok, vous exécutez D avec startActivityForResult()