tgoop.com/dev_easy_notes/152
Last Update:
Осталась финальная тема, собрать воедино путь от момента нажатия на иконку приложения до появления первой Activity.
Все начинается с лаунчера. Лаунчер это самое первое приложение которое запускает система. Все что делает лаунчер выводит красивый список других приложений, которые получает из системного сервиса. Свой простенький лаунчер можно накидать за вечер, советую попробовать, так на практике потрогаете тему которую обсуждаем тут.
Перехватив нажатие на иконку приложения, мы говорим системе, что нужно запустить новую Activity. Раньше это делалось так: берем имя пакета приложения, из Context получаем нужный нам Intent для запуска первой Activity и запускаем будто это наша Activity. Сейчас так не делают, для запуска первой Activity из лаунчера нужно использовать специальный сервис LauncherApps. Сделано так потому что начиная с 8 Android изменились правила по работе с пользователями. В него мы передаем пакет приложения и координаты иконки на экране, которые нужны для показа красивой анимации старта приложения.
Как вы уже знаете у нас всегда работает связка Manager -> SystemService. Поэтому все вызовы методов LauncherApps отправляются в LauncherAppsService, который в основном занимаете проверкой разрешений, ищет от какого пользователя открылось приложение вот это все и дальше это все отправляется в волшебный класс ActivityStarter.
ActivityStarter это конечная точка запуская любой Activity, каждый раз когда вы запускаете Activity, причем неважно это ваша Activity или другого приложения все вызовы приходят в ActivityStarter. В ActivityStarter есть всего один метод execute, в котором и располагается вся логика. Работа с ActivityStarter чем-то напоминает работу с запросами при помощи OkHttp. Аналогично, большой билдер с настройками запроса и потом один метод который запрос исполняет.
В ActivityStarter располагается логика по обработке флагов и launchMode. Вот эти singleTop, singeTask и т.д все это рассчитывается в ActivityStarter и уже он решает какие Activity будут убраны, а какие добавлены. Помимо этого разруливает в какой Task будет добавлена Activity. ActivityStarter занимается лишь расчетом как должна быть запущена Activity, сам запуск Activity уже проводят другие сервисы об этом есть инфа в прошлом посте.
Дальше происходит проверка если ли активный процесс данного приложения. Ведь если он есть, это означает что приложение просто было свернуто и не нужно запускать новый процесс. Если же процесса нет, то через специальные волшебные статические функции из класса ZygoteProcess через метод startViaZygote мы подаем сигнал тому самому бесконечному циклу в ZygoteInit для запуска нового процесса и одновременно с этим показываем сплэш скрин.
Сплэш мы показываем начиная с Android 12, а в версиях до этого, показываем window background темы первой Activity. За показ старта приложения всегда отвечает StartingSurfaceController он же и запоминает как выглядит приложение при сворачивании, чтобы потом показать его в Recents. В момент когда вы сворачивали приложение система запомнила как выглядел последний экран, поэтому при разворачивании приложения система рисует анимацию основываясь на этой информации.
На этом все, я наконец-то закончил эту серию. Я надеюсь у вас сложилась более менее общая картина. Подвести итог можно такой, что в коде Android много интересных концепций которые можно использовать в работе. Знать все названия классов и т.д нет никакого смысла, потому как все постоянно меняется. Скорее всего со следующим релизом, то что я описал тут будет уже не актуально.
BY Dev Easy Notes
Share with your friend now:
tgoop.com/dev_easy_notes/152