16 мая 2014 г.

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

Таки переходим к launchMode="singleInstance". Улыбка

В приложении АР0004 для Активность Е launchMode определен как "singleInstance".

В приложении AP0004 есть пять Активностей A, B, C, D, E, в каждой из которых есть кнопка запуска следующей Активности. Активность Е имеет кнопку запуска Активности А из приложения AP0004. То есть по существу создан запуск Активностей по кругу.

Запускаем приложение AP004 и последовательно запускаем Активности В, С и D

SI0001

SI0002

SI0003

SI0004

Здесь все как обычно. Стоит только запомнить что в задаче TaskID=13 сейчас ЧЕТЫРЕ Активности, а стек задачи имеет вид A-B-C-D. Теперь нажимаем Start Activity E

SI0005

Замечаем, что Активность Е была запущена уже в другой задаче с TaskID=14. Посмотрим логи

SI0006

В логах видно, что Активность Е была запущена в новой задаче и запущена как мы помним из Активности D, это тоже надо запомнить. Так же стоит отметить, что Активность Е, как и должно тому быть, была запущена в процессе своего приложения, в данном случае 1618.

Нажмем кнопку Info и посмотрим логи

SI0007

И так замечаем, что в задаче 13 у нас по прежнему ЧЕТЫРЕ Активности и стек задачи имеет вид A-B-C-D. В задаче же 14 только одна Активность Е и она там всегда будет единственной, так как у нее launchMode="singleInstance".

Теперь нажмем кнопку Start Activity A и запомним что Активность А мы запустили из Активности Е.

SI0008

Замечаем, что Активность А, у нас так же была запущена в задаче 13, в которой теперь ПЯТЬ Активностей и стек имеет вид A-B-C-D-A. Нажмем кнопку Info и посмотрим логи

SI0009

Собственно из логов все это видно. Теперь еще раз вспомним что Активность А мы запустили из Активности Е. Нажмем кнопку ОБРАТНО и посмотрим что будет.

SI0010

Мы вернулись а Активность D в задачу 13! Хотя Активность А была запущена из Активности Е, возврат произошел в Активность D, поскольку Активность E была запущена в отдельной задаче. То есть возврата в Активность Е не произошло. Счетчик в этот раз тоже сработал не правильно. Будет время и желание пофиксю и это. Но сейчас в задаче 13 ЧЕТЫРЕ Активности и стек задачи имеет вид A-B-C-D. Нажмем кнопку Info, чтобы убедится в этом

SI0011

Зеленым отмечена задача 13. Как видно там четыре Активности. В задаче 14 одна Активность Е. В желтой рамке виден переход из Активности А в Активность D. Если сейчас нажать кнопку HOME и снова вернуться в приложение AP0004, то Активность D уже отобразить правильное количество Активностей в задаче 13.

SI0012

Этот глюк счетчика в Активности если будет время пофиксю. А сейчас идем дальше. Нажимаем кнопку ОБРАТНО три раза

SI0013

SI0014

SI0015

Замечаем, что все Активности нам сообщают что они были уже запущены. Теперь на данном этапе в задаче 13 у нас одна Активность А. И в задаче 14 тоже одна Активность Е. Нажмем Info чтобы убедится

SI0016

Логи это подтвердили. Теперь вопрос, задача 14 существует, как в нее попасть? По идее если сейчас в Активности А нажать ОБРАТНО, то мы должны выйти из приложения АР0004, так как Активность А, у нас сейчас единственная и последняя в стеке задачи 13. Сделаем это. Жмем кнопку ОБРАТНО

SI0017

И выходим из приложеня Печальная рожица А как же теперь попасть в задачу 14?

Запускаем AP0004 заново

SI0018

Видим что она уже запущена в задаче 16. Жмем Info

SI0019

Мы видим, что задача 14 по прежнему существует и в ней есть Активность Е! Как до нее добраться? Запускаем заново Активности B-C-D

SI0020

SI0021

SI0022

Сейчас стек задачи 16 имеет вид A-B-C-D. То есть в нем ЧЕТЫРЕ Активности. Жмем кнопку Start Activity E.

SI0023

Активность Е нам честно сообщает что она уже была запущена прежде, что мы и так знаем. И задача 14 продолжала болтаться в памяти, хотя мы вышли из приложения AP0004.

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

SI0024

Нажмем Start Activity A

SI0025

Теперь в задаче 15 у нас 5 Активностей. Собственно сейчас все повторяется как было до этого. Нажмем кнопку ОБРАТНО

SI0026

Счетчик опять глюканул, так как я его не правил еще. Жмем опять ОБРАТНО

SI0027

Здесь уже со счетчиком все нормально. Жмем еще пару раз ОБРАТНО

SI0028

SI0029

И жмем еще раз обратно

SI0030

И оооооопляяяяя! Попали в Активность Е! И попали мы в нее сейчас потому, что на Активности D и других не нажимали кнопку HOME. Вот такое поведение тоже надо учитывать при разработке. Так как Активность с singleInstance может зависнуть в памяти, как мы это только что видели.  Теперь нажмем кнопку Info и посмотрим что там у нас происходит. По идее задача 16 должна была перестать существовать, так как мы закрыли последнюю Активность А в ее стеке.

SI0031

Так и есть. Осталась только одна задача 14 и в ней одна Активность Е. Задача 16 была уничтожена с уничтожением последней Активности в ней, то есть Активности А.

Нажмем кнопку обратно и выйдем из Активности Е и вообще из приложения AP0004.

И будем медитировать на это интересное поведение Активности Е Улыбка 

И заодно может и счетчик пофиксю

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

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