25 сентября 2014 г.

Задачи и обратный стек (Tasks and back stack). Обработка affinities (Handling affinities). Часть 22 (теория)

И так продолжаем вольный перевод статейки, начало перевода которой тут.

Параметр 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.

Комментариев нет:

Отправить комментарий