Activityの起動モード
最終更新日:2016-08-05
起動モード
タスクで、生成したActivityはタスクとよばれるスタックに積まれることがわかりました。
IntentをActivityに対して投げるとActivityが起動しますが、Androidでは次の4つの起動モードが存在します。
- Standard(デフォルト)
 - SingleTop
 - SingleTask
 - SingleInstance
 
ここでは、この起動モードについて説明します。
Standard
これはデフォルトの起動モードです。Activityインスタンスを必ず生成し、Intentを投げたタスクの上に積みます。Standard設定しているActivityで、自分自身へのIntentを投げると同じActivityがどんどんスタックに積まれ、バックボタンを押すと1つずつ戻る動作をします。
SingleTop
Standardと同じように、Intentを投げたタスクの上にActivityを積もうとしますが、もし該当Activityがタスクの一番上にいた場合(=自分自身を呼び出した場合)は、新しくActivityインスタンスを生成せずにonNewIntent()が代わりに呼ばれます。
タスクの一番上にいない場合は新しいActivityインスタンスを生成しタスクに積むので、A->B->A->BのようなActivity遷移を行うと、Activityインスタンスは複数生成できます。
SingleTask
ここまでの2つはIntentを投げたタスクの上にActivityを積みましたが、SingleTaskなActivityは
- 同じタスクがなければ新しいタスクを作ってそれをフォアグラウンドにする
 - 同じタスクがいれば、そのActivityの上にのっているActivityを全部破棄してフォアグラウンドにする
 
という動作をします。Androidの標準カメラアプリなどはホームから起動するActivityがこのSingleTaskに設定されています。なぜなら
- カメラアプリからプレビューに遷移し、タスク切り替えで戻ってくるとプレビューがちゃんと表示される
 - ホームから起動すると、常に撮影のActivityが起動する(たとえプレビュー画面で中断していたとしても)
 
という動作をしているからです。カメラ撮影はなるべく早くやりたい動作ですからね。
ホームから起動されるActivityにこのSingleTaskをつけるときは、「ユーザーはすぐこのタスクを始めることができるべきか」に注意しましょう。
SingleInstance
SingleTaskの動作に加え、スタックの上にActivityを1つも置けなくしたのがこのSingleInstanceです。ブラウザあたりがこのSingleInstanceに設定されています。なぜなら
- 他のアプリからブラウザを起動しようとすると、必ずタスク切り替えになる
 - ブラウザから他のActivityを起動しようとすると、必ず別タスクでActivityが起動する
 
という動作をしているからです。
4つの起動モードを説明しましたが、イメージできたでしょうか?

