Как тиражировать примеры в документации по задачам Android и Backstack? - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь понять задачи Android и стек Back, читая официальную документацию: https://developer.android.com/guide/components/activities/tasks-and-back-stack

У меня есть пара вопросов относительно документации.

Вопрос 1 : на рисунке 4 в документации есть 2 задачи - передняя и фоновая, фоновые задачи содержат действие Y и X, если объявлено действие Yв режиме запуска singleTask как можно создать задачу с действием Y поверх действия X?

Для других вопросов я подготовил простой проект - 2 действия, A и B. На обоих занятиях у меня есть 2 кнопки:

  • Кнопка A открывает действие A
  • Кнопка B открывает задание B

Упражнение A - это ОСНОВНОЕ (ЗАПУСК) действие.

Вопрос 2 : в документации сказано, что использование флага намерения FLAG_ACTIVITY_NEW_TASK приводит к тому же поведению, что и режим запуска singleTask:

Это приводит кповедение, аналогичное значению launchMode "singleTask", обсуждавшемуся в предыдущем разделе.

Это не то, что я вижу в своем тестовом приложении.Если у действия B установлен режим запуска на singleTask, и если мой backstack - A -> B -> A -> A, то, если я открою B, задний стек будет выглядеть как A -> B (он вытолкнет последний2 как).Я предполагаю, что причина этого в созданных задачах: когда была отправлена ​​цель запуска, она открыла действие A в новой задаче (давайте назовем ее задачей 1), когда я открыла B, она открыла ее в задаче 2 (потому что онаимеет режим запуска singleTask), затем действия 2 A также были открыты в Задаче 2.После повторного открытия B Android обнаружил задачу, которая уже имеет действие B (Задача 2), и вывел ее на передний план, выдав 2 As.

Однако использование FLAG_ACTIVITY_NEW_TASK вместо singleTask не приводит к такому же поведению, оно просто открывает B поверх всего остального.Документация неправильная или я что-то не так делаю?

Вопрос 3: Пример в конце говорит:

два режима запуска, которые помечают действия как всегда инициирующие задачу, «singleTask» и «singleInstance", следует использовать только в том случае, если у действия есть фильтр ACTION_MAIN и фильтр CATEGORY_LAUNCHER.Представьте, например, что может произойти, если отсутствует фильтр: намерение запускает действие «singleTask», инициируя новую задачу, и пользователь тратит некоторое время на выполнение этой задачи.Затем пользователь нажимает кнопку «Домой».Задача теперь отправляется в фоновый режим и не отображается.Теперь у пользователя нет возможности вернуться к задаче, потому что она не представлена ​​в панели запуска приложений.

Как воспроизвести это?В моем предыдущем примере я открываю упражнение B в новом задании, но если я снова нажму кнопку «Домой» и значок средства запуска, я вернусь к заданию B. Поэтому, хотя я использую режим запуска singleTask, яЯ все еще могу вернуться к этой задаче, используя значок запуска или выбрав его из списка последних приложений.

Вполне возможно, что я делаю что-то не так и что новые задачи не генерируются, есть ли способ просмотреть все задачи и действия для конкретного приложения?

Спасибо.

1 Ответ

0 голосов
/ 20 марта 2019

Сегодня я потратил больше времени, пытаясь понять, что здесь происходит, и я думаю, что у меня есть ответы.Я понял, что ничто в моем примере не создавало новые задачи.Задачи видны в Recent screens (приложения в фоновом режиме) - как минимум на Android 5+.

Итак, первый вопрос, на который следует ответить: Почему создание операции B не создает новую задачу?

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

При этом FLAG_ACTIVITY_NEW_TASK и singleTask очень сильно различаются, хотя иногда они ведут себя одинаково.Если вы инициируете намерение с флагом FLAG_ACTIVITY_NEW_TASK, который пытается открыть действие A без указания действия taskAffinity, вы просто добавите действие поверх текущей задачи. (Это все еще сбивает меня с толку, я ожидаю, что оно откроет действие, только если действие не находится в стеке; если оно есть, оно ничего не должно делать.)

Открытиета же активность без этого флага, но с использованием режима singleTask, снова не создаст новую задачу, но будет:

  1. Добавить действие сверху, если оно не в стеке (этоответьте на вопрос 1)
  2. Уничтожьте все действия поверх вашей и вызовите onNewIntent, если действие уже находится в стеке. (я думаю, что branch.io использует этот метод для обработки глубоких ссылок - что мне кажется очень странным, но ...)

С другой стороны, если вы укажетеtaskAffinity для вашей активности, тогда:

  • , если установлен режим singleTask, android будет искать задачу с этой привязкой и, если она присутствует, будет

    1. добавьте свое действие сверху, если действие не находится в заднем стеке задачи
    2. уничтожьте все действия поверх вашего действия и вызовите onNewIntent, если действие находится в заднем стеке.

Если задача отсутствует, она создаст новую и добавит вашу активность в качестве пользователя root.

  • , если в намерении установлен флаг FLAG_ACTIVITY_NEW_TASK, androidбудет искать задачу с указанной привязкой и, если найдет ее, просто выведет эту задачу на передний план, без разрушения стека или вызова onNewIntent. (я проверял, что если активность находится в заднем стеке, я думаю, что если активность не находится в заднем стеке, она переместит его в стек задачи) .

Итак, чтобы ответить на вопрос 2. Флаг FLAG_ACTIVITY_NEW_TASK и режим запуска singleTask различны.Я предполагаю, что подобное поведение может быть достигнуто при использовании еще 2 флагов FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP.

Я думаю, что пример в документации по вопросу 3 относится к более старым версиям Android (ниже 5.0).Там разные задачи не отображались в Recent Screens - вот документация: https://developer.android.com/guide/components/activities/recents.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...