Что происходит при запуске приложения из лаунчера в Android
Что проверяют
Знаете ли вы холодный старт целиком, а не только onCreate. Это любимый вопрос для мидла и выше: по ответу видно, понимаете ли вы, в каком месте цепочки вы сами замедляете приложение.
Как отвечать
Лаунчер это обычное приложение. По тапу он отправляет неявный Intent с действием ACTION_MAIN и категорией CATEGORY_LAUNCHER, дальше работает системный сервис управления активностями.
Если процесса нет, система просит zygote форкнуть новый: у zygote уже прогреты классы фреймворка и ресурсы, поэтому старт дешевле полной инициализации. В новом процессе поднимается главный Looper, приложение привязывается к системному сервису, загружаются код и ресурсы.
Дальше порядок, который и просят назвать:
- создаётся объект
Application, ему вызываютattachBaseContext; - инициализируются все
ContentProviderиз манифеста; - вызывается
Application.onCreate(); - создаётся стартовая Activity:
onCreate,onStart,onResume; - окно добавляется в WindowManager, и только после этого рисуется первый кадр.
Провайдеры раньше Application.onCreate() это не мелочь: через них себя инициализируют многие библиотеки, и вы платите временем старта, ничего не вызывая руками.
Если процесс жив и задача существует, тап по иконке просто выносит задачу на передний план, Activity заново не создаётся. Стоит добавить про разницу холодного, тёплого и горячего старта и про то, что метрику запуска считают до первого отрисованного кадра.
Где спотыкаются
Начинают сразу с onCreate активности и не упоминают процесс, Application и провайдеры. Между тапом и onCreate помещается вся инициализация, и именно там обычно живут лишние секунды.
Второе: считают, что после onResume пользователь уже видит экран. Кадр рисуется позже, а взаимодействие начинается с onWindowFocusChanged; тяжёлая работа в onCreate растягивает пустой стартовый экран.
Третье: кладут логику запуска в onCreate стартовой Activity и удивляются, что при возврате по иконке она не выполняется. Задача поднимается из истории, экран уже создан, и нужен либо код в onStart, либо наблюдение за жизненным циклом процесса.