タスクとバックスタック

タスクは、ユーザーが次のことを行うために操作するアクティビティの集まりです。 アクションを起こすことがありますこれらのアクティビティは、アクティビティと呼ばれる バックスタックに配置されます。

たとえば、メールアプリが 新着メッセージの一覧を表示するアクティビティが 1 つあるとします。ユーザーが 新しいアクティビティが開き、そのメッセージが表示されます。この新しいアクティビティは バックスタックに送られます。ユーザーが [戻る] をタップまたはジェスチャーを行うと、 スタックからポップされます。

タスクのライフサイクルとそのバックスタック

デバイスのホーム画面は、ほとんどのタスクが開始される場所です。ユーザーが アプリ ランチャーまたはホーム画面のアプリまたはショートカットのアイコン そのアプリのタスクがフォアグラウンドに移る場合です。アプリにタスクが存在しない場合は、 新しいタスクが作成され、メインの そのアプリのアクティビティが開く 必要ありません。

現在のアクティビティが別のアクティビティを開始すると、新しいアクティビティが一番上にプッシュされる フォーカスが置かれます。前のアクティビティはスタックに残りますが、 停止しました。アクティビティが停止すると、システムはそのアクティビティの 表示されます。ユーザーが「戻る」アクションを実行すると、現在のアクティビティは スタックの一番上からポップされ、破棄されます。「 以前のアクティビティが再開され、その UI の以前の状態が復元されます。

次の場所でのアクティビティ: スタックは再配置されず、そのままの状態でスタックに push またはポップされるだけです。 現在のアクティビティによって開始され、ユーザーが閉じた 戻るボタンやジェスチャーで操作できます。そのため、バックスタックは 後入れ先出しのオブジェクト構造にする必要があります。図 1 は、 バックスタックに push される、またはバックスタックからポップされるアクティビティ。

図 1. タスク内の新しいアクティビティがそれぞれどのようにしてバックスタックにアイテムを追加しているかを表しています。ユーザーがタップやジェスチャーを行ったとき 戻ると、現在のアクティビティは破棄され、前のアクティビティが 再開できます。

ユーザーがタップまたは「戻る」ジェスチャーを続けると、スタック内の各アクティビティ ユーザーが [ホーム] に戻るまで、前の画面が表示されます。 タスクの開始時に実行されていたアクティビティに表示できます。すべての時間が タスクが削除されると、タスクはなくなります。

ルート ランチャー アクティビティのバックタップ動作

ルート ランチャー アクティビティは、インテントを宣言するアクティビティ 両方でフィルタ ACTION_MAINCATEGORY_LAUNCHER。 これらのアクティビティは、他の場所からアプリへのエントリ ポイントとして機能するため、 タスクを開始するために使用されます。

ユーザーがルート ランチャー アクティビティからタップまたはジェスチャー [戻る] を行うと、 Android のバージョンに応じて、イベントの処理方法が異なります。 確認します。

Android 11 以前でのシステム動作
システムがアクティビティを終了する。
Android 12 以降でのシステム動作

システムは、アクティビティとそのタスクをバックグラウンドに アクティビティを終了します。この動作は、次の場合にデフォルトのシステム動作と一致します。 ホームボタンまたはジェスチャーを使用してアプリから移動する

ほとんどの場合、この動作により、ユーザーはアプリをより迅速に再開できます。 ウォーム状態から コールド状態からアプリを完全に再起動する 確認します

カスタムの「戻る」ナビゲーションを提供する必要がある場合は、 オーバーライドするのではなく、AndroidX Activity API を使用することをおすすめします。 onBackPressed()。AndroidX Activity API は自動的に システムをインターセプトするコンポーネントがない場合の、適切なシステム動作 バックタップ。

ただし、アプリでオーバーライドすると、 onBackPressed() で処理 「戻る」ナビゲーションとアクティビティを終了し、以下を呼び出すように実装を更新します。 終了ではなく super.onBackPressed() になりました。発信中 super.onBackPressed() は、次の場合にアクティビティとそのタスクをバックグラウンドに移動します。 より一貫性のあるナビゲーション体験をユーザーに提供できます。 管理できます。

バックグラウンド タスクとフォアグラウンド タスク

図 2. 2 つのタスク: タスク B がユーザー操作を受け取る 待機中になり、タスク A はバックグラウンドで 履歴書です。

