それらの起動モードが標準であると仮定します (インテント フラグを使用しません)。x はアプリ A のメイン アクティビティです。1 はアプリ B のメイン アクティビティです。
1) アプリ A を起動し、次に x-> y -> 1、ホーム ボタンを押し、アプリ A を再度起動すると、アクティビティ y または 1 が表示されますか?
アクティビティが表示されます1
。そのタスクのアクティビティ スタックの一番上にx->y->1
with アクティビティを含む 1 つのタスクがあります。1
HOMEを押すと、このタスクはバックグラウンドに移動します。アプリを再度起動すると、Android はタスク スタックを検出し、それを (そのまま) フォアグラウンドに戻し、スタックの一番上のアクティビティ (この場合は1
) を表示します。
2) アプリ A を起動し、次に x -> 1 -> y -> 2 -> z -> 3 を押し、ホーム ボタンを押してアプリ A を起動します。すべてのアクティビティが含まれます (x -> 1 -> y -> 2 -> z -> 3)、または x -> y -> z のみが含まれていますか?
上記のように、タスクは 1 つです。HOME を押すと、タスクが含まれてx->1->y->2->z->3
おり、バックグラウンドに移動します。アプリ A を再度起動すると、タスクが前倒し (そのまま) になり3
、一番上にアクティビティが表示されます。
ここでアプリ B を起動するとどうなるでしょうか。アプリ B にはどのようなアクティビティが含まれますか?
まあ、そのような質問は正しくありません。本当に知りたいのは「このタスクにはどのようなアクティビティが含まれているのか?」ということですが、答えは次のとおりです。
HOME画面からアプリBを起動すると、新しいタスクが開始されます。このタスクには、単一のアクティビティ、つまり が含まれます1
。このタスクは、他のタスク (まだバックグラウンドにあります) とは何の関係もありません。バックグラウンド タスクに 2 つの異なるアプリケーションからのアクティビティが含まれているという事実は関係ありません。
ここで、アクティビティ 1、2、3 が SingleTask であるとしましょう。x、y、z はまだ標準:
3) アプリ A を起動し、次に x -> y -> 1 -> 2、ホーム ボタンを押し、アプリ A を起動します。x -> y のみが含まれますか、それとも x -> y -> 1 -> 2 が含まれますか?
y
activity が activityを起動する時点で1
、これにより新しいタスクが作成されます。したがって、アクティビティx->y
を含む 1 つのタスクと を含む 2 つ目のタスクがあり1
ます。アクティビティがアクティビティを開始するとき1
、2
何が起こるかはlaunchMode
、アクティビティの数だけではありません。アクティビティ2
が宣言されていても、アクティビティがアクティビティと同じであるlaunchMode="singleTask"
場合(デフォルトでは、同じアプリケーションに属している場合)、アクティビティはアクティビティと同じタスクで作成されます(つまり、あたかも活動が持っているかのように振る舞う)。ただし、活動と活動が異なる場合、活動taskAffinity
2
taskAffinity
1
2
1
2
launchMode="standard"
1
2
taskAffinity
2
新しいタスクのルート アクティビティとして起動されます。これで、次のような 3 つのタスクが作成されます: Task1 を含むx->y
、Task2 を含む1
、Task3 を含む2
。
ここでアプリ B を起動するとどうなるでしょうか。アプリ B には 1 つだけが含まれますか、それとも 1 -> 2 になりますか?
上記のように、これは に依存しtaskAffinity
ます。taskAffinity
アクティビティの1
とが同じ場合2
、HOME 画面からアプリ B を起動すると、含ま1->2
れているタスクがフォアグラウンドに表示されます。taskAffinity
アクティビティの内容が異なる場合、HOME 画面からアプリ B を起動すると、アクティビティ1
を含むタスクが最前面に表示されます。
4) アプリ B を起動し、1 → 2 → 3 → 1 の場合、2 と 3 は破壊されますか?
いいえ2
、3
破壊されません。と仮定すると、1
すべてが(再び)設定に依存します。すべてのアクティビティの が同じであると仮定すると、トランプが.2
3
launchMode="singleTask"
taskAffinity
taskAffinity
1->2->3->1
1
taskAffinity
launchMode
すべてのアクティビティの が異なる場合、それぞれが 1 つのアクティビティを含む 3 つの個別のタスクが作成さtaskAffinity
れます。1->2->3
次に、 activity3
が activity を開始する1
と、 activity を含むタスクが1
フォアグラウンドに移動するだけで、 activity の新しいインスタンスは作成されません1
。
5) アプリ B を起動し、次に 1 -> 2 -> 3、ホーム ボタンを押し、アプリ A を起動し、次に x -> y -> 2 を押して、[戻る] ボタンを押して 2 をドロップします。1 -> 3 のみか、1 -> 2 -> 3 か?
繰り返しますが、これは に依存しtaskAffinity
ます。アプリ B のすべてのアクティビティが同じであるtaskAffinity
場合、1->2->3
タスクは 1 つになります。ユーザーが HOME ボタンを押すと、このタスクはバックグラウンドに移行します。ここで、ユーザーがアプリ A を起動して新しいタスクを作成します。2 番目のタスクの後x->y
、これら 2 つのアクティビティが含まれます。アクティビティがアクティビティをy
開始します2
。このアクティビティはタスク内の他のアクティビティlaunchMode="singleTask"
とは異なりtaskAffinity
ます (それらはすべてアプリ A のものです) ため、Android はアクティビティをルートとしてtaskAffinity
新しいタスクを作成します。そのタスクにはルートとしてアクティビティが含まれていないため2
、Android は既存のタスクを使用できません。ユーザーが で BACK を押すと、これでアクティビティが終了します1->2->3
2
2
2
x->y
これにより、3 番目のタスクが終了し、ユーザーはアクティビティを含む 2 番目のタスクに戻りますy
。ここで、HOME を押してアプリ B を起動すると、既存の最初のタスクが1->2->3
フォアグラウンドに表示されます。
ただし、アプリ B のすべてのアクティビティの が異なる場合taskAffinity
、1->2->3
それぞれが 1 つのアクティビティを含む 3 つの個別のタスクが作成されます。ユーザーが HOME を押してアプリ A を起動し、新しいタスクを作成します (現在、4 つのタスクがあります)。x->y
4 番目のタスクの後、これら 2 つのアクティビティが含まれます。アクティビティがアクティビティをy
開始します2
。Android は、アクティビティを含むタスクを2
フォアグラウンドに移動するだけです。ユーザーが [戻る] ボタンを押すと、アクティビティとそれが含まれていたタスクが終了し (タスクが空になったため)、ユーザーはアプリ A から2
のタスクを含む前のタスクに戻ります。ホーム画面からアプリ B を起動すると、フォアグラウンドへのx->y
アクティビティを含むタスク。1
タスクが 3 つになりました: タスク 1 にはアクティビティが含まれています1
Task2 にはアクティビティが含ま3
れており、バックグラウンドにあります。Task3 にはアクティビティが含まれておりx->y
、バックグラウンドにあります。
ノート
これは複雑だと思います。私の答えは私の頭からのものです。これらすべての組み合わせを実際に実装してチェックしようとしたわけではありません(ただし、過去にこれらのケースの多くを実装しており、実際にどのように機能するかを知っています)。その理由は、あなたが説明したことのほとんどは現実の世界では行われないため、例は理論的なものであり、実用的ではありません. 実際には、独自のホーム画面の代替を作成する場合や、他のアプリケーションによって開始されたときsingleTask
のアプリケーションの動作を慎重に制御する必要がある場合を除き、またはsingleInstance
起動モードを使用する必要はほとんどありません。ほとんどの場合、またはの起動モードを持つアクティビティが複数存在することはありません。singleTask
singleInstance
を使用する場合、singleInstance
またはsingleTask
どのようにtaskAffinity
機能するかを認識する必要がある場合、また、「singleTask」または「singleInstance」として宣言されているアクティビティごとに、異なるアプリ アイコン (およびおそらくアプリ ラベルも) があることを確認する必要があります。そうでない場合、最近のタスクのリストに表示される方法が原因で、ユーザーは正しいタスクに戻ることができません。