Activityの画面遷移おさらい (intent.flags)

目次

スタック内の特定の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回行っても同じです。その方が書き換えやすくて良いかも。