アクティビティの起動モード – standard
実際のプロジェクトでは、要件に応じて各アクティビティに適切な起動モードを設定します。
起動モードは全部で4種類あります:
standard、singleTop、singleTask、singleInstance
AndroidManifest.xml 内でアクティビティの launchMode を設定できます
standard はデフォルトの起動モードです
指定しなければ、すべてのアクティビティはこのモードになります
このモードでは、新しいアクティビティは常にスタックの一番上に置かれます
システムは、同じアクティビティがスタックに存在するかどうかを確認しません。
起動するたびにアクティビティの新しいインスタンスが生成されます
メインアクティビティ –> 通常アクティビティ —> メインアクティビティを起動(新規インスタンス)
この新しく作成されたメインアクティビティに対し、システムは元のメインアクティビティを無視します
では実際に動作を確認してみましょう
メインアクティビティにボタンを追加し、ボタンクリック処理の Intent で再度メインアクティビティを起動します
疑問:戻るボタンを1回押すだけでアプリが終了するように見えます
この理由は何でしょうか?
もし原因を見つけた方がいれば共有してください。
アクティビティの起動モード – singleTop
アクティビティを singleTop に設定すると、起動時に戻りスタックの先頭がそのアクティビティか確認します。もしそうなら既存インスタンスを再利用し、新しいインスタンスは作りません。
試してみましょう。AndroidManifest.xml でメインアクティビティの launchMode 属性を singleTop に設定します
これでボタンを何度押してもメインアクティビティの新規インスタンスは作成されず、ログは1回だけ出力されます。
戻るボタンを1回押すと Android アプリを終了できます
ただし、対象アクティビティがスタックの先頭にない場合は、新しいインスタンスが作成されます
Intent を変更し、まず別のアクティビティを開き、
その2番目のアクティビティからメインアクティビティを起動します。
2番目のアクティビティ表示中はスタック先頭がメインアクティビティではないため、この場合はメインアクティビティの新規インスタンスが生成されます。
I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.Code language: HTTP (http)
前回2回の講義:戻るボタンでデスクトップに戻る問題
原因はボタンイベント内に finish(); を余分に記述していたことです
Log.e(TAG, this.toString()); 現在のアクティビティのメモリアドレスを出力する記述
singleTask モード
singleTask を使用すると、アプリ全体でそのアクティビティのインスタンスは1つだけになります。
対して singleTop は「スタック先頭」に限ってインスタンスが1つであることを保証します。
singleInstance モードとタスク Task
このモードでは、システムは専用の戻りスタックを新規作成してこのアクティビティを管理します
例:3つのアクティビティがあり、2番目のアクティビティの launchMode を singleInstance に設定すると、2番目のアクティビティは別の戻りスタックで管理されます。
1番目のアクティビティから2番目へ移動、続いて2番目から3番目へ移動します。
3番目のアクティビティで戻るを押すと、まず1番目のアクティビティへ戻ります。1番目と3番目は同じ戻りスタックに属するためです。
1番目のアクティビティで再度戻るを押すと2番目のアクティビティへ移ります。1番目のアクティビティのスタックは空になっているため、システムは別タスクのスタック先頭(アクティビティ2)へ切り替えます。もう一度戻るを押すとホーム画面に戻ります。
public void onClick(View view){
Intent it = new Intent(NormalActivity.this,Activity3.class);
startActivity(it);
finish();
}Code language: JavaScript (javascript)
05-13 08:14:26.890 4746-4746/com.foxdevelop.www.lifedemo E/メインアクティビティ: 113
05-13 08:14:33.755 4746-4746/com.foxdevelop.www.lifedemo E/通常アクティビティ: 114
05-13 08:14:37.932 4746-4746/com.foxdevelop.www.lifedemo E/3番目のアクティビティ: 113
アクティビティの起動モード