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

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

Это так сказать частный случай предыдущего поста.

В прошлом примере приложение АР0004 не было запущено. В этот раз мы сперва запустим приложение АР0004. А потом уже АР0003 и посмотрим поведение Активности Е.

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

TA0001

Запоминаем таск 62 и что в нем ОДНА Активность А.

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

TA0002

Теперь жмем кнопку Start Activity E. И помним что родная задача АР0004 для этой Активности уже есть в памяти.

TA0003

Видим что все равно Активность была запущена в задаче 63, то есть в той из которой была запущена. И стек задачи 63 сейчас содержит две Активности А и Е.

Введем какой-нибудь текст

TA0004

Теперь жмем кнопку HOME и переходим (запускаем) в приложение АР0004

TA0005

Как видим приложение АР0004 открылось на Активности Е, так как она перешла в задачу 62 из задачи 63 и сейчас находится на вершине стека задачи 62.

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

TA0006

Теперь стек задачи 63 содержит ОДНУ Активность А, а стек задачи 62 ДВЕ Активности А и Е.

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

TA0007

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

Выходим из обоих приложений и тестируем следующий вариант.

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

Продолжаем разбираться с работой taskAffinity и allowTaskReparenting

Напоминаю, что в приложении АР0003

Для Активности Е определены параметры:
taskAffinity="com.example.ap0004"
allowTaskReparenting="true"

Для Активности F определен параметр:
taskAffinity="com.example.ap0004"

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

TA0001

Запоминаем что задача 57 и жмем Start Activity E и вводим любой текст в поле

TA0002

Видим что Активность Е была запущена так же в задаче 57. Теперь стек задачи 57 содержит ДВЕ Активности и имеет вид A-E.

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

TA0003

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

TA0004

Как видим приложение АР0004 запустилось не с Активности А. Фокус получила Активность Е приложения АР0003, которая перешла в задачу приложения АР0004, так как для нее родной определена задача приложения АР0004.

То есть Активность Е теперь находится в стеке задачи 58, а до этого была в стеке задачи 57. Стек задачи 58 теперь содержит КАК БЫ ДВЕ Активности А и Е. Но экземпляра Активности А физически в памяти пока не существует, а как бы предполагается ее наличие.

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

TA0005

Стек задачи 57 сейчас содержит одну Активность А

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

TA0006

Все так и есть

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

TA0007

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

TA0008

Из логов видно что это действительно так. То есть Активность А была создана по выходу из Активности Е. До этого ее в памяти не существовало, а была лишь ссылка на нее.

Выходим из обоих приложений и приступаем к следующему эксперименту.

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

И рассмотрим еще один частный случай использования allowTaskReparenting и taskAffinity.

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

TA0012

Запоминаем что это задача 45 и жмем Start G AP0003 и вводим текст в Активности G

TA0013

Видим что Активность G была запущена в задаче 45

Теперь жмем Start Activity A

TA0014

Теперь задача 45 содержит ТРИ Активности и ее стек имеет вид A-G-A. Причем первая Активность А принадлежит приложению АР004, а верхняя Активность А приложению АР0003.

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

TA0015

Запоминаем что Активность G у нас сейчас находится посредине в стеке между двумя Активностями А.

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

TA0016

Видим что приложение АР0003 было запущено не с Активности А, как и в предыдущих двух постах, а с существующей Активности G этого приложения. И что Активность G сейчас находится в стеке задачи 46. То есть она была выдернута из середины стека задачи 45 и перемещена в задачу своего приложения АР0003. Таким образом стек задачи 45 сейчас содержит ДВЕ Активности А и имеет вид A-A. А стек задачи 46 содержит КАК БЫ ДВЕ АКТИВНОСТИ А и G и имеет вид A-G. Как бы это потому, что Активность А приложения АР0003 еще не запущена и ее реально нет в стеке, но есть как бы ссылка на то что она должна быть запущена.

Жмем кнопку Info чтобы в этом убедиться

TA0017

Все так и есть.

Теперь если нажмем кнопку ОБРАТНО, то увидим Активность А приложения АР0003 в задаче 46 и там будет указано что она запущена впервые! На это тоже надо обратить внимание если в предыдущих постах не обращали.

TA0018

Смотрим логи

TA0019

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

Жмем ОБРАТНО еще раз и выходим из задачи 46. Затем запускаем (переходим) в приложение АР0004 задача 45.

TA0020

Обращаем внимание что это уже задача 45 и что Активность А уже была запущена.

Жмем ОБРАТНО и попадаем в Активность А приложения АР0004 задача 45

TA0021

Так же видим что эта Активность А уже была запущена.

Жмем ОБРАТНО и выходим из задачи 45.

И так еще один примерчик был рассмотрен

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

Продолжаем нашу тему изучения taskAffinity.

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

TA0001

Запоминаем что наша задача 40 и жмем Start Activity G и вводим любой текст в поле

TA0002

Видим что Активность G была запущена в задаче 40 в которой сейчас две активности и стек имеет вид A-G.

Нажмем инфо чтобы в этом убедиться

TA0003

Все так и есть. Теперь жмем кнопку HOME и запускаем приложение АР0004

