8

Google Android Developer ページを読みましたが、タスクの概念 ( http://developer.android.com/guide/components/tasks-and-back-stack.html ) は本当に混乱します。

SingleTask と SingleInstance まで読んだ後、私はさらに混乱しています。

例を使って質問したいのですが、これらの質問からよりよく理解できることを願っています:

2 つのアプリケーション A と B があり、A には x、y、z アクティビティがあるとします。B には 1、2、3 のアクティビティがあります。

それらの起動モードが標準であると仮定します (インテント フラグを使用しません)。x はアプリ A のメイン アクティビティです。1 はアプリ B のメイン アクティビティです。

1) アプリ A を起動し、次に x-> y -> 1、ホーム ボタンを押し、アプリ A を再度起動すると、アクティビティ y または 1 が表示されますか?

2) アプリ A を起動し、次に x -> 1 -> y -> 2 -> z -> 3 を押し、ホーム ボタンを押してアプリ A を起動します。すべてのアクティビティが含まれます (x -> 1 -> y -> 2 -> z -> 3)、または x -> y -> z のみが含まれていますか? ここでアプリ B を起動するとどうなるでしょうか。アプリ B にはどのようなアクティビティが含まれますか?

ここで、アクティビティ 1、2、3 が SingleTask であるとしましょう。x、y、z はまだ標準:

3) アプリ A を起動し、次に x -> y -> 1 -> 2、ホーム ボタンを押し、アプリ A を起動します。x -> y のみが含まれますか、それとも x -> y -> 1 -> 2 が含まれますか? ここでアプリ B を起動するとどうなるでしょうか。アプリ B には 1 つだけが含まれますか、それとも 1 -> 2 になりますか?

4) アプリ B を起動し、1 → 2 → 3 → 1 の場合、2 と 3 は破壊されますか?

5) アプリ B を起動し、次に 1 -> 2 -> 3、ホーム ボタンを押してアプリ A を起動し、次に x -> y -> 2 を押して [戻る] ボタンを押して 2 をドロップします。1 -> 3 のみか、1 -> 2 -> 3 か?

誰でも返信して助けてくれてありがとう!

4

1 に答える 1

16

それらの起動モードが標準であると仮定します (インテント フラグを使用しません)。x はアプリ A のメイン アクティビティです。1 はアプリ B のメイン アクティビティです。

1) アプリ A を起動し、次に x-> y -> 1、ホーム ボタンを押し、アプリ A を再度起動すると、アクティビティ y または 1 が表示されますか?

アクティビティが表示されます1。そのタスクのアクティビティ スタックの一番上にx->y->1with アクティビティを含む 1 つのタスクがあります。1HOMEを押すと、このタスクはバックグラウンドに移動します。アプリを再度起動すると、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 が含まれますか?

yactivity が activityを起動する時点で1、これにより新しいタスクが作成されます。したがって、アクティビティx->yを含む 1 つのタスクと を含む 2 つ目のタスクがあり1ます。アクティビティがアクティビティを開始するとき12何が起こるかはlaunchMode、アクティビティの数だけではありません。アクティビティ2が宣言されていても、アクティビティがアクティビティと同じであるlaunchMode="singleTask"場合(デフォルトでは、同じアプリケーションに属している場合)、アクティビティはアクティビティと同じタスクで作成されます(つまり、あたかも活動が持っているかのように振る舞う)。ただし、活動と活動が異なる場合、活動taskAffinity2taskAffinity1212launchMode="standard"12taskAffinity2新しいタスクのルート アクティビティとして起動されます。これで、次のような 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 は破壊されますか?

いいえ23破壊されません。と仮定すると、1すべてが(再び)設定に依存します。すべてのアクティビティの が同じであると仮定すると、トランプが.23launchMode="singleTask"taskAffinitytaskAffinity1->2->3->11taskAffinitylaunchMode

すべてのアクティビティの が異なる場合、それぞれが 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->3222x->yこれにより、3 番目のタスクが終了し、ユーザーはアクティビティを含む 2 番目のタスクに戻りますy。ここで、HOME を押してアプリ B を起動すると、既存の最初のタスクが1->2->3フォアグラウンドに表示されます。

ただし、アプリ B のすべてのアクティビティの が異なる場合taskAffinity1->2->3それぞれが 1 つのアクティビティを含む 3 つの個別のタスクが作成されます。ユーザーが HOME を押してアプリ A を起動し、新しいタスクを作成します (現在、4 つのタスクがあります)。x->y4 番目のタスクの後、これら 2 つのアクティビティが含まれます。アクティビティがアクティビティをy開始します2。Android は、アクティビティを含むタスクを2フォアグラウンドに移動するだけです。ユーザーが [戻る] ボタンを押すと、アクティビティとそれが含まれていたタスクが終了し (タスクが空になったため)、ユーザーはアプリ A から2のタスクを含む前のタスクに戻ります。ホーム画面からアプリ B を起動すると、フォアグラウンドへのx->yアクティビティを含むタスク。1タスクが 3 つになりました: タスク 1 にはアクティビティが含まれています1Task2 にはアクティビティが含ま3れており、バックグラウンドにあります。Task3 にはアクティビティが含まれておりx->y、バックグラウンドにあります。

ノート

これは複雑だと思います。私の答えは私の頭からのものです。これらすべての組み合わせを実際に実装してチェックしようとしたわけではありません(ただし、過去にこれらのケースの多くを実装しており、実際にどのように機能するかを知っています)。その理由は、あなたが説明したことのほとんどは現実の世界では行われないため、例は理論的なものであり、実用的ではありません. 実際には、独自のホーム画面の代替を作成する場合や、他のアプリケーションによって開始されたときsingleTaskのアプリケーションの動作を慎重に制御する必要がある場合を除き、またはsingleInstance起動モードを使用する必要はほとんどありません。ほとんどの場合、またはの起動モードを持つアクティビティが複数存在することはありません。singleTasksingleInstance

を使用する場合、singleInstanceまたはsingleTaskどのようにtaskAffinity機能するかを認識する必要がある場合、また、「singleTask」または「singleInstance」として宣言されているアクティビティごとに、異なるアプリ アイコン (およびおそらくアプリ ラベルも) があることを確認する必要があります。そうでない場合、最近のタスクのリストに表示される方法が原因で、ユーザーは正しいタスクに戻ることができません。

于 2013-09-04T19:25:26.183 に答える