Android – Ergebnis zurücksenden durch mehrere Aktivitäten beendet oder nicht

Nun der komplexe Fall: Vier Aktivitäten und eine davon beendet

Hier ist die Situation, mit der ich konfrontiert war: Die App hat einen Fluss, bei dem einige Aktivitäten beendet werden und einige beibehalten werden, während der Benutzer die Formulare ausfüllt.

Der problematische Fluss:

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

Der endgültige Stack wäre also

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

Wie kann das Ergebnis von D zurück nach A gesendet werden?

Wenn keine Aktivität beendet wurde, war es eine Frage der einfachen Verkettung von setResult() und onActivityResult(). Die Dinge sind jedoch nicht so einfach, wenn man eine Aktivität in der Mitte des Prozesses beendet.

So:

Aktivität A

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

Aktivität B

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

Wenn wir nur dies tun, gibt es ein Problem: Da Aktivität B nicht mehr existiert, geht das Ergebnis, das wir auf Aktivität C gesetzt haben, verloren. Daher ist es richtig, dieses Flag (FLAG_ACTIVITY_FORWARD_RESULT) hinzuzufügen, um dem Intent mitzuteilen, dass diese Aktivität beendet und aus dem Backstack entfernt wird, so dass die übergeordnete Aktivität das Ergebnis verarbeiten sollte.

HINWEIS 1: Wenn Ihre übergeordnete Aktivität ebenfalls beendet wird, können Sie dieses Flag erneut verwenden, so dass die nächste Aktivität im Stapel das Ergebnis verarbeiten wird. Aus diesem Grund musst du die Aktivität mit startActivity statt mit startActivityForResult starten (da sie kein Ergebnis verarbeiten wird, wie das Flag bestimmt)

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

Aktivität C

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

Aktivität D

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

Diese sendet someResultCode an C, die es mit dem onActivityResult verarbeitet und es mit setResult(…) finish();

Dieser wird dann durch das Flag wissen, dass die Aktivität B nicht mehr existiert, daher ist die Aktivität, die es behandeln sollte, Aktivität A, was bedeutet, dass der resultCode schließlich im onActivityResultCode von Aktivität A ankommen wird.

Schreibe einen Kommentar