📚
【Kotlin】ActivityのLaunchModeについて
Androidアプリ開発でActivityのlaunchMode
の設定が結構重要だと感じたので調べたことをまとめます。
特にBack Stackで挙動が大きく変わるので画面遷移の設計とかにもろに影響する内容だと思います。
launchMode
の設定には2通りあって
- Manifestファイルの
<activity>
タグの属性として設定する方法 - Intentのfragで設定する方法
です。画面遷移毎に挙動を変える場合は2つ目の方法が必要ですが、常に同じ挙動なのであれば1つ目の方法で良いと思います。
<activity>
タグの属性として設定する方法
Manifestファイルの<activity>
タグで設定できるlaunchMode
は4種類です。
下記のように設定します。
qiita.rb
puts 'code with syntax'
Manifest.xml
<activity
// 省略
android:launchMode="standard"
// 省略
</activity>
standard
- デフォルト値
- Activityのインスタンスがタスク上に生成される
- Back Stackの一番上に追加される
- 複数の異なるタスク上にインスタンスを生成することができるし、同じタスク上に複数のインスタンスを生成することもできる
singleTop
- Back Stackの一番上にActivityのインスタンスがある場合は新しくインスタンスを生成せずに、既にあるインスタンスを
onNewIntent()
で呼ぶ。 - Activityのインスタンスが存在してもBack Stackの一番上でなければ新しいインスタンスを生成する
singleTask
- 新しいBack StackのrootとしてActivityのインスタンスを生成する
- ただし別のBack Stackの上にActivityのインスタンスが存在する場合は、既にあるインスタンスを
onNewIntent()
で呼び新しいBack Stackのrootにする - Activityのインスタンスは常に1つ
Note: Although the activity starts in a new task, the Back button still returns the user to the previous activity.
singleInstance
- singleTaskとほぼ同じ
注意点
Note: The behaviors that you specify for your activity with the launchMode attribute can be overridden by flags included with the intent that start your activity,
Intentのfragで上書きされます。
Intentのfragで設定する方法
Intentのfragで設定できる値は3種類です。
FLAG_ACTIVITY_NEW_TASK
-
launchMode
のsingleTask
と同じ
FLAG_ACTIVITY_SINGLE_TOP
-
launchMode
のsingleTop
と同じ
FLAG_ACTIVITY_CLEAR_TOP
-
launchMode
に該当するものはない - 既にActivityのインスタンスが存在する場合、Back Stack上でこのActivityの上にあるインスタンスが全てdestoryされた状態で
onNewIntent()
メソッドで既存のインスタンスが呼ばれる -
FLAG_ACTIVITY_CLEAR_TOP
とFLAG_ACTIVITY_NEW_TASK
は一緒に使われることが多い- 新しいタスクでインスタンスを生成した時にBack Stackをclearできるから
今回の記事は以上です。
Discussion