Activityの画面遷移おさらい (intent.flags)
2021/03/30
目次
スタック内の特定のActivityへ戻る
A => B => C => D
↓
A => B
Dにいて、Bまで戻る
val intent = Intent(this, B_Activity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
startActivity(intent)
FLAG_ACTIVITY_SINGLE_TOPを指定しないと一般的な戻る挙動にならず、画面が再構築されてしまいます。
ボタン連打による重複起動も防げるので、新規Activityでも有効な方法です。
スタック内の特定のActivityを呼び出す
A => B => C => D
↓
A => C => D => B
Dにいて、Bを呼び出す
FLAG_ACTIVITY_REORDER_TO_FRONTを使います。フロントとはスタックのトップのこと。指定したActivityがスタック内にあれば、以前の状態のままトップに移動させることができます。
val intent = Intent(this, B_Activity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
startActivity(intent)
フラグメントなしでタブ機能を実装したい場合などに利用します。
今のActivityを新しいActivityに置き換える
A => B => C => D
↓
A => B => C => E
Dにいて、新しいEと交換する
Eを追加してからDをfinishしておけばOKです。
val intent = Intent(this, E_Activity::class.java)
startActivity(intent)
finish()
今のActivityを新たに作り直す
A => B => C => D
Dを作り直す
val intent = Intent(this, this::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
レイアウトが複雑で部分的な更新が難しい場合などに利用します。
フラグだけで対応できない場合は、複数回に分けて一括遷移する
A => B => C => D
↓
A => B => E
Dにいて、Bまで戻って、Eを追加する
遷移アニメーションは1回分しか起こらないので、直接DからEへ遷移したように見えます。
val baseIntent = Intent(this, B_Activity::class.java)
baseIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
val newIntent = Intent(this, E_Activity::class.java)
startActivities(arrayOf(baseIntent, newIntent))
配列にまとめなくても、startActivity()を2回行っても同じです。その方が書き換えやすくて良いかも。