- 1.アクティビティ起動モードsingleTaskの理解
- 2.タスクとアクティビティのスタック
- 3.SingleTask設定方法
- 4. singleTask(関数)の意味
- 5.taskAffinity属性
1.アクティビティ起動モードsingleTaskの理解
2.タスクとアクティビティのスタック
タスクは、アクティビティスタックの形式で保存された、いくつかのアクティビティのコレクションです。したがって、タスクは概念的であり、アクティビティスタックは物理的です。
新しく開始されたタスクとは、このタスクにアクティビティを格納するための新しいアクティビティスタックが作成されたことを意味すると言えます。
3.SingleTask設定方法
- マニフェストファイル
は、アクティビティノードに属性を追加します。
<activity
android:name="com.example.test.SecondActivity"
android:launchMode="singleTask"
/>
- インテントセットFLAG
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
4. singleTask(関数)の意味
アクティビティの起動モードをsingleTaskに設定すると、フレームワークがアクティビティを開始すると、新しいタスクで開始できるとマークされます。新しいタスクで開始するかどうかについては、必ずしもそうとは限りません。条件が必要ですが、どのような条件ですか?以下の内訳をご覧ください〜
4.1。例
4.2。例1
次のジャンプ関係を想定します。
MainActivity-> SecondeActivity-> ThirdActivity
その中で、SecondActivityはsingleTaskの起動モードに設定され、MainActivityとThirdActivityは何もせず、デフォルト、つまり標準モードを維持します
次に、ThirdActivityにジャンプした後、現在のアクティビティスタックの状況は上から下に次のようになります。
ThirdActivity、SecondeActivity、MainActivity
つまり、標準モードと同じように、通常のスタック順序のままです。Googleの公式説明によるものではありません。新しいタスクが作成され、新しいスタックがSecondActivityの保存に使用されていると誤解されがちです。これは誤解です。
それで、それは本当に標準モードと同じですか?
まだ違いがありますが、そうでなければ、なぜこのモードを使用するのですか。
違いは次の例で示されています。
4.3。例2
次のジャンプ関係を想定します。
MainActivity-> SecondeActivity-> ThirdActivity-> ForthActivity-> SecondeActivity
その中で、SecondActivityはsingleTaskの起動モードに設定されており、残りのアクティビティは何の操作も行わず、デフォルトの標準モードを維持します。
次に、SecondActivityにジャンプした後、現在のアクティビティスタックの状況は上から下に次のようになります。
SecondeActivity、MainActivity
そうです、SecondActivityの上のThirdActivityとForthActivityは破棄されました。
つまり、スタック内の既存のSecondActivityが再利用され、スタック上のすべてのアクティビティがクリアされるため、最上位に公開されます。
ちなみに、最後のSecondActivityの開始では、onCreate、onStart、およびonResumeライフサイクルメソッドは呼び出されず、代わりにonNewIntentメソッドが呼び出されました。
4.4。まとめ
起動時にsingleTaskとしてマークされたアクティビティは、標準モードと同様に現在インスタンスがない場合、現在のアクティビティに直接プッシュされます。すでにインスタンスがある場合は、ターゲットActivityインスタンスのすべてのアクティビティがクリアされます。ターゲットアクティビティの削除は最上位に公開され、そのonNewIntentメソッドが呼び出されます
5.taskAffinity属性
上記の例は両方とも私たちの知識の範囲内であり、比較的よく知られています。しかし、このtaskAffinityはなじみのないものでなければなりません。
taskAffinityは、現在のアクティビティがどのタスクに関連付けられているかをマークすることです。
5.1。構成方法
- マニフェストファイルの
アクティビティノードでこの属性を設定します。taskAffinity値は、タスクを一意に識別するために使用される文字列です。
デフォルトでは、つまり構成されていない場合、taskAffinityはアプリケーションのパッケージ名を取ります。
<activity android:name="com.example.test.SecondActivity"
android:launchMode="singleTask"
android:taskAffinity="com.example.test.second">
</activity>
5.2。意味(機能)
singleTaskを使用すると、これら2つの属性でマークされたアクティビティを新しいタスクに割り当てることができます。
5.3。例
次のジャンプ関係を想定します。
MainActivity-> SecondeActivity-> ThirdActivity
その中で、SecondActivityはsingleTaskの起動モードに設定され、taskAffinityプロパティが構成され、MainActivityとThirdActivityは何も実行せず、デフォルト、つまり標準モードを維持します
次に、ThirdActivityにジャンプした後、現在のアクティビティスタックの状況は上から下に次のようになります。
Task1: ThirdActivity、MainActivity
タスク2:SecondeActivity
ご覧のとおり、SecondActivityは新しいスタックに作成されます。
したがって、前の質問に対する答えを得ることができます。singleTaskとして設定されたアクティビティは、どのような条件下で新しいタスクに作成されますか?
答えは、別のtaskAffinity属性値が同時に割り当てられた場合です。
5.4。ロールバックシーケンス
onResumeのアクティビティはThirdActivityですが、このときにReturnキーを押すとどうなりますか?アクティビティの表示順序はどうなりますか?
答えは、上記のTask1スタックとTask2スタックの順序と同じです。ThirdActivityがポップアップすると、MainActivityが表示されます。もう一度リターンキーを押すと、MainActivityがポップアップし、SecondActivityが表示されます。
新しく作成されたタスクが下部にあることがわかります。
5.5。まとめ
- 起動モードをsingleTaskに設定すると、フレームワークがアクティビティを開始すると、新しいタスクで開始可能としてマークされるだけです。新しいタスクで開始するかどうかについては、他の条件も適用されます。この条件はtaskAffinity属性です。構成パッケージ名以外の文字列です。構成がない場合、デフォルトは現在のパッケージ名であり、操作は現在のタスクで実行されます。
- singleTaskアクティビティインスタンスを開始するときに、そのようなインスタンスがシステムにすでに存在する場合、タスクスタックの最上位にスケジュールされ、現在のタスクでそのインスタンス上のすべてのアクティビティがクリアされます。
存在しない場合は、taskAffinity属性に対応するタスクが存在するかどうかによって異なります。存在する場合は、アクティビティをタスク内部スタックにプッシュします。存在しない場合は、新しいタスクを作成してから、アクティビティをタスク内部スタックにプッシュします。 - singeTaskモードでは、タスクにアクティビティインスタンスが1つだけ存在することが保証されます
参考記事:https://blog.csdn.net/zhangjg_blog/article/details/10923643