И так продолжаем вольный перевод статейки, начало перевода которой тут.
Параметр affinity определяет к какой задаче Активность предпочитает принадлежать. По умолчанию все Активности одного приложения запускаются в одной и той же задаче. Однако можно изменить такое поведение для Активности. Можно определить что Активности разных приложений будут запускаться в одной задаче, или же Активности одного приложения могут запускаться в различных задачах.
Принадлежность Активности к той или иной задаче можно поменять через атрибут taskAffinity элемента <activity>.
Атрибут taskAffinity срабатывает в двух случаях?
- Когда интент вызывающий Активность содержит флаг FLAG_ACTIVITY_NEW_TASK.
По умолчанию новая Активность запускается в той же задаче что и Активность из которой она была запущена. Однако если интент запуска содержит флаг FLAG_ACTIVITY_NEW_TASK система начинает искать другую задачу для размещения в ней новой Активности. И чаще всего это бывает новая задача. Но это не всегда так. И если уже существует задача с тем же значением taskAffinity, что и у запускаемой Активности, то она размещается в этой задаче. Если же нет, то запускается в новой задаче.
В случае если этот флаг помещает Активность в новую задачу и пользователь нажимает кнопку HOME, чтобы выйти из нее, то должен быть какой-то способ, чтобы пользователь снова мог попасть в задачу этой Активности. Некоторые процессы (например менеджер уведомлений) всегда запускают Активности во внешней задаче и ни когда как часть их собственной, таким образом они всегда добавляют к интенту флаг FLAG_ACTIVITY_NEW_TASK перед запуском Активности. Поэтому, если в вашем приложении есть Активность которая может быть запущена из какой-либо внешней задачи с использованием этого флага, то вы должны позаботиться о том, чтобы пользователь имел независимую возможность вернуться в задачу вашей Активности, например через иконку запуска приложения с рабочего стола. - Когда Активность имеет атрибут allowTaskReparenting установленный в значение "true".
В этом случае Активность может перемещаться из задачи в которой была запущена в задачу с тем же taskAffinity, когда она выходит на передний план.
Например, предположим что в некотором погодном приложении есть Активность, показывающая погоду в выбранном городе. Она имеет taskAffinity такую же как и другие Активности этого приложения (то есть все по умолчанию), но имеет атрибут allowTaskReparenting установленный в значение “true”. Когда одна из Активностей вашего приложения запустит Активность с отчетом о погоде в выбранном городе из этого приложения, то после старта оно будет принадлежать той же задаче что и ваша Активность. Однако когда погодное приложение выйдет на передний план, то Активность показывающая погоду в городе перейдет в задачу погодного приложения и будет показано в нем.
На этом с данной частью теории закончим и перейдем к практике.
P.S. Из теории данной темы нам осталось рассмотреть только чистку стека. Но это после практики по taskAffinity.
Комментариев нет:
Отправить комментарий