Androïde – Renvoyer le résultat à travers plusieurs activités terminées ou non

Maintenant le cas complexe : Quatre activités et une d’entre elles tuée

Voici la situation à laquelle j’étais confronté : L’application a un flux selon lequel certaines activités seraient terminées et d’autres seraient conservées au fur et à mesure que l’utilisateur remplit les formulaires.

Le flux problématique:

A started B
B started C; B finishes itself
C started D
D sends result to A

Donc la pile finale serait

A -> B(killed) -> C -> D

Comment renvoyer le résultat de D à A?

Si aucune activité n’était tuée, il s’agissait juste d’enchaîner setResult() et onActivityResult(). Cependant, les choses ne sont pas aussi simples lorsque vous tuez une activité au milieu du processus.

Alors :

Activité A

goToNextActivity(){
startActivityForResult(intentActivityB, SOME_REQUEST_CODE);
}onActivityForResult(...){
doSomeStuffWithResult();
}

Activité B

goToNextActivity(){
intentActivityC = new Intent(...);
startActivity(intentActivityC);
}

Si nous ne faisons que cela, il y aura un problème : puisque l’activité B n’existe plus, le résultat que nous avons défini sur l’activité C sera perdu. Donc, la bonne chose à faire est d’ajouter ce drapeau (FLAG_ACTIVITY_FORWARD_RESULT), afin de dire à l’intention que cette activité sera terminée et retirée de la pile arrière, donc le parent devrait gérer le résultat.

NOTE 1 : si votre activité parent sera terminée aussi, vous pouvez utiliser ce drapeau à nouveau afin que l’activité suivante dans la pile gère le résultat. Pour cette raison, vous devez commencer l’activité avec startActivity au lieu de startActivityForResult (puisqu’elle ne gérera aucun résultat comme le drapeau le détermine)

goToNextActivity(){
intentActivityC = new Intent(...);
intentActivityC.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intentActivityC);
}

Activité C

goToNextActivity(){
intentActivityD = new Intent(…);
intentActivityD;
startActivityForResult(intentActivityD, SOME_REQUEST_CODE);
}onActivityResult(int reqCode, int resultCode){
if(reqCode == SOME_REQUEST_CODE){
setResult(resultCode);
finish();
}
}

Activité D

goBackToActivityA(){
setResult(someResultCode);
finish();
}

Cela enverra someResultCode à C, qui le gérera avec le onActivityResult et le renverra à nouveau avec setResult(….) finish();

qui saura alors par le drapeau que l’activité B n’existe plus, donc l’activité qui doit la traiter est l’activité A, ce qui signifie que le resultCode arrivera finalement dans le onActivityResultCode de l’activité A.

Laisser un commentaire