22 октября 2014 г.

Задачи и обратный стек (Tasks and back stack). Часть 39 (практика)

Рассмотрим работу флага запуска Активности FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET. Данный флаг помечает вызываемую Активность так, что следующем вызове задачи из домашнего экрана, эта Активность и все вышерасположенные будут закрыты. В качестве примера можно привести почтовую программу. Вы открываете письмо, щелкаете на вложение и переходите в некую программу просмотра вложения. Затем сворачиваете приложение. Когда вы в следующий раз запустите почту, вы увидите верхнюю Активность задачи, т.е. просмотр вложения. А если вызывать просмотр вложения с вышеуказанным флагом, то при следующем запуске почты просмотр вложения будет закрыт и вы увидите письмо.

Приложение АР0003 пережило очередной этап эволюции. В Активность С добавлена кнопка запуска Активности В из приложения АР0004 с данным флагом.

Запускаем приложение АР0003

WTR0001

Запускаем Активность В

WTR0002

И затем С

WTR0003

Теперь стек задачи 92 содержит ТРИ Активности и имеет вид А-В-С. Жмем кнопку Start Activity B AP0004 CLEAR_WHEN_TASK_RESET.

WTR0004

Теперь стек задачи 92 содержит ЧЕТЫРЕ Активности и имеет вид А-В-С-В. Причем первые три Активности принадлежат приложению АР0003 и последняя, верхняя Активность В приложению АР0004.

Далее запускаем последовательно Активности С и D.

WTR0005

WTR0006

Теперь стек задачи 92 содержит ШЕСТЬ Активностей и имеет вид А-В-С-В-С-D. Причем первые три принадлежат приложению АР0003 и вторые три приложению АР0004. Нажмем Info чтобы в этом убедиться.

WTR0007

Теперь жмем кнопку ДОМОЙ и снова запускаем приложение АР0003 с домашнего экрана

WTR0008

Мы видим нашу Активность С из которой мы запускали Активность В приложения АР0004. Это произошло потому, что все верхние Активности начиная с В были уничтожены. В следствии работы флага FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET.

Посмотрим логи

WTR0009

Из логов видно, что во время вызова приложения АР0003 произошло уничтожение Активностей В, С и D приложения АР0004.

И теперь задача 92 содержит снова ТРИ Активности и стек имеет вид А-В-С. Все три Активности принадлежат приложению АР0003.

Нажмем Info чтобы убедиться

WTR0010

На этом с этим флагом все.

21 октября 2014 г.

Задачи и обратный стек (Tasks and back stack). Часть 38 (практика)

FLAG_ACTIVITY_TASK_ON_HOME – если при запуске Активности используется этот флаг, то задача вызываемой Активности будет располагаться сразу после экрана ДОМ. Если из этой новой задачи выходить кнопкой Назад, то попадешь не в предыдущую задачу, а в экран ДОМ.

Этот флаг так же появился с API Level 11 и используется совместно с флагом FLAG_ACTIVITY_NEW_TASK.

Приложение АР0003 снова мутировало. В Активность В была добавлена кнопка запуска Активности В из приложения АР0004 с данными флагами.

Запускаем приложение АР0003

OH0001

Запускаем Активность В

OH0002

Жмем кнопку Act B AP0004 OnHome

OH0003

Активность В приложения АР0004 была запущена в задаче 77, что собственно и правильно. Теперь жмем кнопку ОБРАТНО

OH0004

И попадаем на домашний экран, а не в приложение АР0003, как это происходит обычно.

Сейчас разберем еще один вариант работы этих флагов, чтобы лучше усвоить их работу.

Помним что приложение АР0003 у нас все еще работает.

Запускаем приложение АР0004

OH0005

Запускаем Активность В и вводим там любой текст

OH0006

И далее стартуем Активность С

OH0007

Теперь стек задачи 78 содержит ТРИ Активности и имеет вид А-В-С. Жмем Info

OH0008

Все так и есть. Кроме того видим что в памяти у нас работает и приложение АР0003.

Сейчас в приложении АР0004 жмем кнопку ДОМОЙ и переключаемся в приложение АР0003

OH0009

И жмем Act B AP0004 OnHome

OH0010

Мы видим что была создан НОВЫЙ экземпляр Активности В в задаче 78. То есть стек задачи 78 сейчас содержит ЧЕТЫРЕ Активности и имеет вид А-В-С-В. Жмем Info

OH0011

Теперь жмем кнопку ОБРАТНО

OH0012

И попадаем в Активность С задачи 78. То есть произошло переключение на стек задачи 78. Это влияние работы флага FLAG_ACTIVITY_NEW_TASK.

Жмем кнопку ОБРАТНО еще раз

OH0013

И вот наш экземпляр Активности В где мы ввели свой текст

Жмем ОБРАТНО еще раз

OH0014

Попали в Активность А

И теперь еще раз ОБРАТНО

OH0004

Попали на домашний экран. Это уже влияние флага FLAG_ACTIVITY_TASK_ON_HOME.

На этом с этими флагами все.

Задачи и обратный стек (Tasks and back stack). Часть 37 (практика)

Теперь еще пройдемся по некоторым флагам запуска Активностей. Начнем с флага FLAG_ACTIVITY_CLEAR_TASK. Данный флаг используется в сочетании с флагом FLAG_ACTIVITY_NEW_TASK. Этот флаг появился c API Level 11. Задача вызываемой Активности будет очищена, а вызываемая Активность станет в ней корневой.

