Android launchMode являются важным инструментом и каждый разработчик должен иметь представление какие бывают типы и для чего они используются. Многие разработчики используют только один – самый распространенный тип singleTask – он исключает дублирование ваших activity (экранов). Однако существуют еще несколько типов, которые могут вам пригодится, например, при обработке deeplinks. Давайте рассмотрим другие типы на примерах. В этой статье довольно подробно описана работа launchMode. В данной статье упор сделан на визуализацию поведения стека activity при выборе того или иного launchMode.
Для объяснения будут использоваться следующие обозначения:
Зелёный прямоугольник – только что созданная Activity. Жёлтый – уже имеющийся в стеке instance Activity, но у которого вызывается метод onNewIntent()
1 — launchMode = “singleTop” in Activity D
1. Если Activity D была определена с флагом singleTop в AndroidManifest.xml. То Activity D не будет создана, а будет использоваться тот же instance (экземпляр) и будте вызван метод onNewIntent() у Activity D.
2.Если Activity D определена с launchMode типа singleTop в AndroidManifest.xml то если такой Activity не было в стеке – то новая Activity D будет создана.
3. Activity D использует существующий instance (экземпляр) с вызовом метода onNewIntent() только в том случае если она уже на вершине стека. Если Activity Dнаходится не на вершине стека – то новый instance Activity D будет создан
2 — launchMode = “singleTask” in Activity C
Activity D уничтожена из стека и onNewIntent() метод был вызван у Activity C.
Activity C создана и добавлена в стек
3 — launchMode = “singleInstance” in Activity E
Activity A,B,C,D находятся в одном Task. E будет создана в другом Task.
Activity E создана в новом Task. Что если мы хотим запустить Activity F из Activity D ? Результат такой:
E все еще находится в другом Task. a,b,c,d и f находятся в другом Task
Activity E находится в другом Task. И если мы стартуем Activity E еще раз, то метод onNewIntent() будет вызван вместо создания новой activity.
4 — launchMode = “standard” in Activity B
Создается новая activity B несмотря на то, что она уже находится в стеке.
Надеюсь, теперь стало ясно как ведет себя Activity при старте, используя тот или иной тип launchMode.