Показаны сообщения с ярлыком RunningTaskInfo. Показать все сообщения
Показаны сообщения с ярлыком RunningTaskInfo. Показать все сообщения

15 мая 2014 г.

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

Таки еще вернемся к launchMode=”singleTask”. Но сделаем это по быстрому Улыбка

Это скорее работа над ошибкой работы счетчика, которая была в прошлой, 9 части. Фикся эту ошибку заодно понял когда и как срабатывает метод onNewIntent().

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

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

E0001

E0002

E0003

Тут пока все как обычно, стоит только запомнить что сейчас в задаче 37 ТРИ Активности и стек задачи имеет вид A-B-C.

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

E0004

В логах стоит отметит, что метод onNewIntent() не сработал, так как Активности С еще не существовало ни в каком таске, и поэтому был создан новый экземпляр Активности С.

Введем текст в Активности С и последовательно запустим Активности D-A-B

E0005

E0006

E0007

E0008

Теперь в нашей задаче 37 ШЕСТЬ Активностей и стек имеет вид A-B-C-D-A-B. Нажмем кнопку Info чтобы еще раз в этом убедится.

E0009

Теперь нажмем Start Activity C

E0010

Новый экземпляр Активности С не был создан, так как у нее launchMode=”singleTask”. Это я так напоминаю. Активность нам уже сама сообщила что она уже была запущена и что в нашей задаче 37 сейчас всего ТРИ Активности A-B-C, а до этого было шесть. Три другие D-A-B были уничтожены, так как были в стеке сверху Активности С.

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

E0011

В Активности С сработал метод onNewIntent(), поскольку Активность С уже существовала в данной задаче. И вместо создания новой Активности С, фокус получила уже существующая, так как у нее  launchMode=”singleTask”.

Желтым в логах отмечены факты уничтожения Активностей D-A-B, которые были в стеке над Активностью С.

Зеленым отмечена работа кода в методе onNewIntetn(). Обращаем внимание на длинную строчку, а так же на вторую, в которой стоит значение null, выводящее значение getAction() для объекта Intent. В данном случае значение равно null, так как Активность С была вызвана из своего же приложения.

Теперь нажмем кнопку Start Activity D

E0006

Теперь у нас в задаче 37 ЧЕТЫРЕ Активности и стек имеет вид A-B-C-D.

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

E0012

И запустим из него Активность С в приложении AP0003 нажав кнопку Start C AP0003.

E0013

Теперь счетчик, благодаря коду в методе onNewIntent() работает правильно. В задаче 37 сейчас ТРИ Активности A-B-C, так как Активность D была уничтожена, поскольку находилась в стеке выше Активности С.

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

E0014

Теперь в объекте Intent есть параметры вызова, так как Активность С, вызывалась из приложения AP0004. И один из них act=AP0003_ActC. Это как раз то значение которое задано как интент-фильтр для вызова Активности С из других приложений. В то время как при запуске Активности С из приложения AP0003 act был равен null. Собственно эту особенность я использовал для коррекции значения счетчика в правильное значение.

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

E0015

Видим что хотя Активность С была вызвана из Активности А приложения AP0004, по кнопке ОБРАТНО мы вернулись в Активность В приложения AP0003, так как произошло переключение на стек задачи 37 AP0003. Собственно все как описано в альма-матер.

Еще раз жмем кнопку обратно.

E0016

Мы все еще в задаче 37 приложения AP0003. И еще раз кнопку ОБРАТНО

E0017

И вот только теперь мы вернулись в приложение AP0004.

А сейчас кусочек кода метода onNewIntent(), который корректирует счетчик Активностей в задаче в правильное значение.

	@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "ActivityC: onNewIntent(" + getTaskId() + ") "+intent);
Log.d(TAG, "----------------------");
Log.d(TAG, "ActivityC: onNewIntent(" + getTaskId() + ") "+intent.getAction());
// коррекция счетчика при вызове Активности из другого приложения
if(intent.getAction()!=null)
NextAct = false;
}

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

14 мая 2014 г.

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

До сих пор мы разбирались с самыми простыми параметрами launchMode: standard и singleTop. Теперь двинемся дальше и будем разбирать параметр singleTask. Если уже забыли что это такое, то вспомнить можно тут.

И так, как я уже говорил, в приложении AP0003 Активность C имеет launchMode=”singleTask”.

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

ST0001

ST0002

ST0003

Ну и логи для порядку

ST0004

Тут все стандартно и обычно

И в Активности С введем свой текст, чтобы ее можно было однозначно отличить

ST0005

Замечаем что сейчас в нашей задаче 12 три активности A-B-C.

Теперь далее запускаем активности D, A, B

ST0006

ST0007

ST0008

Замечаем, что сейчас в нашей задаче 12 ШЕСТЬ Активностей: A-B-C-D-A-B. То есть у нас по два разных экземпляра Активностей А и B.

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

ST0009

Сейчас у нас на вершине Активность В.

Теперь нажмем кнопку Start Activity C и посмотрим что будет.

ST0010

