📚

【Kotlin】ActivityのLaunchModeについて

2021/10/03に公開

Androidアプリ開発でActivityのlaunchModeの設定が結構重要だと感じたので調べたことをまとめます。
特にBack Stackで挙動が大きく変わるので画面遷移の設計とかにもろに影響する内容だと思います。

launchModeの設定には2通りあって

  • Manifestファイルの<activity>タグの属性として設定する方法
  • Intentのfragで設定する方法

です。画面遷移毎に挙動を変える場合は2つ目の方法が必要ですが、常に同じ挙動なのであれば1つ目の方法で良いと思います。

Manifestファイルの<activity>タグの属性として設定する方法

<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の一番上でなければ新しいインスタンスを生成する
    singleTop.png
    standard.png

singleTask

  • 新しいBack StackのrootとしてActivityのインスタンスを生成する
  • ただし別のBack Stackの上にActivityのインスタンスが存在する場合は、既にあるインスタンスをonNewIntent()で呼び新しいBack Stackのrootにする
  • Activityのインスタンスは常に1つ
    singleTask.png
    図1.png

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

  • launchModesingleTaskと同じ

FLAG_ACTIVITY_SINGLE_TOP

  • launchModesingleTopと同じ

FLAG_ACTIVITY_CLEAR_TOP

  • launchModeに該当するものはない
  • 既にActivityのインスタンスが存在する場合、Back Stack上でこのActivityの上にあるインスタンスが全てdestoryされた状態でonNewIntent()メソッドで既存のインスタンスが呼ばれる
  • FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_NEW_TASKは一緒に使われることが多い
    • 新しいタスクでインスタンスを生成した時にBack Stackをclearできるから

今回の記事は以上です。

Discussion