Android – Skicka tillbaka resultatet genom flera aktiviteter avslutade eller inte

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.

Lämna en kommentar