さて、今度は複雑なケースです。 4 つのアクティビティとそのうちの 1 つを終了させる
私が直面していた状況は次のとおりです。 アプリには、ユーザーがフォームに入力すると、一部のアクティビティが終了し、一部が保持されるというフローがあります。
A started B
B started C; B finishes itself
C started D
D sends result to A
したがって、最終的なスタックは
A -> B(killed) -> C -> D
D から A に結果を送信する方法は?
どのアクティビティも終了しなかった場合、単に setResult() と onActivityResult() を連結すればよかったのです。
So:
Activity A
goToNextActivity(){
startActivityForResult(intentActivityB, SOME_REQUEST_CODE);
}onActivityForResult(...){
doSomeStuffWithResult();
}
Activity B
goToNextActivity(){
intentActivityC = new Intent(...);
startActivity(intentActivityC);
}
これだけだと問題があります。アクティビティBがもう存在しないので、アクティビティCに設定した結果が失われることになるからです。 したがって、正しいことは、このフラグ (FLAG_ACTIVITY_FORWARD_RESULT) を追加して、このアクティビティが終了してバックスタックから削除され、したがって親が結果を処理する必要があることをインテントに伝えることです。 このため、startActivityForResultの代わりにstartActivityでアクティビティを開始する必要があります(フラグが決定するように結果を処理しないため)
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();
}
これによりsomeResultCodeがCへ送られ、onActivityResultでそれを処理してから、再び setResult(…でそれを送り返すことになる)が行われます。) finish();
そして、アクティビティBがもはや存在しないこと、したがって、それを処理すべきアクティビティはアクティビティAであることをフラグによって知ることになり、アクティビティAのonActivityResultCodeに最終的に結果コードが到着することを意味します。