Какая навигация используется в Android проекте
Что проверяют
Какой навигацией живёт ваш проект и понимаете ли вы её цену. Вопрос звучит анкетно, но ведёт к архитектуре: кто принимает решение о переходе, как устроен бэкстек и что происходит после смерти процесса. Следом обычно спрашивают про передачу данных между экранами и про возврат результата назад.
Как отвечать
Назовите конкретный вариант своего проекта и объясните выбор:
- одна Activity плюс фрагменты и Jetpack Navigation: граф в XML или на Kotlin DSL,
NavHostFragment, переходы черезNavController, аргументы через Safe Args, управление стеком черезpopUpTo,popUpToInclusiveиlaunchSingleTop; - Compose:
NavHostиcomposable, а с версии Navigation 2.8 маршруты типобезопасные, то есть сериализуемые классы вместо строк с подстановкой. Строковые маршруты остались в старом коде и ломаются от опечатки; - свой роутер: Cicerone или самописный слой поверх
FragmentManager. Частый выбор многомодульных проектов, где граф в XML не видит классы соседних модулей; - несколько Activity: живёт в легаси и там, где экран запускают снаружи интентом.
Обязательно скажите про возврат результата: savedStateHandle у previousBackStackEntry либо Fragment Result API, но не прямая ссылка на предыдущий экран. Про диплинки: описанный в графе deepLink разворачивает цепочку экранов целиком, тот же механизм используется для перехода из пуш-уведомления. Про предиктивный жест «назад», который на свежих версиях Android уже не опция.
Сильный ответ добавляет, что решение о переходе не место ViewModel: она отдаёт событие, а вызывает навигацию фрагмент или composable, у которого есть хост.
Где спотыкаются
Держат NavController в ViewModel или в статическом поле. Он привязан к жизненному циклу хоста, и после поворота экрана вы навигируете по мёртвому объекту.
Ловят два одинаковых экрана от быстрого двойного нажатия. Лечится launchSingleTop или проверкой текущего назначения, но вспоминают об этом обычно уже на проде.
Передают в аргументах тяжёлые объекты. Аргументы едут через Bundle, а он упирается в лимит транзакции Binder около мегабайта на процесс. Передавать надо идентификатор, а данные тянуть из репозитория.