Android – Rispedire il risultato attraverso più attività finite o no

Ora il caso complesso: Quattro attività e una di esse uccisa

Ecco la situazione che stavo affrontando: L’applicazione ha un flusso per cui alcune attività sarebbero finite e altre sarebbero state mantenute mentre l’utente riempiva i moduli.

Il flusso problematico:

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

Quindi lo stack finale sarebbe

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

Come inviare il risultato da D ad A?

Se nessuna attività fosse stata uccisa, era una questione di semplice concatenazione di setResult() e onActivityResult(). Tuttavia, le cose non sono così semplici quando si uccide un’attività nel mezzo del processo.

Quindi:

Attività A

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

Attività B

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

Se facciamo solo questo, ci sarà un problema: poiché l’attività B non esiste più, il risultato che abbiamo impostato sull’attività C sarà perso. Quindi la cosa giusta da fare è aggiungere questo flag (FLAG_ACTIVITY_FORWARD_RESULT), per dire all’intento che questa attività sarà finita e rimossa dal backstack, quindi il genitore dovrebbe gestire il risultato.

NOTA 1: se anche la tua attività genitore sarà finita, puoi usare ancora questo flag così la prossima attività nello stack gestirà il risultato. Per questo motivo, devi iniziare l’attività con startActivity invece di startActivityForResult (poiché non gestirà alcun risultato come determina il flag)

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

Attività C

goToNextActivity(){
intentActivityD = new Intent(…);
intentActivityD;
startActivityForResult(intentActivityD, SOME_REQUEST_CODE);
}onActivityResult(int reqCode, int resultCode){
if(reqCode == SOME_REQUEST_CODE){
setResult(resultCode);
finish();
}
}

Attività D

goBackToActivityA(){
setResult(someResultCode);
finish();
}

Questo invierà someResultCode a C, che lo gestirà con onActivityResult e lo rinvierà nuovamente con setResult(..) finish();

che poi saprà dal flag che l’attività B non esiste più, quindi l’attività che dovrebbe gestirla è l’attività A, il che significa che il resultCode arriverà infine nell’onActivityResultCode dell’attività A.

Lascia un commento