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.