タスクとは、ユーザーがアクティビティを開始したときにバックグラウンドに移動できる 1 つのまとまりのあるユニットです。 新しいタスクを追加したり、ホーム画面に移動します。バックグラウンドでは 停止しても、そのタスクのバックスタックはそのまま残ります。つまり、 別のタスクが行われている間にフォーカスを喪失します(図 2 を参照)。 フォアグラウンドに戻ると、ユーザーは中断したところから作業を再開できます オフにします。

現在のタスク A について、次のタスクフローを考えてみましょう。 スタック内に 3 つのアクティビティがあり、現在のアクティビティの下に 2 つのアクティビティがある。

  1. ユーザーがホームボタンまたはジェスチャーを使用して、 アプリ ランチャー

    ホーム画面が表示されたら、タスク A がバックグラウンドに移動します。新しい アプリが起動すると、システムはそのアプリのタスク(タスク B)を独自のスタックで開始します。 できます。

  2. ユーザーは、そのアプリを操作した後、再びホームに戻り、 タスク A を起動した新しいアプリです。

    これで、タスク A がフォアグラウンドになり、スタック内の 3 つのアクティビティがすべて スタックの一番上のアクティビティが再開されます。この時点で タスク B に戻るには、ホームに移動してアプリアイコンを選択します。 そのタスクを開始したユーザー、または [履歴] リストからアプリのタスクを選択して、 画面をご覧ください。

で確認できます。

複数のアクティビティ インスタンス

図 3. 1 つのアクティビティを複数のインスタンスで 。

アプリがデプロイされても、バックスタック内のアクティビティは を使用すると、ユーザーは複数のアクティビティから特定のアクティビティを開始できます。 作成されてスタックに push されるのではなく、 アクティビティの前のインスタンスが一番上になります。そのため 異なる複数の異なるリソース間でも、アプリ内のアクティビティが 一連のタスクを実行できます。

ユーザーが [戻る] を使用して戻ると、 アクティビティのインスタンスが表示される順序は、 それぞれの UI 状態を持ちます。ただし、この 動作をインスタンス化することもできます。学習 詳しくは、リソースの管理と できます

マルチウィンドウ環境

アプリがマルチウィンドウで同時に実行されている場合 環境をサポートし、Android 7.0(API レベル 24)以降では、ウィンドウごとにタスクが個別に管理されます。各 複数のタスクを実行できます同じことが Chromebook: システムは、1 台の仮想環境でタスクやタスクのグループを管理します。 指定することもできます

ライフサイクルのまとめ

以下は、アクティビティとタスクのデフォルトの動作をまとめたものです。

  • アクティビティ A がアクティビティ B を起動すると、アクティビティ A は停止しますが、システムは は、スクロール位置やフォームに入力したテキストなどの状態を保持します。条件 アクティビティ B、アクティビティ A でユーザーが「戻る」ジェスチャーをタップまたは使用した 状態が復元された状態で再開されます

  • ユーザーがホームボタンまたはジェスチャーを使用してタスクを終了すると、現在の タスクはバックグラウンドに移行します。システムは タスク内のアクティビティの状態を把握できます。ユーザーが後でタスクを再開した場合、 タスクを開始したランチャー アイコンを選択すると、 スタックの一番上でアクティビティを再開します。

  • ユーザーが [戻る] をタップまたはジェスチャーを行うと、現在のアクティビティが 破棄されます。スタック内の前のアクティビティが再開されます。日時 アクティビティが破棄されると、システムはアクティビティの状態を保持しません

    ルート ランチャー アクティビティでは動作が異なる Android 12 以降を搭載したデバイスでアプリが実行されているとき。

  • アクティビティは、別のタスクからでも複数回インスタンス化できます。

で確認できます。

用事を管理する

Android はタスクとバックスタックを、 すべてのアクティビティが同じタスクで 連続して開始され アウトスタックですほとんどのアプリで問題なく動作し、通常は アクティビティがタスクとどのように関連付けられているか、またはアクティビティが背後にどのように存在するか 説明します。

ただし、通常の動作を中断することもできます。 たとえば、アプリのアクティビティが新しいタスクを開始したときに 開始しました。 現在のタスク内に配置されます。または 既存のインスタンスを 転送する代わりに、 バックスタックの上に新しいインスタンスを作成します。あるいは ルート アクティビティ以外のすべてのアクティビティからバックスタックをクリアしたい ユーザーがタスクから退出したとき。

