Вопросы на собеседовании: Android-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: Android-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Четыре основных компонента Android-приложения: Activity, Service, BroadcastReceiver и ContentProvider.
- Activity показывает пользователю интерактивный экран.
- Service представляет работу без собственного пользовательского интерфейса с учётом ограничений Android на фоновое выполнение.
- BroadcastReceiver реагирует на широковещательные сообщения, а ContentProvider предоставляет структурированные данные через стандартный интерфейс.
Зачем это спрашивают: Интервьюер проверяет, знаете ли вы основные строительные блоки платформы и назначение каждого из них.
Activity представляет собой компонент Android, который предоставляет окно для отдельного пользовательского взаимодействия.
- Обычно он отвечает за один экран или одну крупную точку входа в приложение.
- Система создаёт, приостанавливает, останавливает и может уничтожить Activity при навигации пользователя или изменении условий на устройстве.
- Объявление в манифесте позволяет Android найти и запустить Activity.
Зачем это спрашивают: Сильный ответ рассматривает Activity как управляемый системой компонент, а не просто Kotlin-класс для экрана.
При открытии новой Activity обычно вызываются onCreate, onStart и onResume, а при закрытии onPause, onStop и onDestroy.
- onCreate выполняет первоначальную настройку текущего экземпляра Activity.
- onStart делает Activity видимой, а onResume переводит её в состояние активного взаимодействия с пользователем.
- onPause и onStop выводят Activity из активного использования, после чего onDestroy выполняет финальную очистку экземпляра.
Зачем это спрашивают: Интервьюер оценивает, понимаете ли вы базовый порядок жизненного цикла и состояние каждого перехода.
В onCreate следует создать начальный UI Activity и выполнить настройку нового экземпляра.
- В нём вызывают super.onCreate, чтобы фреймворк восстановил и инициализировал собственное состояние.
- Экран на View обычно загружает или устанавливает layout, а экран на Compose чаще всего вызывает setContent.
- Здесь также можно подключить держатели состояния и прочитать исходные данные Intent, не предполагая, что callback вызывается лишь один раз за жизнь процесса приложения.
Зачем это спрашивают: Хороший ответ определяет первоначальную настройку и учитывает, что экземпляр Activity может быть пересоздан.
onStart означает, что Activity видима, а onResume, что она находится на переднем плане и готова к взаимодействию с пользователем.
- Activity может быть запущена, но ещё не возобновлена, если другое окно частично закрывает её.
- Наблюдатели, связанные с UI, можно активировать в соответствии с нужным им состоянием жизненного цикла.
- onResume нельзя считать методом одноразовой инициализации, поскольку он может вызываться многократно.
Зачем это спрашивают: Интервьюер проверяет, отличаете ли вы видимость от активного взаимодействия на переднем плане.
onPause сообщает о потере фокуса переднего плана, а onStop означает, что Activity больше не видна.
- onPause должен завершаться быстро, потому что следующая Activity может ожидать перехода в состояние resumed.
- onStop подходит для прекращения работы, которая нужна только пока экран остаётся видимым.
- Ни один из этих методов не гарантирует последующий вызов onDestroy, поскольку после остановки Activity процесс может быть завершён.
Зачем это спрашивают: Сильный ответ связывает каждый callback с видимостью и не полагается на onDestroy для обязательного сохранения данных.
Android может пересоздать Activity, чтобы подобрать ресурсы и layout для новой конфигурации устройства.
- Поворот, смена локали, размера экрана или режима темы могут привести к другой конфигурации.
- По умолчанию старый экземпляр Activity уничтожается, а вместо него создаётся новый.
- Долгоживущие данные экрана следует хранить вне временных объектов View, обычно во ViewModel, а небольшое восстанавливаемое состояние UI можно сохранять через saved state.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы пересоздание как нормальное поведение платформы и знаете ли подходящее место для состояния экрана.
savedInstanceState хранит небольшой сериализуемый снимок, который помогает восстановить временное состояние UI после пересоздания Activity или Fragment.
- При наличии сохранённого состояния фреймворк передаёт Bundle новому экземпляру компонента.
- Значения должны быть небольшими, поскольку состояние передаётся через системный механизм с ограничением размера.
- Этот механизм дополняет, а не заменяет постоянное хранилище или ViewModel с более полными данными экрана.
Зачем это спрашивают: Хороший ответ объясняет назначение восстановления и ограничения Bundle как универсального хранилища данных.
Fragment представляет собой переиспользуемую часть UI с собственным жизненным циклом, размещённую внутри Activity.
- У него есть собственный жизненный цикл, но он зависит от хоста и FragmentManager.
- Несколько фрагментов могут составлять одну Activity или представлять отдельные экраны навигации внутри неё.
- Fragment может несколько раз создавать и уничтожать свой View, пока сам объект Fragment остаётся жив.
Зачем это спрашивают: Интервьюер проверяет понимание переиспользования Fragment и его зависимости от Activity-хоста.
У Fragment есть отдельный жизненный цикл View, потому что его UI может быть уничтожен раньше, чем удалён сам экземпляр Fragment.
- onCreate и onDestroy описывают время жизни объекта Fragment.
- Методы от onCreateView до onDestroyView описывают время жизни текущей иерархии View.
- View Binding и наблюдатели UI следует очищать или привязывать к жизненному циклу View, чтобы не удерживать уже уничтоженный View.
Зачем это спрашивают: Сильный ответ объясняет два времени жизни и их последствия для ссылок на View.
FragmentManager управляет фрагментами, а FragmentTransaction объединяет операции, которые их изменяют.
- Транзакция может добавить, заменить, удалить, показать или скрыть Fragment в контейнере.
- commit передаёт сгруппированные изменения FragmentManager для применения.
- Добавление транзакции в back stack позволяет действию Back обратить её, а не сразу потерять историю навигации.
Зачем это спрашивают: Интервьюер проверяет, знаете ли вы, как размещаются и изменяются фрагменты и как они при необходимости попадают в историю навигации.
Явный Intent указывает конкретный запускаемый компонент, а неявный описывает действие, которое может обработать подходящий компонент.
- Явные Intents часто используют для перехода к известной Activity внутри приложения.
- Неявный Intent может запрашивать открытие веб-страницы, отправку текста или другую доступную возможность.
- Android сопоставляет неявный Intent с зарегистрированными intent filters, и подходящих приложений может не быть, быть одно или несколько.
Зачем это спрашивают: Хороший ответ отличает прямой выбор компонента от системного поиска по требуемой возможности.
Intent может содержать действие, данные, категории, extras, флаги и явно указанный компонент.
- Action описывает требуемую операцию, например просмотр или отправку данных.
- URI и MIME-тип описывают целевой контент.
- Extras хранят небольшие типизированные значения в Bundle, а флаги влияют на запуск компонента или поведение task.
Зачем это спрашивают: Интервьюер оценивает, понимаете ли вы Intent как структурированное сообщение, а не только как вызов навигации.
Intent filter объявляет, какие неявные Intents готов принимать компонент Android.
- Он может сопоставлять action, категории и характеристики данных Intent.
- Где это поддерживается, фильтры обычно объявляют в манифесте для Activity, Service и BroadcastReceiver.
- Фильтр делает возможность компонента доступной другим вызывающим сторонам, но сам по себе не проверяет надёжность входных данных.
Зачем это спрашивают: Сильный ответ охватывает сопоставление и учитывает, что доступность компонента не заменяет проверку входных данных.
Task представляет собой видимую пользователю последовательность Activity, организованных в back stack.
- Запуск Activity обычно помещает новую запись Activity поверх текущего task.
- Нажатие Back удаляет верхний экран и показывает предыдущий.
- Launch modes и флаги Intent могут изменить стандартное поведение, поэтому их следует применять с ясным пониманием семантики task.
Зачем это спрашивают: Интервьюер проверяет, можете ли вы объяснить историю навигации Android шире отдельных вызовов Activity.
Jetpack Navigation предоставляет структурированный способ описывать экраны и переходить между ними с сохранением состояния навигации.
- Navigation graph объявляет destinations, actions и аргументы.
- NavController выполняет переходы и управляет back stack экранов.
- Интеграции поддерживают Fragment, Compose, deep links и стандартные элементы UI, например app bar.
Зачем это спрашивают: Хороший ответ называет ответственность графа, контроллера и back stack, а не сводит Navigation к библиотеке маршрутов.
Deep link представляет собой URI или запрос, который открывает конкретный экран внутри приложения.
- Он может открыть приложение из браузера, уведомления, другого приложения или через Android App Link.
- Экран должен объявить или зарегистрировать подходящий шаблон URI и получить определённые аргументы.
- Навигация должна построить осмысленный back stack, чтобы после внешнего входа действие Back работало предсказуемо.
Зачем это спрашивают: Интервьюер проверяет понимание и сопоставления экрана, и истории навигации для внешних точек входа.
View является базовым элементом UI, а ViewGroup представляет собой View, который содержит и размещает дочерние Views.
- TextView, ImageView и Button являются отдельными типами View.
- LinearLayout, FrameLayout и ConstraintLayout являются типами ViewGroup.
- ViewGroup участвует в измерении и размещении дочерних элементов согласно собственным правилам LayoutParams.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы иерархию, лежащую в основе Android-интерфейсов на XML.
Система View измеряет требуемые размеры, назначает позиции, а затем отрисовывает иерархию.
- На этапе measure ограничения родителя помогают каждому View определить измеренную ширину и высоту.
- На этапе layout родитель задаёт границы каждого дочернего элемента.
- На этапе draw Views рисуют фон, содержимое и дочерние Views на поверхности вывода.
Зачем это спрашивают: Сильный ответ показывает базовое понимание того, как иерархия View превращается в пиксели на экране.
Эти ViewGroups используют разные правила размещения дочерних элементов.
- LinearLayout располагает дочерние элементы в одной горизонтальной или вертикальной последовательности.
- FrameLayout накладывает дочерние элементы в одной области и часто служит простым контейнером.
- ConstraintLayout позиционирует Views через связи с родителем и другими Views, позволяя создавать сложные плоские layouts.
Зачем это спрашивают: Интервьюер оценивает, можете ли вы выбирать распространённый XML-контейнер по его базовой модели размещения.
Закрытые вопросы
- 21
Что означают dp, sp и px в Android UI?
- 22
Что означает инфлейт XML layout?
ui - 23
Что такое View Binding?
ui - 24
Какую задачу решает RecyclerView?
ui - 25
Что делает RecyclerView.Adapter?
ui - 26
Что такое паттерн ViewHolder в RecyclerView?
ui - 27
Какова роль RecyclerView.LayoutManager?
ui - 28
Что такое Service в Android?
android-components - 29
Чем started Service отличается от bound Service?
android-components - 30
Что такое foreground Service?
android-components - 31
Что такое BroadcastReceiver?
android-components - 32
Как ContentProvider и ContentResolver работают вместе?
- 33
Какая информация указывается в AndroidManifest.xml?
- 34
Почему Android хранит строки, размеры, цвета и изображения в ресурсах?
- 35
Как работают квалификаторы ресурсов в Android?
- 36
Что такое сгенерированный класс R?
- 37
Чем обычные разрешения Android отличаются от опасных?
permissions - 38
Как выглядит базовый процесс работы с опасным разрешением?
permissions - 39
Что такое Context в Android?
android-components - 40
Чем Activity Context отличается от Application Context?
android-components - 41
Что предоставляет Room в Android-приложении?
room - 42
Какую проблему решает Hilt в Android-разработке?
dependency-injection - 43
Чем val отличается от var в Kotlin?
kotlin - 44
Как Kotlin представляет nullable и non-null типы?
fundamentalskotlin - 45
Что делают операторы safe call, Elvis и non-null assertion в Kotlin?
fundamentalskotlin - 46
Что предоставляет data class в Kotlin?
kotlin - 47
Что такое composable-функция в Jetpack Compose?
composejetpack - 48
Что означают suspend-функции и корутины в Kotlin?
coroutineskotlin - 49
Зачем в Android используют coroutine scopes, например lifecycleScope и viewModelScope?
lifecyclearchitecture-componentscoroutines - 50
Чем UI на Jetpack Compose отличается от XML layouts с Views?
composeuijetpack - 51
Каков ваш практический план для задачи «постройте экран просмотра и редактирования профиля»?
- 52
Каков ваш практический план для задачи «реализуйте форму регистрации в Compose»?
formscompose - 53
Каков ваш практический план для задачи «исправьте сбор Flow после уничтожения view Fragment»?
uiandroid-components - 54
Каков ваш практический план для задачи «безопасно используйте View Binding во Fragment»?
uiandroid-components - 55
Каков ваш практический план для задачи «предотвратите загрузку при каждом onStart»?
- 56
Каков ваш практический план для задачи «исправьте повторное открытие диалога после поворота»?
- 57
Каков ваш практический план для задачи «добавьте pull-to-refresh без скрытия контента»?
- 58
Каков ваш практический план для задачи «безопасно наблюдайте LiveData во Fragment»?
android-componentsarchitecture-components - 59
Каков ваш практический план для задачи «запустите одну загрузку Compose без повторов рекомпозиции»?
compose - 60
Каков ваш практический план для задачи «поддержите layout телефона и планшета»?
ui - 61
Каков ваш практический план для задачи «покажите список API в RecyclerView»?
uiapi - 62
Каков ваш практический план для задачи «прекратите обновление всех строк RecyclerView»?
ui - 63
Каков ваш практический план для задачи «обработайте нажатия строк вне адаптера»?
ui - 64
Каков ваш практический план для задачи «добавьте базовую пагинацию списка»?
pagination - 65
Каков ваш практический план для задачи «смоделируйте загрузку, пустоту, ошибку и контент»?
- 66
Каков ваш практический план для задачи «сохраните прокрутку RecyclerView после поворота»?
ui - 67
Каков ваш практический план для задачи «покажите заголовки и строки в одном RecyclerView»?
ui - 68
Каков ваш практический план для задачи «исправьте перенос флажков между переиспользованными строками»?
- 69
Каков ваш практический план для задачи «удалите строку после серверного запроса»?
- 70
Каков ваш практический план для задачи «сохраните фильтры после поворота»?
- 71
Каков ваш практический план для задачи «вызовите REST endpoint через Retrofit»?
restendpointsnetworking - 72
Каков ваш практический план для задачи «загрузите данные Retrofit из ViewModel»?
architecture-componentsnetworking - 73
Каков ваш практический план для задачи «обработайте ответы 400, 401, 404 и 500»?
- 74
Каков ваш практический план для задачи «отладьте ошибку разбора JSON»?
- 75
Каков ваш практический план для задачи «обработайте уход с экрана во время запроса»?
- 76
Каков ваш практический план для задачи «добавьте auth-токен через OkHttp»?
tokensnetworking - 77
Каков ваш практический план для задачи «различите offline, тайм-аут и ошибку сервера»?
resilience - 78
Каков ваш практический план для задачи «остановите повторные POST-запросы»?
- 79
Каков ваш практический план для задачи «реализуйте API-поиск с debounce»?
debounceapi - 80
Каков ваш практический план для задачи «загрузите файл с повтором»?
resilience - 81
Каков ваш практический план для задачи «перейдите из списка в детали»?
- 82
Каков ваш практический план для задачи «не возвращайтесь на login по Back»?
- 83
Каков ваш практический план для задачи «безопасно передайте ID на экран»?
- 84
Каков ваш практический план для задачи «откройте детали по deep link»?
navigation - 85
Каков ваш практический план для задачи «выберите и покажите изображение»?
- 86
Каков ваш практический план для задачи «сохраните состояние вкладок нижней навигации»?
- 87
Каков ваш практический план для задачи «предотвратите двойную навигацию»?
- 88
Каков ваш практический план для задачи «найдите падение запуска по stack trace»?
debugging - 89
Каков ваш практический план для задачи «исследуйте Kotlin NullPointerException»?
kotlin - 90
Каков ваш практический план для задачи «исследуйте ANR при открытии экрана»?
anr - 91
Каков ваш практический план для задачи «исправьте NetworkOnMainThreadException»?
- 92
Каков ваш практический план для задачи «исправьте утечку view Fragment»?
uiandroid-components - 93
Каков ваш практический план для задачи «запросите разрешение камеры и обработайте отказ»?
permissions - 94
Каков ваш практический план для задачи «отладьте SecurityException для URI файла»?
- 95
Каков ваш практический план для задачи «исправьте IndexOutOfBoundsException в меняющемся списке»?
indexes - 96
Каков ваш практический план для задачи «исследуйте падение на конкретном устройстве»?
- 97
Каков ваш практический план для задачи «восстановите черновик после смерти процесса»?
concurrency - 98
Каков ваш практический план для задачи «запланируйте sync при появлении сети»?
- 99
Каков ваш практический план для задачи «создайте offline-заметку с поздней синхронизацией»?
- 100
Каков ваш практический план для задачи «исправьте загрузку, потерю правок и двойной переход после поворота»?