18 апреля 2014 г.

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

На очередном витке эволюции в приложении AP0003 в Активности D добавлена кнопка запуска Активности B из приложения AP0004.

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

 

Жмем кнопку Start D AP0003

TSK0045

Жмем кнопку Info

TSK0046

Тут все понятно в логах.

Жмем кнопку Start D AP0003

TSK0047

Видно что в сейчас в задаче с ID=23 две Активности. Жмем Info

TSK0048

И еще раз внимательно смотрим. В задаче приложения AP0004 сейчас две активности А и D. Активность А принадлежит приложению AP0004, Активность D – AP0003. И обе они находятся в одной задаче TaskID=23, приложения AP0004. Но при этом Активность А работает в процессе приложения AP0004 (PID 1685), а Активность D в процессе приложения AP0003 (PID 1737).

Теперь жмем кнопку Start B AP0004

TSK0049

Теперь в нашей задаче ТРИ Активности A-D-B, причем Активности А и В из приложения AP0004, а активность D из приложения AP0003.

Жмем Info

TSK0050

Видим, что после запуска Активности В из приложения AP0004, мы опять переключились на процесс этого приложения (PID 1685), при том что находимся все в той же задаче.

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

Теперь, ради спортивного научного интереса, убьем процесс приложения AP0003 (PID 1737).

Жмем кнопку HOME

И запускаем приложение ProcessView. В Google Play оно называется CPU Usage& Process List Viewer.

TSK0051

TSK0052

TSK0053

TSK0054

Как видим процесса приложения AP0003 (PID 1737) больше нет. Мы его убили.

Теперь возвращаемся к нашему приложению AP0004.

TSK0055

Напомню что в нашей задаче сейчас ТРИ Активности A-D-B, причем Активности А и В принадлежат приложению AP0004 (PID 1685), а Активность D, принадлежит приложению AP0003 (PID 1737), процесс которого мы как раз только что и убили.

Теперь посмотрим что будет если мы нажмем кнопку ОБРАТНО, находясь в Активности В. По идее должна открыться Активность D, но ее же процесс мы только что убили….. та да да дамммм… жмем кнопку ОБРАТНО

TSK0056

Как видим, Активность D была создана заново, а счетчик, который у нас всегда работал безупречно сбился.

Жмем кнопку Info

TSK0057

Как видим в логах показывается достоверная информация о количестве Активностей в нашей задаче, их ДВЕ – А и D. Но Активность D уже работает в процессе с PID 1796, а до этого был PID 1737, но мы его убили. Но хотя мы его убили, Активность D все равно была запущена в процессе приложения AP0003 хоть и новом конечно.

Нажмем кнопку HOME и снова вернемся к приложению AP0004

TSK0058

Как видим счетчик в Активности D уже показывает правильное количество Активностей в задаче.

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

Свои приложения надо стараться проектировать в расчете на то что их процесс может быть прибит пользователем или системой.

То есть тестировать свои приложения в стиле садо мазо Улыбка

Продолжим и мы в том же стиле. Напечатаем текст в текстовом поле

TSK0059

И повернем экран, чтобы убедится что текст сохранился

TSK0060

Повернем обратно и нажмем Start B AP0004

TSK0061

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

TSK0062

Как видим в нормальной ситуации, счетчик работает нормально.

Нажмем еще раз Info

TSK0063

Как видим Активность D сейчас у нас снова на вершине стека в задаче приложения AP0004 с TaskID 23 и работает в процессе приложения AP0003 с  PID 1769.

Снова нажмем Start B AP0004 и смотрим лог.

TSK0064

Активность B была запущена в процессе приложения AP0004 PID 1685. Теперь снова убьем процесс приложения AP0003 PID 1769, и посмотрим, отразится ли это как то в логах.

А в логах….. И тишина… и только мертвые с косами стоят…..

То есть, если убивается процесс, то у Активностей в нем даже не срабатывают методы onStop() и onDestroy(). Это тоже надо учитывать при разработке приложений.

Вернемся опять в наше приложение

TSK0065

И увидим, что счетчик в приложении показывает что у нас в задаче 3 активности. Нажмем кнопку Info

