Андроид SingleTask активность не как рут?

Я читал документ, касающийся режимов запуска, и есть одна вещь, которую я не понимаю. В документе сказано, что действие singleTask всегда является корнем стека:

Напротив, действия "singleTask" и "singleInstance" могут только начать задачу. Они всегда находятся в корне стека активности. Более того, устройство может одновременно хранить только один экземпляр активности - только одну такую ​​задачу.

Но: если вы посмотрите на эту часть документа на рис. 4, вы увидите, что, когда упражнение 2 запускает задание Y (переводит задачу на передний план), задание Y уже было на вершине задачи и будет на вершине текущего задача, а не рут.

Я попробовал этот сценарий в этом приложении-симуляторе, и когда я создаю однозадачное действие, оно всегда создает новую задачу. Однако, если единственный экземпляр уже существует, он завершает все действия выше этого, так что единственным экземпляром может быть корень (а также единственное действие в задаче).

Как упражнение Y могло оказаться на вершине задачи над занятием X?

Есть ли другая причина, по которой я скучаю?

PS: я тоже не очень понимаю разницу между Task и back stack.

1 ответ

Решение

Как обычно (вздох), документация неверна. На диаграмме, на которую вы ссылались, очевидно, что активность Y не может быть определена как singleTask и все же быть главным заданием в фоновой задаче, содержащей 2 задания.

При тестировании сценариев со специальными режимами запуска singleTask а также singleInstance, Обратите внимание, что taskAffinity играет важную роль в этом поведении, так как taskAffinity имеет приоритет над специальными режимами запуска.


Что касается разницы между "заданием" и "задним стеком":

"Задача" - это набор действий, которыми можно управлять всей группой.

  • Когда вы запускаете приложение (при условии, что оно в данный момент не запущено), Android создает новую задачу, которая находится на переднем плане и содержит корневую активность запущенного вами приложения.
  • Когда это действие запускает новые действия, эти новые действия добавляются к текущей задаче (обычно, хотя существуют исключения из этого поведения).
  • Когда вы нажимаете кнопку HOME, текущее задание перемещается с переднего плана на задний план.
  • При отображении списка "последних" отображается список недавних задач, а не список недавних действий или список недавних приложений.
  • Когда вы выбираете задачу из списка недавних задач, если эта задача все еще активна (в ней все еще есть активные действия), вся задача (включая все ее действия) будет перенесена из фона на передний план.
  • Задачи также могут быть "сложены". Когда действие в текущей задаче запускает действие в новой задаче, новая задача накладывается поверх текущей задачи. Это служит только для контроля того, что происходит, когда новая задача завершается. В обычном случае, когда новая задача завершается (все ее действия завершены), Android вернет пользователя к предыдущей задаче (то есть: задаче, которая запустила завершающую задачу).

"Задний стек" обычно относится к набору действий внутри задачи. Каждое задание имеет свой стек действий. Это используется для контроля того, что происходит, когда текущая активность (та, что находится на вершине заднего стека) заканчивается. Обычно Android возвращает пользователя к действию, которое находится непосредственно под (ниже) завершающим действием в заднем стеке.

Код Android и документация часто ссылаются на "корень" задачи (это действие, которое использовалось для запуска задачи) и "верх" или "фронт" задачи (это действие, которое отображается в данный момент).).


Собственно, документация лежит:-(Вот пример:

Напротив, действия "singleTask" и "singleInstance" могут только начать задачу.

Это утверждение обычно, но не всегда правильно. Например, допустим, у меня есть 2 действия: A а также B, A является активностью запуска (то есть: с ACTION=MAIN а также CATEGORY=DEFAULT) и определяется стандартным режимом запуска. B определяется с launchMode="singleTask", Я запускаю приложение, а Android создает экземпляр A, В A Я тогда делаю:

startActivity(new Intent(this, B.class));

Это создаст новый экземпляр активности B и положить его поверх A в той же задаче. Это не создаст новую задачу с активностью B как корень. Причина в том, что активность A и деятельность B имеют те же taskAffinity (по умолчанию все действия приложения имеют одинаковый taskAffinity), а Android будет игнорировать режим запуска B в этом случае.

В документации также говорится:

Более того, устройство может одновременно хранить только один экземпляр активности - только одну такую ​​задачу.

Снова, taskAffinity может нарушить это поведение. Предположим снова у нас есть A, B а также C, все с одинаковым (по умолчанию) taskAffinity, A а также C иметь стандартный режим запуска, B имеет launchMode="singleTask", Если A начинается B, случай B заканчивается не в новой задаче, а в той же задаче, что и A (см. выше). Сейчас B начинается C, Android создает экземпляр C и кладет его поверх B в той же задаче. Сейчас C звонки:

startActivity(new Intent(this, B.class));

Android создает новый экземпляр B и ставит это поверх C в задании. Сейчас есть 2 экземпляра B и ни один из них не является основной активностью задачи! Такое поведение также связано с тем, что taskAffinity превосходит режим запуска.

Другие вопросы по тегам