属性を使用して、これらの操作などを行うことができます。 <activity> マニフェスト要素 渡されるインテントのフラグとフラグを startActivity()

タスクの管理に使用できるプリンシパル <activity> 属性は次のとおりです。

使用できる主要インテント フラグは次のとおりです。

以降のセクションでは、これらのマニフェスト属性の使用方法について説明します。 およびインテントフラグを使用して、アクティビティとタスクの関連付けとその方法を定義します。 バックスタック内で動作します。

また、Google Cloud でタスクとアクティビティを実行する際の 履歴画面で表示、管理できます。通常は タスクとアクティビティが、スペースでどのように表されるかを 履歴画面には影響しません。この動作は変更する必要はありません。詳細 履歴画面をご覧ください。

起動モードを定義する

起動モードを使用すると、アクティビティの新しいインスタンスを関連付ける方法を定義できます 現在のタスクに置き換わります。起動モードは次の 2 つの方法で定義できます。 以降のセクションで説明します

そのため、アクティビティ A がアクティビティ B を起動した場合、アクティビティ B はそのマニフェストで定義できる 関連付けられており、アクティビティ A はインテントフラグを使用して、 アクティビティ B を現在のタスクに関連付ける方法をリクエストします。

両方が アクティビティでは、アクティビティ B がタスクにどのように関連付けられるかが定義され、アクティビティ A の アクティビティ B のリクエストよりも優先されるため、インテントで定義されているとおりに 定義します。

マニフェスト ファイルを使用して起動モードを定義する

マニフェスト ファイルでアクティビティを宣言する場合、 タスクに関連付けられたアクティビティに <activity> 要素 launchMode 属性。

launchMode 属性に割り当てることができる起動モードは 5 つあります。

  1. "standard"
    デフォルトのモード。システムがタスク内のアクティビティの新しいインスタンスを作成する インテントがルーティングされます。アクティビティは次のいずれかです。 各インスタンスは異なるタスクに属することができ、 1 つのタスクに複数のインスタンスを含めることができます。
  2. "singleTop"
    アクティビティのインスタンスがすでに現在のタスクの一番上にある場合、 そのインスタンスへのインテントを、 onNewIntent() メソッドを使用することをおすすめします。アクティビティは、 各インスタンスは異なるタスクに属することができ、 1 つのタスクに複数のインスタンスを含めることもできます(ただし、最上位のアクティビティが アクティビティの既存のインスタンスではありません)。

    たとえば、タスクのバックスタックが、ルート アクティビティ A と アクティビティ B、C、D が一番上にある(スタックは A-B-C-D で、D が一番上)。インテント タイプ D のアクティビティに到着した時間です。D にデフォルトの "standard" 起動がある場合 クラスの新しいインスタンスが起動され、スタックが A-B-C-D-D になります。 ただし、D の起動モードが "singleTop" の場合、D の既存のインスタンスは onNewIntent() を通じてインテントを受信し、 スタックの一番上にあり A-B-C-D のままですもし 一方 インテントがタイプ B のアクティビティに到達すると、アクティビティ B の新しいインスタンスが 起動モードが "singleTop" であってもスタックに保持されるようになります。

  3. "singleTask"
    システムは新しいタスクのルートにアクティビティを作成するか、 同じアフィニティを持つ既存のタスクのアクティビティがPod の アクティビティがすでに存在している場合、システムは インテントを既存のインスタンスに呼び出すことにより、既存のインスタンスに onNewIntent() メソッドを使用します。一方、 その上にあるアクティビティは破棄されます。
    で確認できます。
  4. "singleInstance"
    システムが他のコンテナを起動しないこと以外は、"singleTask" の場合と同じです。 インスタンスを保持しているタスクに引き継がれます。アクティビティは常に そのタスクの唯一のメンバーです。このアクティビティによって開始されたアクティビティは、 別のタスクに移ります。
  5. "singleInstancePerTask"
    アクティビティは、タスクのルート アクティビティとしてのみ実行できます。つまり、 タスクを作成するアクティビティによって実行されるため、インスタンスは 1 つしか おすすめします。singleTask 起動モードとは対照的に、 異なるタスクの複数のインスタンスで、アクティビティは FLAG_ACTIVITY_MULTIPLE_TASK または FLAG_ACTIVITY_NEW_DOCUMENT フラグが設定されています。
で確認できます。

