23 октября 2014 г.

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

В этот раз рассмотрим флаг FLAG_ACTIVITY_MULTIPLE_TASK. Этот флаг всегда используется совместно с флагом FLAG_ACTIVITY_NEW_TASK или флагом FLAG_ACTIVITY_NEW_DOCUMENT (API Level 21).

Если флаг FLAG_ACTIVITY_MULTIPLE_TASK используется совместно с флагом FLAG_ACTIVITY_NEW_TASK , то Активность ВСЕГДА будет запускаться в новой задаче, не смотря на то что экземпляр данной Активности может уже существовать в какой либо задаче. Данную сладкую парочку надо использовать очень осторожно, так как система не предоставляет ни каких инструментов для возврата в созданную таким образом задачу. То есть вы должны сами позаботиться, чтобы пользователь мог переключиться на созданную таким образом задачу.

Приложения АР0003 и АР0004 опять пережили очередную мутацию. В приложении АР0003 в Активности С добавлена кнопка запуска Активности D из приложения АР0004 с двумя данными ключами (FLAG_ACTIVITY_MULTIPLE_TASK и FLAG_ACTIVITY_NEW_TASK).

В приложении АР0004 в Активности С была добавлена такая же кнопка.

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

И так запускаем АР0004

MT0001

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

MT0002

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

MT0003

Теперь нажем Start D NewTask. Данная кнопка запускает активность D с флагом FLAG_ACTIVITY_NEW_TASK. Обращаем внимание что номер текущей задачи 128.

MT0004

Активность D была запущена в той же задаче 128. Это пример для напоминания пройденного и для того чтобы понять разницу со следующим примером. Жмем кнопку обратно.

MT0005

Мы снова в Активности С, которая сообщает нам что она уже была запущена. Теперь жмем кнопку Start D MULTIPLE_TASK.

MT0006

Как видим Активность D была запущена в новой задаче 129. Теперь у нас есть две задачи 128 в которой ТРИ Активности А-В-С. И 129 в которой ОДНА Активность D. Нажмем Info чтобы в этом убедиться.

MT0007

Введем любой текст в нашей Активности D.

MT0008

Нажмем кнопку ДОМОЙ и затем снова запустим приложение АР0004.

MT0009

Что самое интересное мы снова попали в задачу 129, а не в задачу 128. То есть кнопка ДОМОЙ не нарушила последовательности этих двух задач.

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

MT0010

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

MT0011

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

MT0012

Запоминаем что у нас это задача 131 и жмем кнопку Start Activity D AP0004 MULTIPLE_TASK.

MT0013

Так же видим, что это новый экземпляр Активности D и он запущен в новой задаче 131.

И так у нас сейчас есть четыре задачи 128, 129, 130 и 131. Задачи 128 и 130 содержат по ТРИ Активности А-В-С и принадлежат соответственно приложениям АР0004 и АР0003. Задачи 129 и 131 содержат по ОДНОЙ Активности D.

Введем любой текст в нашу новую Активность D и нажмем Info

MT0014

MT0015

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

MT0016

В данном случае мы уже не попали в Активность D задачи 131! И это надо учитывать! Это как раз тот случай когда возможности вернуться в запущенную задачу может и не быть!

Нажмем еще раз кнопку Start Activity D AP0004 MULTIPLE_TASK и сразу же введем любой текст в поле Активности D

MT0017

Мы видим что был создан еще один новый экземпляр Активности D в задаче 132.

Теперь у нас ПЯТЬ задач.

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

MT0018

Ииии опаньки мы попали в задачу 132. Напомню что этот экземпляр Активности D мы стартовали вторым из приложения АР0003. Очень интересное поведение. Получается что задачи с Активностями D из приложения АР0004 выстроились в своеобразный стек задач.

Жмем кнопку ОБРАТНО

Ииии попадаем в ДОМАШНИЙ ЭКРАН

MT0019

Запускаем еще раз АР0004

Иии

MT0020

Попадаем в задачу 131. Это первый экземпляр Активности D запущенный из приложения АР0003.

Опять жмем ОБРАТНО

MT0019

И снова домашний экран

Опять запускаем АР0004

MT0021

И попадаем в Активность D задачи 129. Это тот экземпляр Активности D который мы запустили из приложения АР0004.

Жмем кнопку ОБРАТНО

MT0019

Снова домашний экран

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

MT0022

И только сейчас мы попали в Активность С приложения АР0004.

Вот такое интересное поведение у Активностей и стека задач при использовании этой сладкой парочки ключей.

Стоит так же добавить что если из Активности D запустить другие Активности, то при запуске приложения АР0004 будет происходить переключение на верхнюю Активность последней активной задачи. То есть переключение на стек последней задачи для которой Активность D является корневой.

Ну и последний пример. Для этого выйдем полностью из задачи 128 и запустим приложение АР003 (из его задачи 130 мы не выходили).

MT0016

И снова нажмем Start Activity D AP0004 MULTIPLE_TASK и введем любой текст.

MT0023

Видим новый экземпляр Активности D в новой задаче 138.

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

MT0024

И видим наш экземпляр Активности D задачи 138. То есть приложение АР0004 было запущено не с Активности А, а с уже существующей Активности D.

На этом с этими ключиками все.

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.

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