Вопросы на собеседовании: Android
Учебник собран из вопросов, которые реально звучат на Android-собеседованиях — от «расскажите про жизненный цикл Activity» до «как найти лишние рекомпозиции в Compose». Каждый урок разбирает один-три вопроса по одной схеме: что на самом деле хочет услышать интервьюер, развёрнутый ответ с примерами кода на Kotlin, типичные ошибки кандидатов и короткая выжимка, которую можно произнести за полминуты.
Прогрессия идёт от junior к senior: сначала платформа и язык, затем корутины и архитектура, в конце — UI и производительность. Курс пригодится и тем, кто готовится к собеседованию, и тем, кто хочет систематизировать разрозненные знания об Android.
Курс «Вопросы на собеседовании: Android» состоит из 5 разделов и 15 уроков: Основы платформы и жизненный цикл, Kotlin на собеседовании, Корутины и асинхронность, Архитектура приложения и UI и производительность. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Основы платформы и жизненный цикл
- Жизненный цикл Activity: onCreate, onStart, onResume и обратно
Разбор классического вопроса Android-собеседования про жизненный цикл Activity: какие методы, в каком порядке, где регистрировать и освобождать ресурсы.
- Поворот экрана и жизненный цикл Fragment
Что происходит с Activity при повороте экрана, как сохранить состояние через Bundle и ViewModel, чем жизненный цикл Fragment отличается от Activity и что такое viewLifecycleOwner.
- Context, Intent и четыре компонента приложения
Что такое Context в Android и чем Application context отличается от Activity context, explicit и implicit Intent, PendingIntent и четыре компонента приложения — разбор для собеседования.
- Жизненный цикл Activity: onCreate, onStart, onResume и обратно
2 Kotlin на собеседовании
- val, var и настоящая неизменяемость. Extension-функции
Чем val отличается от immutable в Kotlin, почему List не гарантирует неизменяемость, что такое const val и почему extension-функции не переопределяются — разбор для собеседования.
- Null safety: ?., ?:, !!, lateinit и платформенные типы
Как устроена null safety в Kotlin: операторы ?. и ?:, безопасное приведение as?, lateinit против nullable, платформенные типы из Java и когда NPE всё-таки возможен.
- data class, sealed class и scope-функции
Что генерирует data class и какие у него ловушки, чем sealed class отличается от enum и абстрактного класса, чем различаются let, run, with, apply и also — вопросы Kotlin-собеседования.
- val, var и настоящая неизменяемость. Extension-функции
3 Корутины и асинхронность
- Зачем корутины вместо потоков и как работает suspend
Чем корутина отличается от потока, как suspend-функция освобождает поток, что такое Continuation и почему suspend сама по себе не означает выполнение в фоне.
- CoroutineScope, структурная конкурентность и Dispatchers
Что такое CoroutineScope и структурная конкурентность, чем viewModelScope лучше GlobalScope, разница launch и async, coroutineScope и supervisorScope, выбор Dispatchers в Android.
- Flow против LiveData, отмена и обработка ошибок
Чем Flow отличается от LiveData, зачем StateFlow и repeatOnLifecycle, как устроена кооперативная отмена корутин и почему try/catch вокруг launch не ловит исключения.
- Зачем корутины вместо потоков и как работает suspend
4 Архитектура приложения
- MVVM против MVI и роль ViewModel
Чем MVI отличается от MVVM, как ViewModel переживает поворот экрана и почему в ней нельзя хранить Context, зачем SavedStateHandle и как отдавать одноразовые события.
- Слои, репозиторий и единый источник истины
Зачем нужны слои data, domain и presentation, что должен и чего не должен делать Repository, что такое single source of truth и как отдавать результат через Result вместо исключений.
- Dependency Injection: Hilt, Dagger и тестируемость
Зачем нужен Dependency Injection в Android, чем Hilt отличается от Dagger и от Koin, что такое @Binds и @Provides, scope-аннотации и как DI делает код тестируемым.
- MVVM против MVI и роль ViewModel
5 UI и производительность
- Jetpack Compose против View: что спрашивают
Чем декларативный Compose отличается от императивной системы View, что такое state hoisting, remember и rememberSaveable, зачем LaunchedEffect и как совмещать Compose с XML.
- Рекомпозиция и её оптимизация
Что запускает рекомпозицию в Jetpack Compose, что такое стабильные и нестабильные типы, зачем derivedStateOf и отложенное чтение состояния, как ключи в LazyColumn влияют на производительность.
- RecyclerView и DiffUtil, утечки памяти и ANR
Как работает RecyclerView и зачем DiffUtil вместо notifyDataSetChanged, откуда берутся утечки памяти в Android и как их искать, что такое ANR и чем профилировать приложение.
- Jetpack Compose против View: что спрашивают