Android – Odeslání výsledku zpět přes více činností dokončeno nebo ne

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.

Napsat komentář