Android–taskAffinity属性
Android Taskaffinity Attribute
- すべてのアクティビティには taskAffinity 属性。この属性は、入力するタスクを示します。アクティビティがアクティビティのtaskAffinityを明示的に示さない場合、そのプロパティはアプリケーションによって指定されたtaskAffinityと等しくなります。アプリケーションが指定されていない場合、taskAffinityの値はパッケージ名と同じです。タスクには独自のアフィニティ属性もあり、ルートアクティビティのtaskAffinityの値と同じ値になります。
- taskAffinityは、アクティビティが変更される親タスクの2つを決定します(を参照)。 allowTaskReparenting
属性)および渡された FLAG_ACTIVITY_NEW_TASK フラグは、アクティビティの開始時にタスクを保持するために使用されます。
最初のケース:
アクティビティのallowTaskReparentingがtrueに設定されている場合、バックグラウンドに入ります。同じ親和性を持つタスクがフォアグラウンドに入ると、タスクは再ホストされ、フォアグラウンドのタスクに入ります。
確認:
2つのプロジェクトapplication1とapplication2を作成します
application1にはActivity1が含まれ、application2にはActivity2が含まれ、それらのtaskAffinityは同じであり、Activity1のallowTaskReparentingはtrueです。
application1を起動し、Activity1をロードし、ホームボタンを押してタスク(task1と想定)をバックグラウンドに入力します。次に、application2を起動します。デフォルトでアクティビティがロードされますが、アクティビティ1がロードされます。実際にはActivity2もロードされていますが、Activityが再ホストされているため、Activity1が表示されます。
2番目のケース:
アクティビティのインテントをロードし、フラグがFLAG_ACTIVITY_NEW_TASKに設定されている場合、最初に同じtaskAffinityを持つタスクがあるかどうかがチェックされます。存在する場合は、タスクで直接ホストされます。タスクが存在しない場合は、タスクを再作成します。
launchModeとtaskAffinityの組み合わせ:
taskAffinityと組み合わせたSingleTaskロードモード
アプリケーションがsingleTaskモードでアクティビティをロードすると、アクティビティは最初に同じtaskAffinityを持つタスクがあるかどうかを確認します。
- 存在する場合は、インスタンス化されているかどうかを確認します。インスタンス化されている場合は、アクティビティの上にあるアクティビティを破棄し、onNewIntentを呼び出します。インスタンス化されていない場合、アクティビティのインスタンス化はスタックにマージされます。
- 存在しない場合は、タスクを再作成してスタックにマージします。
taskAffinityと組み合わせたsingleInstanceロードモード
- アプリケーションがsingleInstanceモードのアクティビティをロードするときに、アクティビティがインスタンス化されていない場合、タスクが再作成され、スタックにマージされます。インスタンス化されている場合、アクティビティのonNewIntentが呼び出されます。
- singleInstanceのアクティビティのタスクは、他のアクティビティに存在することはできません。アクティビティからロードされた他のアクティビティ(Activity2と想定)は、他のタスクに配置されます。 Activity2と同じ親和性を持つタスクがある場合は、タスクにActivity2を作成します。 。存在しない場合は、新しいタスクをスタックに再生成します。