TSK0066

И логи нам тоже показывают что в задаче три Активности, что и есть правда. Ну логически. Так как наше приложение помнит что между Активностями А и В есть Активность D. То есть задача с TaskID 23, помнит и знает об этом. Другое дело, что она не знает, что процесс 1769 был прибит нами.

Для чистоты эксперимента нажмем кнопку Start Activity C

TSK0067

И так видим что сейчас в задаче четыре Активности А-D-B-C, из них только Активность D принадлежит приложению AP0003, остальные принадлежат AP0004.

Нажмем два раза кнопку обратно.

TSK0068

Как видим, хотя Активность и была создана снова, но текст в ней сохранился, так как он был вытащен из объекта Bundl принадлежащему задаче приложения AP0004 с Task ID 23.

Единственное, что не правильно работает, так это счетчик, который рассчитан был на нормальную работу приложения.

Если будет время и желание попробую поправить это.

А щас пока нажмем кнопку Info

TSK0069

В логах показывается все правильно. Количество Активностей в задаче 2.

На этом пока на сегодня все.

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

Мои приложения AP0003 и AP0004 сделали очередной виток эволюции. Улыбка

Теперь в каждой Активности приложений есть кнопка Info при нажатии которой в лог выводится информация об обоих приложениях такая как:

  • TaskID каждого приложения
  • Количество активностей в задаче
  • Имя корневой Активности
  • Имя верхней Активности
  • Thread ID приложения
  • Process ID приложения

Два последних пункта дублируют то, что выводится в LogCat, но это сделано для лучшей наглядности.

Кроме того в обоих приложениях в заголовок каждой Активности помещается следующая информация:

  • Имя приложения
  • Имя Активности
  • Task ID приложения

Так же, в Активности А приложения AP0004 теперь две кнопки для запуска Активности С и Активности D из приложения AP0003.

Активность D в приложении AP0003 имеет параметр запуска singleTop, в приложении AP0004 у нее стандартный параметр запуска.

В приложении AP0003, все Активности имеют поля для ввода текста, в приложении AP0004 только Активности A и B имеют поля для ввода текста.

И так запустим приложение AP0003 и последовательно запустим Активности A, B, C и D.

TSK0024

TSK0025

TSK0026

TSK0027

Мы видим, что в текущей задаче с TaskID=4 сейчас находится четыре Активности A-B-C-D. Активность А является корневой, а Активность D находится на вершине стека.

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

TSK0028

Обращаем внимание, что и корневая и верхняя Активности принадлежат одному приложению – AP0003.

Собственно лог, еще раз подтвердил, то что я написал выше.

Теперь в поле ввода текста в Активности D введем какой-нибудь текст для того, чтобы однозначно ее идентифицировать, поскольку, потом, мы так же запустим Активность D из приложения AP0004.

TSK0029

Затем нажмем кнопку HOME и снова запустим приложений AP0003, чтобы убедится что наша Активность D в приложении AP0003 сохранила текст, введенный в поле.

TSK0030

Теперь снова жмем кнопку HOME и запускаем приложение AP0004.

TSK0031

Замечаем, что приложение AP0004 имеет TaskID=6 и что в текущей задаче пока одна Активность A. Нажмем на кнопку Info и посмотрим что там будет:

TSK0032

Видим много интересного. В блоке отмеченным желтым мы видим информацию о задаче с TaskID=6, что в нем одна Активность А и пока она же является и корневой и верхней. Желтый блок это информация о приложении AP0004. Зеленым блоком отмечена информация о приложении AP0003, в котором как мы уже говорили есть четыре Активности A-B-C-D, А – в корне и D на вершине.

TIP и PID в обоих блоках одинаковые, так как выполнение нажатия кнопки Info произошло из приложения AP0004.

Теперь в Активности А приложения AP0004, нажмем кнопку Start D AP0003. Напомню что Активность D в приложении AP0003 имеет параметр запуска singleTop.

 TSK0033

Обращаем внимание, что был создан новый экземпляр Активности D и помещен в задачу приложения AP0004 (TaskID=6). У приложения AP0003 TaskID=5.

И снова нажмем кнопку Info:

