diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index b77381c6bae20..4439a24a4b077 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -785,17 +785,8 @@ final class ActivityStack { + taskIntent.getComponent().flattenToShortString() + "/aff=" + r.task.rootAffinity + " to new cls=" + intent.getComponent().flattenToShortString() + "/aff=" + info.taskAffinity); - if (!isDocument && !taskIsDocument - && result.r == null && task.canMatchRootAffinity()) { - if (task.rootAffinity.equals(target.taskAffinity)) { - if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!"); - // It is possible for multiple tasks to have the same root affinity especially - // if they are in separate stacks. We save off this candidate, but keep looking - // to see if there is a better candidate. - result.r = r; - result.matchedByRootAffinity = true; - } - } else if (taskIntent != null && taskIntent.getComponent() != null && + // TODO Refactor to remove duplications. Check if logic can be simplified. + if (taskIntent != null && taskIntent.getComponent() != null && taskIntent.getComponent().compareTo(cls) == 0 && Objects.equals(documentData, taskDocumentData)) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching class!"); @@ -815,6 +806,16 @@ final class ActivityStack { result.r = r; result.matchedByRootAffinity = false; break; + } else if (!isDocument && !taskIsDocument + && result.r == null && task.canMatchRootAffinity()) { + if (task.rootAffinity.equals(target.taskAffinity)) { + if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Found matching affinity candidate!"); + // It is possible for multiple tasks to have the same root affinity especially + // if they are in separate stacks. We save off this candidate, but keep looking + // to see if there is a better candidate. + result.r = r; + result.matchedByRootAffinity = true; + } } else if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Not a match: " + task); } } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index ba346883f4622..61b131761b158 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1557,7 +1557,7 @@ class ActivityStarter { } intentActivity.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); - } else if (!intentActivity.task.isSameIntentResolution(mStartActivity)) { + } else if (!intentActivity.task.isSameIntentFilter(mStartActivity)) { // In this case we are launching the root activity of the task, but with a // different intent. We should start a new instance on top. mAddingToTask = true; diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index d7feece83becb..c956b4b9b835e 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -492,10 +492,10 @@ final class TaskRecord { } /** - * Return true if the input activity has the same intent resolution as the intent this task + * Return true if the input activity has the same intent filter as the intent this task * record is based on (normally the root activity intent). */ - boolean isSameIntentResolution(ActivityRecord r) { + boolean isSameIntentFilter(ActivityRecord r) { final Intent intent = new Intent(r.intent); // Correct the activity intent for aliasing. The task record intent will always be based on // the real activity that will be launched not the alias, so we need to use an intent with