TA0004

Запоминаем номер задачи 41 и жмем кнопку Start G AP0003 и вводим текст в поле Активности G

TA0005

Теперь у нас две задачи 40 и 41. Стек каждой из них имеет содержит две Активности и имеет вид A-G. Только у задачи 40 все Активности принадлежат приложению АР0003, а у задачи 41 Активность А принадлежит приложению АР0004, а Активность G приложению АР0003.

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

TA0006

Все так и есть.

Теперь жмем кнопку HOME и переходим (запускаем) приложение АР0003

TA0007

И что мы видим. Нашу Активность G запущенную из приложения АР0004. Активность G перешла из стека задачи 41 в стек задачи 40. То есть стек задачи 40 сейчас содержит три Активности и имеет вид A-G-G. А стек задачи 41 содержит теперь одну Активность А.

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

TA0008

Жмем Info чтобы еще раз убедиться

TA0009

Все так и есть

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

TA0010

Вот наша Активность G которую мы запускали из приложения АР0003. Жмем еще раз ОБРАТНО

TA0011

И видим нашу Активность А в задаче 40. Теперь обе задачи 40 и 41 содержат по одной Активности А приложений АР0003 и АР0004.

В этом эксперименте мы увидели еще одну особенность поведения Активностей с параметрами taskAffinity и allowTaskReparenting.

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

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

Теперь уже поговорим о taskAffinity в разных вариантах применения этого параметра.

И так приложения AP0003 и АР0004 опять сильно мутировали.

В приложение АР0003 было добавлено три Активности: E, F и G.

Для Активности Е определены параметры:
taskAffinity="com.example.ap0004"
allowTaskReparenting="true"

Для Активности F определен параметр:
taskAffinity="com.example.ap0004"

Для Ативности G определен параметр:
allowTaskReparenting="true"

Так же в Активность А приложения АР0003 добавлены кнопки:

Start Activity E, Start Act F и Start Activity G – которые делают стандартный запуск соответствующих Активностей.

Start Activity F New Task – запускает Активность F с флагом FLAG_ACTIVITY_NEW_TASK.

В Активность С приложения АР0004 добавлена кнопка Start E AP003 (стандартный запуск).

И так рассмотрим сперва случай с примером приложения из статьи в альма-матер на эту тему.

Запускаем приложение AP0004

TA00001

Запоминаем что ID нашей  задачи равен 35.

Жмем Start G AP0003

TA00002

Видим что Активность G приложения АР0003 была запущена в задаче 35. То есть стек задачи 35 сейчас содержит две Активности и имеет вид A-G.

Нажмем кнопку Info

TA00003

Вводим текст в поле

TA00004

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

И что мы видим!

TA00005

Что называется найди десять различий! Во первых это уже задача 36. Во вторых мы видим что Активность уже была запущена и видим нашу надпись! То есть это тот же самый экземпляр Активности который раньше был в задаче 35. То есть он переместился из стека задачи 35 в стек задачи 36.

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

TA00006

Теперь нажмем кнопку Info

TA00007

Мы видим что в стеке задачи 35 сейчас одна Активность А из которой мы собственно и запустили Активность G, которая перешла в стек задачи 36. А в стеке задачи 36 сейчас ДВЕ активности А и G. Но Активность А мы не запускали и ее запуска не видно ни где в логах, что кстати очень интересно.

Это означает что поскольку приложение АР0003 не было запущено и не было родного таска для Активности G, то этот таск создался и там виртуально присутствует корневая Активность А этого приложения.

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

TA00008

И вот она Активность А задачи 36. Но мы видим что она сообщает что она была запущена впервые! Смотрим логи

TA00009

И мы действительно видим что Активность А была только что создана! Такое поведение приложений надо иметь в виду и учитывать при разработке.

Соответственно в задачах 35 и 36 сейчас по одной Активности А.

TA00010 

Больше пока ни чем в этом посте грузить не буду. Так как и тут есть на что помедитировать Улыбка

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

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

Прежде чем перейти к рассмотрению taskAffinity рассмотрим еще один частный случай работы флага FLAG_ACTIVITY_NEW_TASK. Так как этот случай тоже надо знать.

На данный момент приложения АР0003 и АР0004 притерпели множество мутаций, но о них чуть позже. Сейчас пока напомню что Активность D в приложении АР0004 имеет стандартный параметр запуска. А в Активности С есть кнопку запуска Активности D с флагом FLAG_ACTIVITY_NEW_TASK.

И так к практике! Запускаем АР0004 и последовательно запускаем Активности А-В-С

NT0001

NT0002

NT0003

Теперь запоминаем номер нашей задачи 14 и жмем кнопку Start D NewTask, которая запускает Активность D этого же приложения с флагом FLAG_ACTIVITY_NEW_TASK. И как бы из описания альма-матер предполагается что она будет запущена в новом таске, да не тут то было! Жмем

NT0004

И как видим Активность D была запущена в том же таске что и другие Активности. То есть Активность D НЕ БЫЛА запущена в новой задаче.

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

Нажмем для верности Info чтобы убедиться что у нас один таск 14 и Активность D находится на вершине стека этой задачи

NT0005