Какие библиотеки и средства используются для реализации навигации в Android приложениях
Что проверяют
Знаете ли вы, чем сегодня делают навигацию на Android, и понимаете ли, что происходит под обёрткой: back stack, жизненный цикл фрагментов, восстановление после смерти процесса. Следом обычно просят показать, как передать аргументы между экранами и как очистить стек после авторизации.
Как отвечать
Разложите ответ по уровням:
IntentиActivity: базовый механизм платформы. Явные интенты открывают свои экраны, неявные чужие приложения, результат возвращается через Activity Result API (registerForActivityResult), аstartActivityForResultустарел;FragmentManager: транзакцииreplaceиadd,addToBackStack. Напрямую его трогают редко, но на нём стоят все обёртки;- Navigation Component:
NavHost,NavController, граф в XML или Kotlin DSL, плагин Safe Args для типобезопасных аргументов, deep links,popUpToсinclusiveдля очистки стека; - Navigation Compose: тот же
NavControllerдля Compose. Начиная с версии 2.8 маршруты описываются классами с@Serializable, а не строками с параметрами; - Navigation 3: новая библиотека для Compose, где back stack это обычный список ключей, которым управляет ваш код;
- сторонние: Decompose и Voyager, особенно в Kotlin Multiplatform, и Cicerone, который встречается в старых проектах на фрагментах.
Покажите архитектурное понимание: один Activity на приложение и навигация между фрагментами или composable-экранами, аргументы экран получает через SavedStateHandle во ViewModel, а кнопка «Назад» обрабатывается через OnBackPressedDispatcher, потому что onBackPressed устарел с приходом predictive back.
Где спотыкаются
Передают в аргументах целые объекты. Bundle идёт через Binder, и при сохранении состояния большой объект даёт TransactionTooLargeException. Передавать нужно идентификатор, а данные брать из репозитория.
Не защищаются от двойного нажатия. Второй navigate с уже покинутого экрана падает с IllegalArgumentException, потому что текущий пункт графа сменился.
Держат ссылку на binding фрагмента после onDestroyView. Фрагмент в back stack жив, а его View уже нет, отсюда утечка. Ссылку обнуляют в onDestroyView.