Android – Enviar resultado através de múltiplas atividades terminadas ou não

Agora o caso complexo: Quatro actividades e uma delas morta

Aqui está a situação que eu estava a enfrentar: O aplicativo tem um fluxo que algumas atividades seriam finalizadas e algumas seriam mantidas enquanto o usuário preenchia os formulários.

O fluxo problemático:

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

Então a pilha final seria

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

Como enviar o resultado de D de volta para A?

Se nenhuma atividade fosse morta, era uma questão de apenas encadear setResult() e onActivityResult(). Entretanto, as coisas não são tão simples quando você mata uma atividade no meio do processo.

So:

Atividade A

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

Atividade B

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

Se só fizermos isso, haverá um problema: Como a atividade B não existe mais, o resultado que definimos na atividade C será perdido. Então a coisa certa a fazer é adicionar esta bandeira (FLAG_ACTIVITY_FORWARD_RESULT), a fim de dizer a intenção de que esta atividade será finalizada e removida do backstack, portanto o pai deve lidar com o resultado.

NOTE 1: se sua atividade pai também será finalizada, você pode usar esta bandeira novamente para que a próxima atividade na pilha irá lidar com o resultado. Devido a este motivo, você deve iniciar a atividade com startActivity ao invés de startActivityForResult (já que ela não irá lidar com nenhum resultado como a bandeira determina)

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

Activity C

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

Activity D

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

Isso irá enviar algumResultCode para C, que irá lidar com ele com o onActivityResult e enviá-lo de volta com o setResult(…) terminar();

que então saberá pela bandeira que a atividade B não existe mais, daí que a atividade que deve lidar com ela é a A, o que significa que o código de resultado finalmente chegará no onActivityResultCode da atividade A.

Deixe um comentário