Приложение АР0003 в очередной раз мутировало. В Активность В была добавлена кнопка запуска Активности С из приложения АР0004 с данными флагами.

Запускаем приложение АР0004 и последовательно запускаем все Активности от А до D.

CT0001

CT0002

CT0003

CT0004

Теперь стек задачи 61 содержит ЧЕТЫРЕ Активности и имеет вид A-B-C-D. Жмем инфо чтобы убедиться.

CT0005

Далее жмем кнопку ДОМОЙ и запускаем приложение АР0003

CT0006

Запускаем Активность В

CT0007

И далее жмем кнопку Start Act C AP0004 ClearTask

CT0008

И так мы видим, что Активность С в задаче 61 была создана заново и сейчас в этой задаче всего одна Активность. Посмотрим логи.

CT0009

Мы видим что все Активности в задаче 61 были уничтожены, то есть стек этой задачи был очищен полностью, а затем был создан новый экземпляр Активности С, которую мы и вызывали. То есть из стека задачи 61 были удалены ВСЕ Активности.

Теперь стек задачи 61 содержит ОДНУ Активность С.

CT0010

На этом с этим флагом закончим.

Задачи и обратный стек (Tasks and back stack). Часть 36 (практика)

Рассмотрим флаг запуска Активности FLAG_ACTIVITY_REORDER_TO_FRONT.

Если в задаче уже существует запускаемая Активность, то данный флаг перемещает ее на вершину стека.

Приложение АР0003 опять мутировало. В Активность С была добавлена кнопка запуска Активности В с данным флагом.

Запускаем приложение АР0003

RF0001

Стартуем Активность В и вводим в текстовом поле какой-нибудь текс

RF0002

И затем стартуем Активность С

RF0003

Сейчас в стеке задачи 45 содержится три Активности и стек имеет вид А-В-С. Нажмем Info чтобы в этом убедиться

RF0004

Теперь жмем кнопку Start Act B Reorder to Front

RF0005

Мы видим наш экземпляр Активности В в котором мы уже вводили текст. Сейчас стек задачи 45 так же содержит ТРИ Активности, но уже имеет вид А-С-В, так как Активность В была перемещена на вершину стека. Нажмем Info

RF0006

Теперь жмем кнопку ОБРАТНО

RF0007

Мы попали в Активность С, как и должно было быть

Жмем еще раз ОБРАТНО

RF0008

И попадаем в Активность А.

Жмем еще раз обратно и выходим из приложения.

На этом с данным флагом все. Стоит отметить, что если запускаемой Активности в задаче не существует, то она просто создается и помещается на вершину стека как это делается обычно.

17 октября 2014 г.

Задачи и обратный стек (Tasks and back stack). Часть 35 (практика)

Рассмотрим еще один параметр excludeFromRecents, который будучи установленным в true исключает задачу, для которой эта Активность является корневой, из списка недавно открытых приложений.

Для этого была проведена очередная мутация приложений АР0003 и АР0004. В приложение АР0003 была добавлена Активность L с параметром excludeFromRecents="true". А в приложении АР0004 в Активности С была добавлена кнопка запуска Активности L с флагом FLAG_ACTIVITY_NEW_TASK, чтобы она запускалась в новой задаче и была для нее корневой.

Запускаем приложение АР0004 и сперва посмотрим как ведет себя Активность в новой задаче без рассматриваемого нами параметра

ER0001

Запоминаем номер задачи 29 и жмем Start B AP0003 NEW TASK flag

ER0002

Активность В была запущена уже в задаче 30, как и должно было быть

Теперь нажмем кнопку ДОМОЙ чтобы увидеть рабочий стол и затем опять будем удерживать кнопку ДОМОЙ несколько секунд чтобы увидеть список недавно открытых приложений

ER0003

И так мы видим в этом списке оба приложения АР0003 и АР0004

Переключимся в АР0003 и выйдем из него нажав кнопку ОБРАТНО, а затем переключимся в приложение АР0004

ER0004

Далее запустим последовательно Активности В и С.

ER0005

ER0006

И нажмем Start L AP0003 NewTask

ER0007

Активность L была запущена в новой задаче 31 и она является для нее корневой сейчас. Теперь нажмем кнопку ДОМОЙ чтобы увидеть рабочий стол и затем удержав снова кнопку домой пару секунд выведем список недавно открытых задач.

ER0008

Как видим Активности L приложения АР0003 нет в списке недавно запущенных задач.

Но это не значит что этой задачи не существует, если мы выйдем из этого списка и запустим приложение АР0003 с рабочего стола, то увидим наше приложение

ER0009

Которое нам сообщит что оно уже было запущено. Теперь нажмем Start Activity A

ER0010

И снова кнопку ДОМОЙ и выведем список недавно открытых задач

ER0011

И ооооопс мы снова увидели приложение АР0003 в списке недавних задач. И опять поведение не такое как было описано в альма-матер. То есть в списке недавних задач не было видно только той Активности для которой был установлен параметр excludeFromRecents="true". То есть Активности L. Хотя ожидалось, как о том говориться в описании что не будет видна вся задача для которой эта Активность является корневой.

Переключимся в приложение АР0003 и нажмем кнопку ОБРАТНО

ER0009

Опять увидим нашу Активность L

Жмем ДОМОЙ и выводим список задач

ER0012

И оооопс опять увидели приложение АР0003 и его Активность L в списке недавних задач.

Еще один сюрприз от Андроид Улыбка

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