В какой момент экран активности становится видимым?
Что проверяют
Понимаете ли вы разницу между «видима» и «на переднем плане» и знаете ли, что строки документации не совпадают с моментом, когда пиксели реально появились на экране. Следом часто спрашивают про многооконный режим и про то, как измерить время до первого кадра.
Как отвечать
По контракту жизненного цикла:
onCreate(): активность создаётся, вызываетсяsetContentViewилиsetContentв Compose. Экрана ещё не видно;onStart(): по документации активность становится видимой пользователю. Этому соответствует состояниеLifecycle.State.STARTED, и именно к нему обычно привязывают сбор данных черезrepeatOnLifecycle(Lifecycle.State.STARTED);onResume(): активность выходит на передний план и получает ввод, состояниеRESUMED.
Дальше покажите, что знаете детали. При первом запуске окно активности добавляется в WindowManager уже после onResume(), а первый кадр рисуется на следующем проходе отрисовки. Поэтому ни в одном из этих колбэков нельзя считать, что пользователь уже видит экран. Надёжнее ориентироваться на onWindowFocusChanged(true) или ViewTreeObserver.OnPreDrawListener, а о полной готовности экрана сообщать системе через reportFullyDrawn(), это попадает в метрики запуска.
Два случая, где «видима» и «активна» расходятся:
- полупрозрачная активность или диалог-активность сверху: нижняя остаётся видимой, но уходит в
onPause(); - многооконный режим: начиная с Android 10 все видимые активности находятся в
RESUMED, а какая из них сейчас в фокусе, сообщаетonTopResumedActivityChanged().
Где спотыкаются
Отвечают «в onCreate(), мы же там задали разметку». В этот момент окна на экране ещё нет.
Считают, что после onPause() активность уже не видна, и останавливают там воспроизведение видео. В многооконном режиме пользователь продолжает смотреть на экран, поэтому такие вещи правильнее останавливать в onStop().
Запускают тяжёлую загрузку в onResume(), считая его моментом показа. Это задерживает первый кадр, а при каждом закрытии диалога поверх экрана запрос уходит заново.