TSK0034

Тут уже много интересных вещей для анализа и понимания. Приложение AP0004 отмечено желтым цветом, приложение AP0003 – зеленым.

И так мы видим, что Активность D, принадлежащая приложению AP0003, была запущена из Активности А, приложения AP0004. И в задаче приложения AP0004 с TaskID=6 был создан новый экземпляр Активности D. Теперь в задаче приложения AP0004, находится две Активности и стек имеет вид A-D. Причем Активность А в корне принадлежит приложению AP0004, а Активность D находящаяся на вершине стека, принадлежит приложению AP0003, но обе они находятся в стеке задачи приложения AP0004.

Стек же приложения AP0003, остался не тронутым. Там по прежнему четыре Активности и стек имеет вид A-B-C-D.

Кроме того надо обратить внимание, что экземпляр Активности D из приложения AP0003, хотя и находится в стеке задачи приложения AP0004 с TaskID=6, выполняется в процессе приложения AP0003 имеющим PID=1428. А у приложения AP0004 PID=1469.

Вообще интересная тема для медитации Улыбка

Теперь введем другой текст в поле Активности D, чтобы идентифицировать ее, как принадлежащую к задаче приложения AP0004. Нажмем кнопку HOME и снова запустим приложение AP0004.

TSK0035

Как видим текст сохранился. Еще раз обращаем внимание на то, что TaskID=6 и что в этой задаче сейчас две Активности A и D.

Теперь нажмем кнопку Start Activity D. И увидим, что новый экземпляр не был создан, так как у Активности D в приложении AP0003 определен параметр запуска singleTop. Скрин приводить не буду, так как он тот же самый. А в логах будет видно, что Активность D перешла в режим паузы и потом была снова восстановлена.

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

Теперь, для следующего эксперимента, выйдем из обоих приложений. И запустим сперва приложение AP0004.

TSK0036

Оно уже было запущено в новой задаче (TaskID=12). Далее нажимаем кнопку Info.

TSK0037

Но, что интересно, хотя TaskID приложения поменялся, процесс остался тот же. Далее нажмем кнопку Start D AP0003.

TSK0038

Все, как положено, в задаче с TaskID=12 сейчас две Активности А и D. Жмем кнопку Info.

TSK0039

Видно, что после нажатия кнопки Start D AP0003, Активность А перешла в остановленное состояние, и была запущена Активность D, причем она легла в задачу (стек) приложения AP0004, но была запущенна в процессе приложения AP0003, который кстати остался, так же неизменным (PID=1428), даже не смотря на то, что мы, до этого вышли из приложения AP0003, о чем кстати и говорит вывод информации по кнопке Info. Приложение AP0003, сейчас не выполняется.

Введем текст в текстовом поле Активности D:

TSK0040

И нажмем кнопку HOME, а затем запустим приложение AP0003

TSK0041

Поскольку приложение было запущено заново, оно было запущено в новой задаче (TaskID=13).

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

TSK0042

Теперь видно что работает два приложения AP0004, в котором две Активности A и D (отмечено в логе желтым цветом). И приложение AP0003 в котором сейчас одна Активность А (зеленый цвет).

В приложении AP0003, запустим последовательно активности B-C-D и в Активности D введем текст

TSK0043

Нажмем кнопку HOME и запустим приложение AP0004

TSK0044

Что называется найди 10 различий Улыбка

И так в приложении AP0004 у нас сейчас ДВЕ активности A и D. Активность А из приложения AP0004 и Активность D из приложения AP0003.

В приложении AP0003 у нас сейчас ЧЕТЫРЕ активности A-B-C-D и все они из приложения AP0003.

Кроме того, текст в обоих Активностях D разный, что лишний раз подтверждает, что это разные экземпляры одной Активности находящиеся в разных задачах, но обе они выполняются в одном процессе приложения AP0003.

Вот такой кардебалет Улыбка

Код приложений пока не привожу, так как возникла очередная идейка, по их модификации Улыбка

Но тут он особо пока и не нужен, скринов и логов я думаю достаточно для понимания.

Код будет чуть позже, после очередного витка эволюции Улыбка