1. ホーム
  2. アンドロイド

Intent.FLAG_ACTIVITY_NEW_TASK 解析中

2022-03-18 06:17:37

まず最初に、区別された以下の2つのLaunchMode発射モード機能を強調することが重要である。

  • アクティビティがシングルタスクに設定されている場合



    (1) 新しいタスクスタックを作らない(TaskIdは全て同じ)。



    (2) すでにスタックに存在する場合、再度このActivityのトリガーとして要求されると、そのインスタンスのonNewIntentメソッドが呼ばれ、新しいインスタンスは再作成されません。



    (3) このクラスがあるタスクスタックの上に他のアクティビティがある場合、その上のアクティビティはすべてスタックから外れる。

  • アクティビティがシングルインスタンスとして設定されている場合



    (1) このアクティビティがインスタンスを持っていない場合、新しいタスクスタックを作成します。(2つのTaskIdは同じではありません)



    (2) 既にタスクスタックにこのActivityのインスタンスがある場合、onNewIntentメソッドを呼び出し、新しいタスクスタックとインスタンスを作成しない。



    (3)タスクスタックとして独り立ちし、自分だけを持つ。そして、まず現在のタスクをリタイアさせ、次に他のタスクをリタイアさせることで、常にスタックからインスタンスを離すこと

FLAG_ACTIVITY_NEW_TASKの比較標準解説は以下の通りです。

まず、開始されるアクティビティと同じ親和性(すなわちtaskAffinity、同じアプリケーションのアクティビティは同じ親和性を持つことに注意)のタスクスタックがあるかどうかを調べます。もしあれば、スタック全体を直接前景に移動し、スタックの古いアクティビティの順序は変更せずに、開始するアクティビティを行います。 もしなければ、新しいスタックが作成されて、開始したアクティビティを保持します。デフォルトでは、同じアプリケーションのすべてのアクティビティは、同じ関係(taskAffinity)を持つことに注意してください。

個人的な理解ですが

デフォルトでは、同じアプリケーション内のすべてのActivityは同じ関係(taskAffinity)、つまりFLAG_ACTIVITY_NEW_TASKで開かれた新しいActivityも同じタスクスタック(アプリケーションと同じタスクスタック)に入りますが、もし、新しいActivityを別のスタックに入らせたい場合は以下の設定も必要です。

<activity
  android:name=".ui.activity.OtherTaskActivityXXX"
  android:taskAffinity="android.task.browser"/> //note the taskAffinity here


そして、このOtherTaskActivityXXXページで他のページが開かれていれば、他のすべてのページがこの新しいタスクスタックに押されます。

タスクスタックIdを表示します。

int TaskId = mActivity.getTaskId();