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.