android:launchMode="singleTask"

タスクをいろいろといじっていて、頭の中が混乱してきたので整理。

launchMode

デフォルトでは、起動したアクティビティはみんな同じタスクに入る。かつ、呼び出されるごとに同じアクティビティがいくつでもインスタンス化されて積まれる。
でも、その挙動を変えたいよねー、というときには AndroidManifest.xml に launchMode を設定する。

launchMode の種類

  • standard(デフォルト値)
  • singleTop
  • singleTask
  • singleInstance

singleTask

The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to its onNewIntent() method, rather than creating a new one.

<activity> | Android Developersより引用

私の認識(公式ドキュメントと、自分で作成したサンプルによる考察)
  • この設定がされたアクティビティは新しいタスクのルートとして配置される
    • 同じ taskAffinity が設定されているアクティビティ同士は同じタスクに配置されるので、必ずしもルートとして配置されるとは限らない(明示的な記述は見つからないが、実際の動きがそうなっている)
  • でも同じアクティビティが既にあったら、新しく作らずに onNewIntent() を呼ぶ
    • その際、対象アクティビティが処理を受け付ける必要があるため、上に積まれていたアクティビティは破棄(明示的な記述は見つからないが、実際の動きがそうなっている)

TODO: あとで図を使って整理