dans certaines parties de ma candidature, il existe une structure d'activités comme celle-ci:
Activity A
est mon activité à la maison où je reviens après chaque processus ou flux.Activity B
est une simple activité de confirmation.Activity C
est une autre activité de confirmation.Activity D
effectue un processus et, finalement, il renvoie le résultat à mon activité d'origine (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 lors de multiples activités.
Je pensais aussi passer une handler
(créée dans Activity A
) qui appelle une méthode sur Activity A
et est exécutée sur Activity D
...
Comment pourrais-je le mettre en œuvre?
Vous voudrez peut-être utiliser l'indicateur d'intention FLAG_ACTIVITY_FORWARD_RESULT comme décrit dans Intent
lors du démarrage des activités B et C
public static final int FLAG_ACTIVITY_FORWARD_RESULT
Depuis: API niveau 1
Si cette option est définie 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 est transférée vers la nouvelle activité. Ainsi, 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
Eh oui, très bon formatage. Et vous pouvez, et devriez probablement, appeler définitivement startActivityForResult()
pour chacune des activités A, B et C (et non 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 voulez que B et C disparaissent malgré tout, procédez comme suit:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
setResult(resultCode, data);
finish();
}
Je sais que la question est très ancienne, mais je voulais mettre en place une solution valable, utiliser onNewIntent()
et la traiter comme onActivityResult()
.
Dans l'activité D, vous structureriez votre intention en
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(...
}