別の例として、Android ブラウザアプリは、ウェブブラウザが singleTask を指定することで、アクティビティは常に独自のタスクで開きます。 起動モード(<activity>) 要素です。つまり、アプリが Android デバイスを開くためのインテントを発行した場合、 アクティビティはアプリと同じタスクに配置されません。代わりに ブラウザに対して新しいタスクが開始されるか、ブラウザにすでにタスクがある場合 そのタスクが新しいタスクを処理するために 使用します。

アクティビティが新しいタスクで開始されるか、アクティビティと同じタスクで開始されるかは 戻るボタンと操作により常に 前のアクティビティに戻ります。ただし、サービス アカウントを 指定 singleTask 起動モードであり、そのアクティビティのインスタンスが タスク全体がフォアグラウンドに移ります。この時点で バックスタックには、その時点で転送されたタスクのすべてのアクティビティが スタックの最上位に位置付けられます。図 4 は、このタイプのシナリオを示しています。

図 4. 起動を伴うアクティビティ モード "singleTask" がバックスタックに追加されます。アクティビティが すでに独自のバックスタックを持つバックグラウンド タスクの一部である場合、 バックスタック全体がフォワード モードで表示され、

マニフェスト ファイルでの起動モードの使用について詳しくは、 <activity> 要素のドキュメント。

インテント フラグを使用して起動モードを定義する

アクティビティの開始時に、アクティビティのデフォルトの関連付けを変更できます タスクにフラグを設定して、タスクに startActivity()。 デフォルトの動作を変更するために使用できるフラグは次のとおりです。

FLAG_ACTIVITY_NEW_TASK

システムは新しいタスクでアクティビティを開始します。ゾーンのタスクがすでに実行中の場合は、 アクティビティを起動すると、そのタスクは 状態が復元され、アクティビティは新しいインテントを onNewIntent()

これにより、"singleTask" と同じ動作になります。 launchMode の値の説明 説明しました。

FLAG_ACTIVITY_SINGLE_TOP

開始中のアクティビティが現在のアクティビティである場合は、背面の上部 既存のインスタンスは呼び出しを受け取り、 アクティビティの新しいインスタンスを作成する代わりに、onNewIntent()

これにより、"singleTop" と同じ動作になります。 前のセクションで説明した launchMode 値。

FLAG_ACTIVITY_CLEAR_TOP

開始しようとしているアクティビティがすでに現在のタスクで実行されている場合は、 その場合、そのアクティビティの新しいインスタンスを起動する代わりに、 その上にある他のアクティビティはすべて破棄されます。目的は、 再開されたインスタンスに配信されます。これは、 onNewIntent()

launchMode 属性に、この動作を引き起こす値はありません。

FLAG_ACTIVITY_CLEAR_TOP は、ほとんどの場合、次のリソースと組み合わせて使用されます。 FLAG_ACTIVITY_NEW_TASK。これらのフラグを一緒に使用すると、 別のタスクの既存のアクティビティを見つけて配置する インテントに応答できる場所に配置されます。

アフィニティを処理する

アフィニティは、アクティビティが「優先する」タスクを示します。属します方法 デフォルトでは、同じアプリのすべてのアクティビティは互いにアフィニティを持ちます。 ユーザーが「好む」できます。

ただし、アクティビティのデフォルト アフィニティは変更できます。アクティビティの定義 アフィニティを共有し、同じアプリで定義されるアクティビティが異なるアプリに存在する 異なるタスクのアフィニティを割り当てることができます。

アクティビティのアフィニティを変更するには、taskAffinity を使用します。 <activity> の属性 要素です。

taskAffinity 属性は、次とは異なる文字列値を取ります。 デフォルトのパッケージ名 <manifest> で宣言 要素はこの名前を使用して、デフォルトのタスクが識別されるため、 向上させることができます

