Android – Send resultat tilbage gennem flere aktiviteter afsluttet eller ej

Nu er det komplekse tilfælde: Fire aktiviteter og en af dem dræbt

Her er den situation, jeg stod over for: Fire aktiviteter og en af dem dræbt

Her er den situation, jeg stod over for: Appen har et flow, at nogle aktiviteter ville blive afsluttet, og nogle ville blive holdt, da brugeren udfyldte formularerne.

Det problematiske flow:

A started B
B started C; B finishes itself
C started D
D sends result to A

Så den endelige stak ville være

A -> B(killed) -> C -> D

Hvordan sender man resultatet fra D tilbage til A?

Hvis ingen aktivitet blev dræbt, var det et spørgsmål om bare at kæde setResult() og onActivityResult(). Men tingene er ikke så enkle, når man dræber en aktivitet midt i processen.

Så:

Aktivitet A

goToNextActivity(){
startActivityForResult(intentActivityB, SOME_REQUEST_CODE);
}onActivityForResult(...){
doSomeStuffWithResult();
}

Aktivitet B

goToNextActivity(){
intentActivityC = new Intent(...);
startActivity(intentActivityC);
}

Hvis vi kun gør dette, vil der være et problem: Da aktivitet B ikke længere eksisterer, vil det resultat, vi har indstillet på aktivitet C, gå tabt. Så det rigtige er at tilføje dette flag (FLAG_ACTIVITY_FORWARD_RESULT) for at fortælle intentionen, at denne aktivitet vil blive afsluttet og fjernet fra backstack, hvorfor den overordnede aktivitet skal håndtere resultatet.

BEMÆRK 1: Hvis din overordnede aktivitet også vil blive afsluttet, kan du bruge dette flag igen, så den næste aktivitet i stakken vil håndtere resultatet. Af denne grund skal du starte aktiviteten med startActivity i stedet for startActivityForResult (da den ikke vil håndtere noget resultat, som flaget bestemmer)

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();
}

Dette vil sende someResultCode til C, som vil håndtere det med onActivityResult og sende det tilbage igen med setResult(….) finish();

som så vil vide ved hjælp af flaget, at aktivitet B ikke længere eksisterer, og at den aktivitet, der skal håndtere det, derfor er aktivitet A, hvilket betyder, at resultCode endelig vil ankomme i onActivityResultCode for aktivitet A.

Skriv en kommentar