Dans certaines parties de ma candidature, il y a une structure d’activités comme celle-ci:
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
).
Activity B
et C
:
finish()
et ne fait rien. finish()
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()