web-dev-qa-db-fra.com

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

dans certaines parties de ma candidature, il existe une structure d'activités comme celle-ci:

enter image description here

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).

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 il est cliqué sur le bouton OK il suit le flux et l'activité en cours appelle finish()

Question:

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?

47
jalv1039

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

60
NickT

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();
}
10
Brian Dupuis

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(...
}
0
Patrick Maroney