Skip to content

Вопросы на собеседовании: Android-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.

Смотреть пример резюме: Android-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

components

Четыре основных компонента Android-приложения: Activity, Service, BroadcastReceiver и ContentProvider.

  • Activity показывает пользователю интерактивный экран.
  • Service представляет работу без собственного пользовательского интерфейса с учётом ограничений Android на фоновое выполнение.
  • BroadcastReceiver реагирует на широковещательные сообщения, а ContentProvider предоставляет структурированные данные через стандартный интерфейс.

Зачем это спрашивают: Интервьюер проверяет, знаете ли вы основные строительные блоки платформы и назначение каждого из них.

android-components

Activity представляет собой компонент Android, который предоставляет окно для отдельного пользовательского взаимодействия.

  • Обычно он отвечает за один экран или одну крупную точку входа в приложение.
  • Система создаёт, приостанавливает, останавливает и может уничтожить Activity при навигации пользователя или изменении условий на устройстве.
  • Объявление в манифесте позволяет Android найти и запустить Activity.

Зачем это спрашивают: Сильный ответ рассматривает Activity как управляемый системой компонент, а не просто Kotlin-класс для экрана.

android-componentslifecyclecallbacks

При открытии новой Activity обычно вызываются onCreate, onStart и onResume, а при закрытии onPause, onStop и onDestroy.

  • onCreate выполняет первоначальную настройку текущего экземпляра Activity.
  • onStart делает Activity видимой, а onResume переводит её в состояние активного взаимодействия с пользователем.
  • onPause и onStop выводят Activity из активного использования, после чего onDestroy выполняет финальную очистку экземпляра.

Зачем это спрашивают: Интервьюер оценивает, понимаете ли вы базовый порядок жизненного цикла и состояние каждого перехода.

android-componentscallbacks

В onCreate следует создать начальный UI Activity и выполнить настройку нового экземпляра.

  • В нём вызывают super.onCreate, чтобы фреймворк восстановил и инициализировал собственное состояние.
  • Экран на View обычно загружает или устанавливает layout, а экран на Compose чаще всего вызывает setContent.
  • Здесь также можно подключить держатели состояния и прочитать исходные данные Intent, не предполагая, что callback вызывается лишь один раз за жизнь процесса приложения.

Зачем это спрашивают: Хороший ответ определяет первоначальную настройку и учитывает, что экземпляр Activity может быть пересоздан.

android-componentslifecycle

onStart означает, что Activity видима, а onResume, что она находится на переднем плане и готова к взаимодействию с пользователем.

  • Activity может быть запущена, но ещё не возобновлена, если другое окно частично закрывает её.
  • Наблюдатели, связанные с UI, можно активировать в соответствии с нужным им состоянием жизненного цикла.
  • onResume нельзя считать методом одноразовой инициализации, поскольку он может вызываться многократно.

Зачем это спрашивают: Интервьюер проверяет, отличаете ли вы видимость от активного взаимодействия на переднем плане.

android-componentslifecycle

onPause сообщает о потере фокуса переднего плана, а onStop означает, что Activity больше не видна.

  • onPause должен завершаться быстро, потому что следующая Activity может ожидать перехода в состояние resumed.
  • onStop подходит для прекращения работы, которая нужна только пока экран остаётся видимым.
  • Ни один из этих методов не гарантирует последующий вызов onDestroy, поскольку после остановки Activity процесс может быть завершён.

Зачем это спрашивают: Сильный ответ связывает каждый callback с видимостью и не полагается на onDestroy для обязательного сохранения данных.

android-componentslifecycleconfig

Android может пересоздать Activity, чтобы подобрать ресурсы и layout для новой конфигурации устройства.

  • Поворот, смена локали, размера экрана или режима темы могут привести к другой конфигурации.
  • По умолчанию старый экземпляр Activity уничтожается, а вместо него создаётся новый.
  • Долгоживущие данные экрана следует хранить вне временных объектов View, обычно во ViewModel, а небольшое восстанавливаемое состояние UI можно сохранять через saved state.

Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы пересоздание как нормальное поведение платформы и знаете ли подходящее место для состояния экрана.

savedInstanceState хранит небольшой сериализуемый снимок, который помогает восстановить временное состояние UI после пересоздания Activity или Fragment.

  • При наличии сохранённого состояния фреймворк передаёт Bundle новому экземпляру компонента.
  • Значения должны быть небольшими, поскольку состояние передаётся через системный механизм с ограничением размера.
  • Этот механизм дополняет, а не заменяет постоянное хранилище или ViewModel с более полными данными экрана.

Зачем это спрашивают: Хороший ответ объясняет назначение восстановления и ограничения Bundle как универсального хранилища данных.

android-components

Fragment представляет собой переиспользуемую часть UI с собственным жизненным циклом, размещённую внутри Activity.

  • У него есть собственный жизненный цикл, но он зависит от хоста и FragmentManager.
  • Несколько фрагментов могут составлять одну Activity или представлять отдельные экраны навигации внутри неё.
  • Fragment может несколько раз создавать и уничтожать свой View, пока сам объект Fragment остаётся жив.

Зачем это спрашивают: Интервьюер проверяет понимание переиспользования Fragment и его зависимости от Activity-хоста.

android-componentslifecycleui

