Nyní složitý případ: Čtyři aktivity a jedna z nich zabita
Tady je situace, se kterou jsem se setkal:
Problematický tok:
A started B
B started C; B finishes itself
C started D
D sends result to A
Takže konečný zásobník by byl
A -> B(killed) -> C -> D
Jak poslat výsledek z D zpět do A?
Pokud nebyla žádná aktivita zabita, šlo jen o řetězení setResult() a onActivityResult(). Tak jednoduché to však není, když aktivitu zabijete uprostřed procesu.
Takže:
Aktivita A
goToNextActivity(){
startActivityForResult(intentActivityB, SOME_REQUEST_CODE);
}onActivityForResult(...){
doSomeStuffWithResult();
}
Aktivita B
goToNextActivity(){
intentActivityC = new Intent(...);
startActivity(intentActivityC);
}
Pokud uděláme pouze toto, nastane problém: Protože aktivita B již neexistuje, výsledek, který jsme nastavili na aktivitě C, bude ztracen. Proto je správné přidat tento příznak (FLAG_ACTIVITY_FORWARD_RESULT), abychom záměru sdělili, že tato aktivita bude ukončena a odstraněna ze zásobníku, tudíž výsledek má zpracovat nadřízená aktivita.
Poznámka 1: pokud bude ukončena i nadřízená aktivita, můžete tento příznak použít znovu, aby výsledek zpracovala další aktivita v zásobníku. Z tohoto důvodu musíte aktivitu spustit pomocí startActivity místo startActivityForResult (protože nebude zpracovávat žádný výsledek, jak určuje příznak)
goToNextActivity(){
intentActivityC = new Intent(...);
intentActivityC.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intentActivityC);
}
Aktivita C
goToNextActivity(){
intentActivityD = new Intent(…);
intentActivityD;
startActivityForResult(intentActivityD, SOME_REQUEST_CODE);
}onActivityResult(int reqCode, int resultCode){
if(reqCode == SOME_REQUEST_CODE){
setResult(resultCode);
finish();
}
}
Aktivita D
goBackToActivityA(){
setResult(someResultCode);
finish();
}
Tímto se pošle someResultCode do C, které ho zpracuje pomocí onActivityResult a pošle zpět opět pomocí setResult(….) finish();
který pak podle příznaku pozná, že aktivita B již neexistuje, tudíž aktivita, která ji má zpracovat, je aktivita A, což znamená, že resultCode nakonec dorazí do onActivityResultCode aktivity A.