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.

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

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

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