Nu kommer det komplexa fallet: Fyra aktiviteter och en av dem dödades
Här är situationen jag stod inför: Appen har ett flöde där vissa aktiviteter skulle avslutas och andra skulle behållas när användaren fyllde i formuläret.
Det problematiska flödet:
A started B
B started C; B finishes itself
C started D
D sends result to A
Så den slutliga stapeln skulle vara
A -> B(killed) -> C -> D
Hur skickar man resultatet från D tillbaka till A?
Om ingen aktivitet dödades, var det en fråga om att bara kedja setResult() och onActivityResult(). Det är dock inte så enkelt när man dödar en aktivitet mitt i processen.
Så:
Aktivitet A
goToNextActivity(){
startActivityForResult(intentActivityB, SOME_REQUEST_CODE);
}onActivityForResult(...){
doSomeStuffWithResult();
}
Aktivitet B
goToNextActivity(){
intentActivityC = new Intent(...);
startActivity(intentActivityC);
}
Om vi bara gör det här kommer det att finnas ett problem: Eftersom aktivitet B inte längre existerar kommer det resultat som vi satt på aktivitet C att gå förlorat. Så det rätta är att lägga till den här flaggan (FLAG_ACTIVITY_FORWARD_RESULT) för att tala om för intentionen att den här aktiviteten kommer att avslutas och tas bort från backstacken, vilket innebär att den överordnade aktiviteten bör hantera resultatet.
NOT 1: Om den överordnade aktiviteten också kommer att avslutas kan du använda den här flaggan igen så att nästa aktivitet i stapeln hanterar resultatet. Av denna anledning måste du starta aktiviteten med startActivity istället för startActivityForResult (eftersom den inte kommer att hantera något resultat som flaggan bestämmer)
goToNextActivity(){
intentActivityC = new Intent(...);
intentActivityC.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intentActivityC);
}
Aktivitet C
goToNextActivity(){
intentActivityD = new Intent(…);
intentActivityD;
startActivityForResult(intentActivityD, SOME_REQUEST_CODE);
}onActivityResult(int reqCode, int resultCode){
if(reqCode == SOME_REQUEST_CODE){
setResult(resultCode);
finish();
}
}
Aktivitet D
goBackToActivityA(){
setResult(someResultCode);
finish();
}
Detta kommer att skicka someResultCode till C, som hanterar det med onActivityResult och skickar tillbaka det igen med setResult(….) finish();
som då kommer att veta med hjälp av flaggan att aktivitet B inte längre existerar, och att den aktivitet som ska hantera den därför är aktivitet A, vilket innebär att resultCode slutligen kommer att hamna i onActivityResultCode för aktivitet A.