У Fragment есть отдельный жизненный цикл View, потому что его UI может быть уничтожен раньше, чем удалён сам экземпляр Fragment.

  • onCreate и onDestroy описывают время жизни объекта Fragment.
  • Методы от onCreateView до onDestroyView описывают время жизни текущей иерархии View.
  • View Binding и наблюдатели UI следует очищать или привязывать к жизненному циклу View, чтобы не удерживать уже уничтоженный View.

Зачем это спрашивают: Сильный ответ объясняет два времени жизни и их последствия для ссылок на View.

android-components

FragmentManager управляет фрагментами, а FragmentTransaction объединяет операции, которые их изменяют.

  • Транзакция может добавить, заменить, удалить, показать или скрыть Fragment в контейнере.
  • commit передаёт сгруппированные изменения FragmentManager для применения.
  • Добавление транзакции в back stack позволяет действию Back обратить её, а не сразу потерять историю навигации.

Зачем это спрашивают: Интервьюер проверяет, знаете ли вы, как размещаются и изменяются фрагменты и как они при необходимости попадают в историю навигации.

android-components

Явный Intent указывает конкретный запускаемый компонент, а неявный описывает действие, которое может обработать подходящий компонент.

  • Явные Intents часто используют для перехода к известной Activity внутри приложения.
  • Неявный Intent может запрашивать открытие веб-страницы, отправку текста или другую доступную возможность.
  • Android сопоставляет неявный Intent с зарегистрированными intent filters, и подходящих приложений может не быть, быть одно или несколько.

Зачем это спрашивают: Хороший ответ отличает прямой выбор компонента от системного поиска по требуемой возможности.

android-components

Intent может содержать действие, данные, категории, extras, флаги и явно указанный компонент.

  • Action описывает требуемую операцию, например просмотр или отправку данных.
  • URI и MIME-тип описывают целевой контент.
  • Extras хранят небольшие типизированные значения в Bundle, а флаги влияют на запуск компонента или поведение task.

Зачем это спрашивают: Интервьюер оценивает, понимаете ли вы Intent как структурированное сообщение, а не только как вызов навигации.

android-components

Intent filter объявляет, какие неявные Intents готов принимать компонент Android.

  • Он может сопоставлять action, категории и характеристики данных Intent.
  • Где это поддерживается, фильтры обычно объявляют в манифесте для Activity, Service и BroadcastReceiver.
  • Фильтр делает возможность компонента доступной другим вызывающим сторонам, но сам по себе не проверяет надёжность входных данных.

Зачем это спрашивают: Сильный ответ охватывает сопоставление и учитывает, что доступность компонента не заменяет проверку входных данных.

navigation

Task представляет собой видимую пользователю последовательность Activity, организованных в back stack.

  • Запуск Activity обычно помещает новую запись Activity поверх текущего task.
  • Нажатие Back удаляет верхний экран и показывает предыдущий.
  • Launch modes и флаги Intent могут изменить стандартное поведение, поэтому их следует применять с ясным пониманием семантики task.

Зачем это спрашивают: Интервьюер проверяет, можете ли вы объяснить историю навигации Android шире отдельных вызовов Activity.

jetpacknavigationcomponents

Jetpack Navigation предоставляет структурированный способ описывать экраны и переходить между ними с сохранением состояния навигации.

  • Navigation graph объявляет destinations, actions и аргументы.
  • NavController выполняет переходы и управляет back stack экранов.
  • Интеграции поддерживают Fragment, Compose, deep links и стандартные элементы UI, например app bar.

Зачем это спрашивают: Хороший ответ называет ответственность графа, контроллера и back stack, а не сводит Navigation к библиотеке маршрутов.

navigation

Deep link представляет собой URI или запрос, который открывает конкретный экран внутри приложения.

  • Он может открыть приложение из браузера, уведомления, другого приложения или через Android App Link.
  • Экран должен объявить или зарегистрировать подходящий шаблон URI и получить определённые аргументы.
  • Навигация должна построить осмысленный back stack, чтобы после внешнего входа действие Back работало предсказуемо.

Зачем это спрашивают: Интервьюер проверяет понимание и сопоставления экрана, и истории навигации для внешних точек входа.

ui

View является базовым элементом UI, а ViewGroup представляет собой View, который содержит и размещает дочерние Views.

  • TextView, ImageView и Button являются отдельными типами View.
  • LinearLayout, FrameLayout и ConstraintLayout являются типами ViewGroup.
  • ViewGroup участвует в измерении и размещении дочерних элементов согласно собственным правилам LayoutParams.

Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы иерархию, лежащую в основе Android-интерфейсов на XML.

uisystem-design

Система View измеряет требуемые размеры, назначает позиции, а затем отрисовывает иерархию.

  • На этапе measure ограничения родителя помогают каждому View определить измеренную ширину и высоту.
  • На этапе layout родитель задаёт границы каждого дочернего элемента.
  • На этапе draw Views рисуют фон, содержимое и дочерние Views на поверхности вывода.

Зачем это спрашивают: Сильный ответ показывает базовое понимание того, как иерархия View превращается в пиксели на экране.

ui

Эти 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

    Каков ваш практический план для задачи «исправьте загрузку, потерю правок и двойной переход после поворота»?