Здесь есть много чего посмотреть. Во первых, обращаем внимание, что мы видим введенный нами текст. Это означает, что система перенаправила нас на уже существующую Активность С, а не создала новую. А так же что Активностей в нашей задаче 12 сейчас ТРИ, а до этого было ШЕСТЬ. То есть все Активности, которые были запущены после запуска Активности С были уничтожены. Что видно из логов.

ST0011

До запуска Активности С наш стек имел вид A-B-C-D-A-B, а после запуска A-B-C, таким образом последние три Активности D-A-B были уничтожены. То есть, все Активности которые были в стеке выше Активности С были уничтожены. Об этом кстати в официальной документации в альма-матер ни слова. Практика критерий истины. Об этом упоминается, так же, в этой статье. Видимо человек сам проделал эти же эксперименты.

Из логов, так же видно, в какой последовательности уничтожаются Активности находящиеся выше Активности С.

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

Теперь нажмем три раза кнопку ОБРАТНО и выйдем из приложения AP0003.

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

ST0012

Запоминаем что в задаче 16 сейчас у нас одна Активность А из приложения AP0004. Так же нажмем Info и посмотрим логи

ST0013

Далее жмем кнопку Start C AP0003

ST0014

Здесь опять много интересного. Активность С была создана в новой задаче 17 и она единственная Активность в этой задаче.

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

ST0015

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

ST0016

В этих логах тоже много инфы для медитации и разбора. Это лог с начала запуска приложения AP0004 (первые четыре строки), затем нажатие кнопки Info в нем (строки 5-12), затем запуск Активности С в приложении АР0003 и нажатие кнопки Info в Активности С из которого видно, что сейчас у нас есть ДВЕ задачи в каждой из которых по одной Активности. Задача 16 содержит Активность А из приложения АР0004, а задача 17 содержит Активность С из приложения АР0003. Так же видно, что каждая Активность работает в процессе своего приложения.

Теперь введем текст в Активности С

ST0017

И нажмем Start Activity D

ST0018

Теперь видим что в задаче 17 у нас уже две Активности С и D, а стек задачи 17 имеет вид C-D. Нажмем кнопку Info чтобы убедится в этом.

ST0019

И так, задача 16 у нас содержит всего одну Активность А из приложения АР0004, а задача 17 содержит ДВЕ Активности C и D из приложения AP0003.

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

ST0020

Теперь в задаче 17 ТРИ Активности и стек имеет вид C-D-B. Причем Активности С и D принадлежат приложению AP0003, а Активность В приложению АР0004. Посмотрим логи

ST0021

Из логов видно что Активность В принадлежит задаче 17, но работает в процессе приложения АР0004.

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

ST0022

Собственно это и подтверждает что уже сказано было выше. Задача 17 содержит ТРИ Активности C-D-B.

Теперь нажмем кнопку HOME и перейдем в приложение AP0004

ST0023

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

Ну и логи о наших последних действиях

ST0024

Видим что Активность В в задаче 17 была остановлена, а Активность А в задаче 16 получила фокус.

Теперь нажимаем кнопку Start C AP0003

ST0025

Как видим получила фокус наша Активность С из задачи 17. В ней есть введенный нами текст. Но вот счетчик опять сбился. Это если будет время пофиксю. Сейчас в задаче 17, по логике вещей должна быть одна Активность С, так как две другие D и В должны были быть уничтожены.

ST0026

Логи это подтверждают. Для пущей надежности нажмем Info

ST0027

Собственно вывод Info это подтвердил и выдал правильную информацию о количестве Активностей в каждой задаче.

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

ST0023

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

ST0028

Как видим после уничтожения Активности С задача 17 так же прекратила свое существование и у нас теперь только одна задача 16 с одной Активностью А.

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

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

ST0029

Оно запустилось в новой задаче. Это уже все известно и понятно. Далее запустим Активности В и С.

ST0030

ST0031

Видим что Активности В и С были запущены в задаче 18 и сейчас в ней три Активности. Стек задачи 18 имеет вид A-B-C. А стек задачи 16 имеет вид A. Нажмем Info чтобы убедится в этом.

ST0032

Теперь в Активности С введем текст, дабы отличать ее.

ST0033

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

ST0023

И в нем нажмем кнопку Start C AP0003

ST0033

Увидим нашу Активность С и текст введенный нами в ней. А теперь еще один интересный момент!

Нажмем кнопку ОБРАТНО, и как казалось бы должны вернуться в Активность А приложения АР0004, но это не так. Так как в альма-матер описано другое поведение. Жмем кнопку ОБРАТНО и видим

ST0034

То есть произошло переключение на стек задачи 18. Теперь в задаче 18 ДВЕ Активности А и В. Жмем еще раз кнопку ОБРАТНО.

ST0035

Мы вернулись в Активность А приложения АР003. Теперь еще раз жмем кнопку ОБРАТНО

ST0036

И только сейчас мы вернулись в Активность А приложения АР0004 задача 16.

Собственно на опыте убедились в том что нарисовано на этой диаграмме

diagram_backstack_singletask_multiactivity

Если забыли что за диаграмма, то стоит еще раз прочитать статейку из альма-матер.

На этом про singleTask вроде все.