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;
}

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

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

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