Таки переходим к launchMode="singleInstance".
В приложении АР0004 для Активность Е launchMode определен как "singleInstance".
В приложении AP0004 есть пять Активностей A, B, C, D, E, в каждой из которых есть кнопка запуска следующей Активности. Активность Е имеет кнопку запуска Активности А из приложения AP0004. То есть по существу создан запуск Активностей по кругу.
Запускаем приложение AP004 и последовательно запускаем Активности В, С и D
Здесь все как обычно. Стоит только запомнить что в задаче TaskID=13 сейчас ЧЕТЫРЕ Активности, а стек задачи имеет вид A-B-C-D. Теперь нажимаем Start Activity E
Замечаем, что Активность Е была запущена уже в другой задаче с TaskID=14. Посмотрим логи
В логах видно, что Активность Е была запущена в новой задаче и запущена как мы помним из Активности D, это тоже надо запомнить. Так же стоит отметить, что Активность Е, как и должно тому быть, была запущена в процессе своего приложения, в данном случае 1618.
Нажмем кнопку Info и посмотрим логи
И так замечаем, что в задаче 13 у нас по прежнему ЧЕТЫРЕ Активности и стек задачи имеет вид A-B-C-D. В задаче же 14 только одна Активность Е и она там всегда будет единственной, так как у нее launchMode="singleInstance".
Теперь нажмем кнопку Start Activity A и запомним что Активность А мы запустили из Активности Е.
Замечаем, что Активность А, у нас так же была запущена в задаче 13, в которой теперь ПЯТЬ Активностей и стек имеет вид A-B-C-D-A. Нажмем кнопку Info и посмотрим логи
Собственно из логов все это видно. Теперь еще раз вспомним что Активность А мы запустили из Активности Е. Нажмем кнопку ОБРАТНО и посмотрим что будет.
Мы вернулись а Активность D в задачу 13! Хотя Активность А была запущена из Активности Е, возврат произошел в Активность D, поскольку Активность E была запущена в отдельной задаче. То есть возврата в Активность Е не произошло. Счетчик в этот раз тоже сработал не правильно. Будет время и желание пофиксю и это. Но сейчас в задаче 13 ЧЕТЫРЕ Активности и стек задачи имеет вид A-B-C-D. Нажмем кнопку Info, чтобы убедится в этом
Зеленым отмечена задача 13. Как видно там четыре Активности. В задаче 14 одна Активность Е. В желтой рамке виден переход из Активности А в Активность D. Если сейчас нажать кнопку HOME и снова вернуться в приложение AP0004, то Активность D уже отобразить правильное количество Активностей в задаче 13.
Этот глюк счетчика в Активности если будет время пофиксю. А сейчас идем дальше. Нажимаем кнопку ОБРАТНО три раза
Замечаем, что все Активности нам сообщают что они были уже запущены. Теперь на данном этапе в задаче 13 у нас одна Активность А. И в задаче 14 тоже одна Активность Е. Нажмем Info чтобы убедится
Логи это подтвердили. Теперь вопрос, задача 14 существует, как в нее попасть? По идее если сейчас в Активности А нажать ОБРАТНО, то мы должны выйти из приложения АР0004, так как Активность А, у нас сейчас единственная и последняя в стеке задачи 13. Сделаем это. Жмем кнопку ОБРАТНО
И выходим из приложеня А как же теперь попасть в задачу 14?
Запускаем AP0004 заново
Видим что она уже запущена в задаче 16. Жмем Info
Мы видим, что задача 14 по прежнему существует и в ней есть Активность Е! Как до нее добраться? Запускаем заново Активности B-C-D
Сейчас стек задачи 16 имеет вид A-B-C-D. То есть в нем ЧЕТЫРЕ Активности. Жмем кнопку Start Activity E.
Активность Е нам честно сообщает что она уже была запущена прежде, что мы и так знаем. И задача 14 продолжала болтаться в памяти, хотя мы вышли из приложения AP0004.
Введем текст в текстовом поле
Нажмем Start Activity A
Теперь в задаче 15 у нас 5 Активностей. Собственно сейчас все повторяется как было до этого. Нажмем кнопку ОБРАТНО
Счетчик опять глюканул, так как я его не правил еще. Жмем опять ОБРАТНО
Здесь уже со счетчиком все нормально. Жмем еще пару раз ОБРАТНО
И жмем еще раз обратно
И оооооопляяяяя! Попали в Активность Е! И попали мы в нее сейчас потому, что на Активности D и других не нажимали кнопку HOME. Вот такое поведение тоже надо учитывать при разработке. Так как Активность с singleInstance может зависнуть в памяти, как мы это только что видели. Теперь нажмем кнопку Info и посмотрим что там у нас происходит. По идее задача 16 должна была перестать существовать, так как мы закрыли последнюю Активность А в ее стеке.
Так и есть. Осталась только одна задача 14 и в ней одна Активность Е. Задача 16 была уничтожена с уничтожением последней Активности в ней, то есть Активности А.
Нажмем кнопку обратно и выйдем из Активности Е и вообще из приложения AP0004.
И будем медитировать на это интересное поведение Активности Е
И заодно может и счетчик пофиксю
Комментариев нет:
Отправить комментарий