Activityのスタックをクリア(全削除)する方法で勘違いされている場合が多い

よくある勘違い

色々なところで書いてある以下のコードとその説明のニュアンスがちょっと違う

Intent intent = new Intent(getApplicationContext(), NextActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Intent.FLAG_ACTIVITY_CLEAR_TOP
呼び出すActivity以外のActivityをクリアして起動させる
Intent.FLAG_ACTIVITY_NEW_TASK
スタックに残っていても、新しくタスクを起動させる

以下の説明のほうが正しいと思う。

Intent.FLAG_ACTIVITY_CLEAR_TOP
起動されるAcitivityより前のスタックのAcitvityをクリアして起動させる

例を上げて考えてみると

A → B → C → D → E → F

この状態でAを起動するとそれより上にあるAcitivtyがクリアされるからAだけになるけどCを起動したとすると

A → B → C

こうなる。このスタックに存在しないGというアクティビティを起動した場合は

A → B → C → D → E → F → G

こうなる。つまり「呼び出すActivity以外のActivityをクリアして起動させる」というのは違う。

まとめ

スタックで戻りたくない場合というのはログアウトしてログイン画面へと無理やり遷移し、ログイン後に使用できる画面を表示させたくない場合だと思う。例で記載しているようにAというAcitivityが存在しないと全てのスタックをクリアすることは難しい。そのため基底のActivityを作り、そのActivityが絶対に存在するという状況を作り出す必要がある。この基底のAcitivtyが絶対存在するという状況を作るのがなかなか難しいわけだが、理屈さえわかればstartActivityForResult()とonActivityResult()を使ってうまく作れそうな気がする。