アフィニティは、以下の 2 つの状況で役立ちます。

  1. アクティビティを起動するインテントに FLAG_ACTIVITY_NEW_TASK 設定されます。

    新しいアクティビティは、デフォルトでは、アクティビティを実行するアクティビティのタスクで起動されます。 呼び出された startActivity()。 呼び出し元と同じバックスタックに push されます。

    ただし、startActivity() に渡されるインテントに FLAG_ACTIVITY_NEW_TASK 新しいアクティビティを格納するための別のタスクが検索されます。多くの場合 これは新しいタスクです。ただし、必ずしもそうである必要はありません。もし 新しいアクティビティと同じアフィニティを持つ既存のタスクに そのタスク内で起動されます。存在しない場合は、新しいタスクを開始します。

    このフラグによってアクティビティが新しいタスクを開始し、ユーザーが ホームボタンやジェスチャーで画面から離れるには、ユーザーがなんらかの方法で タスクに戻ります。通知マネージャーなどの一部のエンティティは アクティビティは常に外部のタスクから開始し、それ自身のタスクの一部としては開始しない。 渡すインテントに必ず FLAG_ACTIVITY_NEW_TASK が含まれる startActivity()

    外部エンティティが このフラグを使用してアクティビティを呼び出せます。 独立した手法で たとえば、起動したタスクに [ランチャー] アイコンが表示され、アプリのルート アクティビティが タスクには CATEGORY_LAUNCHER 使用します。詳細については、タスクの開始に関するセクションをご覧ください。

  2. アクティビティが allowTaskReparenting を持つ場合 属性を "true" に設定します。

    この場合、アクティビティは、開始したタスクから実行中のタスクに移動できます。 タスクがフォアグラウンドになったときのアフィニティを指定します。

    たとえば、気象状況を報告するアクティビティについて考えてみましょう。 選択された都市が旅行アプリの一部として定義されている場合。アフィニティが同じである デフォルトのアプリ アフィニティは他のアクティビティと同じで、 この属性を使用して親を再設定できます。

    いずれかのアクティビティで 気象レポーター アクティビティは、最初は できます。ただし、旅行アプリのタスクがフォアグラウンドになると、 天気予報機能がタスクに割り当て直され、タスク内に表示されます。

で確認できます。

バックスタックを消去する

ユーザーがタスクを長時間離れると、システムはそのタスクをすべてクリアし、 ルート アクティビティを除きます。ユーザーがタスクに戻ると ルート アクティビティのみが復元されます。システムは 想定外に ユーザーが作業を中断した時間が長く続く タスクに戻って新しいタスクに取り掛かるユーザーです。

この動作を変更するために使用できるアクティビティ属性がいくつかあります。

alwaysRetainTaskState
タスクのルート アクティビティでこの属性を "true" に設定すると、 実行されません。タスクでは、指定したすべての アクティビティを検出できます。
clearTaskOnLaunch

タスクのルート アクティビティでこの属性を "true" に設定すると、タスクは ユーザーがタスクを離れるたびにルート アクティビティまでクリアされ、 戻ります。つまり、 alwaysRetainTaskState。「 タスクを終了しても、ユーザーは常に初期状態でタスクに戻る 待機します。

finishOnTaskLaunch

この属性は clearTaskOnLaunch のようなものです。 タスク全体ではなく単一のアクティビティ上で動作します。また、 終了させる必要があることを意味します。次の値に設定されている場合: "true" の場合、アクティビティは現在のセッションでのみタスクの一部にとどまります。 ユーザーがタスクから離れて再び戻ると、タスクは表示されなくなります。

タスクを開始する

アクティビティにインテントを指定することで、タスクのエントリ ポイントとしてセットアップできます。 指定したアクションとして "android.intent.action.MAIN" でフィルタする 指定されたカテゴリとして "android.intent.category.LAUNCHER":

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

この種のインテント フィルタにより、アクティビティのアイコンとラベルが ユーザーがアクティビティを起動したり、アプリを操作したりできるように、 起動後にいつでもタスクに戻ることができます。

この 2 つ目の能力は重要です。ユーザーがタスクから退出できるようにして、 このアクティビティ ランチャーを使用して、後でまた確認することができます。このため、kubectl の 2 つの アクティビティを常にタスクの開始としてマークする起動モード、"singleTask" および "singleInstance" は、アクティビティに ACTION_MAINCATEGORY_LAUNCHER フィルタで絞り込んでから、

たとえば、フィルタがない場合に インテントが "singleTask" アクティビティを起動して新しいタスクを開始すると、ユーザーが 時間のかかる作業ですその後、ホームボタンを使用するか、 行います。すると、タスクはバックグラウンドに移動し、非表示になります。これでユーザーは タスクはアプリに表示されないため、タスクに戻ることはできません 起動します。

ユーザーが元の状態に戻せないようにする場合は、 アクティビティの場合は、<activity> を 要素の finishOnTaskLaunch "true" まで。詳しくは、バックスタックのクリアに関するセクションをご覧ください。

タスクとアクティビティの表示方法と管理方法に関する詳細情報 [履歴] 画面にある [履歴] 画面をご覧ください。

その他のリソース