Android – Az eredmény visszaküldése több tevékenységen keresztül befejeződött vagy sem

Most az összetett eset: Négy tevékenység és az egyiket megölték

Itt a helyzet, amivel szembesültem: Az alkalmazásnak van egy olyan áramlása, hogy néhány tevékenység befejeződik és néhány megmarad, ahogy a felhasználó kitölti az űrlapokat.

A problémás áramlás:

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

A végső verem tehát

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

Hogyan küldjük vissza az eredményt D-ből A-ba?

Ha egyik tevékenység sem halt meg, akkor csak a setResult() és az onActivityResult() láncolata volt a feladat. A dolgok azonban nem ilyen egyszerűek, ha a folyamat közepén megölünk egy aktivitást.

Szóval:

Activity A

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

Activity B

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

Ha csak ezt csináljuk, akkor lesz egy probléma: Mivel a B aktivitás már nem létezik, a C aktivitáson beállított eredmény elveszik. A helyes tehát, ha hozzáadjuk ezt a flag-et (FLAG_ACTIVITY_FORWARD_RESULT), hogy közöljük a szándékkal, hogy ez a tevékenység befejeződik és eltávolítjuk a backstackből, tehát a szülőnek kell kezelnie az eredményt.

MEGJEGYZÉS 1: ha a szülő tevékenység is befejeződik, akkor ismét használhatjuk ezt a flag-et, hogy a következő tevékenység a stackben kezelje az eredményt. Emiatt a startActivityForResult helyett startActivityForResult-tal kell indítani az aktivitást (mivel az nem fog semmilyen eredményt kezelni, ahogy a flag meghatározza)

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

Activity C

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

Activity D

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

Ez elküldi a someResultCode-ot a C-nek, amely azt az onActivityResult-tal kezeli, majd a setResult(….) finish();

amely ezután a flag alapján tudni fogja, hogy a B tevékenység már nem létezik, tehát a tevékenység, amelynek ezt kezelnie kell, az A tevékenység, ami azt jelenti, hogy az resultCode végül az A tevékenység onActivityResultCode-jában fog megérkezni.

Szólj hozzá!