Поскольку Android продолжает доминировать на рынке мобильных устройств, разработчикам требуется основательная подготовка к техническим собеседованиям. Вот список часто задаваемых вопросов на собеседовании по Android с подробными ответами, которые помогут добиться успеха на следующем собеседовании.

1. Перечислите основные компоненты Android-приложения

Четыре основных компонента Android-приложения:

  • Activity (Активити): отдельный экран, на котором происходит обработка взаимодействия с пользователем;
  • Service (сервис): фоновый процесс, выполняющийся без пользовательского интерфейса;
  • Broadcast Receiver (широковещательный приемник): компонент, отвечающий на общесистемные сообщения;
  • Content Provider (поставщик контента): компонент, управляющий общими данными приложения.

2. Опишите жизненный цикл Activity в Android

Жизненный цикл Activity состоит из следующих callback-методов:

  • onCreate(): вызывается при первом создании Activity;
  • onStart(): вызывается, когда Activity становится видимой;
  • onResume(): вызывается, когда Activity начинает взаимодействовать с пользователем; 
  • onPause(): вызывается, когда Activity частично скрыта;
  • onStop(): вызывается, когда Activity больше не видна;
  • onDestory(): вызывается, когда Activity уничтожается;
  • onRestart(): вызывается, когда Activity перезапускается после остановки.

3. В чем разница между неявными и явными намерениями?

Явные намерения (explicit Intents) объявляют конкретный компонент, который нужно запустить, указывая его имя:

val intent = Intent(this, SecondActivity::class.java)

Неявные намерения (implicit Intents) объявляют общее действие, которое нужно выполнить, позволяя системе найти подходящие компоненты:

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com"))

4. Каково назначение файла AndroidManifest.xml?

Файл AndroidManifest.xml содержит важную информацию о приложении:

  • имя пакета и идентификатор приложения;
  • компоненты приложения (Activities, Services и т. д.);
  • разрешения, необходимые приложению;
  • требуемый минимальный уровень API;
  • используемые аппаратные и программные возможности.

5. Объясните назначение различных режимов запуска Android-приложения

В Android различают 4 типа launchMode (режима запуска):

  • Standard: режим «по умолчанию», при котором каждый раз создается новый экземпляр Activity;
  • SingleTop: режим, позволяющий повторно использовать Activity, если она находится на вершине стека;
  • SingleTask: режим создания новой задачи и экземпляра Activity, если он не существует;
  • SingleInstance: режим, аналогичный SingleTask, но допускающий только один экземпляр Activity.

6. В чем разница между Service и IntentService?

  • Service: выполняется в главном потоке, может быть долгоживущим;
  • IntentService: -> функционирует в рабочем потоке -> последовательно обрабатывает каждое намерение -> останавливается, когда работа завершена -> утратил актуальность в Android 11, заменен на WorkManager.

7. Назовите этапы жизненного цикла компонента Fragment

Fragment (Фрагмент) имеет более сложный жизненный цикл, чем Activity, включая:

- onAttach()
- onCreate()
- onCreateView()
- onViewCreated()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()

8. Каково назначение компонента ViewModel?

ViewModel — компонент архитектуры Android, который:

  • хранит данные, связанные с пользовательским интерфейсом, и управляет ими;
  • выживает (сохраняет работоспособность) при изменении конфигурации;
  • помогает отделить бизнес-логику от пользовательского интерфейса;
  • обменивается данными между Fragment’ами.
class MyViewModel : ViewModel() {
 private val _data = MutableLiveData<String>()
 val data: LiveData<String> = _data
}

9. В чем разница между LiveData и Flow?

LiveData:

  • ориентируется на жизненный цикл;
  • обновляет наблюдателей только в активном состоянии жизненного цикла;
  • ограничен выдачей одного значения.

Flow:

  • по умолчанию не учитывает жизненный цикл;
  • поддерживает сложные операции, такие как map, filter и transform;
  • может выдавать несколько значений с течением времени.

10. В чем суть и преимущества внедрения зависимостей в Android?

Внедрение зависимостей (dependency injection, DI) — паттерн проектирования, при котором зависимости предоставляются классу, а не создаются внутри него. К популярным DI-фреймворкам относятся:

  • Dagger;
  • Hilt (рекомендован Google);
  • Koin.

Преимущества:

  • упрощение тестирования;
  • слабая связанность модулей;
  • расширение возможностей для повторного использования кода.

11. Что такое WorkManager и когда его следует использовать?

WorkManager — инструмент, предназначенный для фоновой работы, который:

  • требует гарантированного выполнения;
  • может выполняться, когда приложение не находится на переднем плане;
  • может выполняться при перезагрузке устройства;
  • может требовать таких условий, как доступность сети.

12. Из каких компонентов состоит база данных Room?

Room состоит из трех основных компонентов:

  • Database (база данных) — основная точка доступа к базе данных;
  • Entity (сущность) представляет таблицу базы данных;
  • DAO (data access object — объект доступа к данным) содержит методы доступа к базе данных.
@Entity
data class User(
 @PrimaryKey val id: Int,
 val name: String
)

@Dao
interface UserDao {
 @Query("SELECT * FROM user")
 fun getAll(): List<User>
}

13. Какие способы хранения данных доступны в Android?

Android предлагает несколько способов хранения данных:  

  • Shared Preferences (общие настройки): пары «ключ-значение»;
  • Internal Storage (внутреннее хранилище): личные файлы;
  • External Storage (внешнее хранилище): публичные файлы;
  • SQLite Database (база данных SQLite): структурированные данные;
  • Room: SQLite-абстракция;
  • DataStore: современная замена SharedPreferences.

14. Какие функции выполняют поставщики контента?

Поставщики контента (Content Providers) выполняют следующие функции:

  • обеспечивают обмен данными между приложениями;
  • отвечают за согласованный интерфейс для доступа к данным;
  • обрабатывают межпроцессное взаимодействие;
  • управляют разрешениями на доступ к данным.

15. В чем разница между Serializable и Parcelable?

Serializable:

  • стандартный интерфейс Java;
  • использует рефлексию;
  • по сравнению с Parcelable обладает более низкой производительностью.

Parcelable:

  • интерфейс, специфический для Android;
  • реализуется вручную;
  • обладает более высокой производительностью, чем Serializable;
  • рекомендуется для Android.

16. Как обрабатывать изменения конфигурации?

Методы обработки изменений конфигурации:

  • использование ViewModel;
  • использование onSaveInstanceState();
  • обработка в манифесте (android:configChanges);
  • использование сохраненных Fragment’ов.

17. Назовите типы компонента Service в Android и укажите их отличия

  • Foreground Service (сервис переднего плана): видимый пользователю и наименее подверженный сбоям;
  • Background Service (фоновый сервис): не имеющий пользовательского интерфейса;
  • Bound Service (связанный сервис): привязанный к компонентам, живущий с привязками.

18. Каково назначение ProGuard в Android?

Утилита ProGuard выполняет следующие функции:

  • уменьшает размер кода;
  • оптимизирует байт-код;
  • обеспечивает обфускацию кода;
  • удаляет неиспользуемый код.

19. Что такое Jetpack Compose в Android?

Jetpack Compose — это библиотека, обладающая следующими особенностями:

  • предоставляет инструментарий для разработки современных UI;
  • использует декларативный UI-фреймворк;
  • требует использования языка Kotlin;
  • проще в применении, чем XML-макеты.
@Composable
fun Greeting(name: String) {
 Text(text = "Hi $name!")
}

20. Какие типы сборки в Android вы знаете?

Общие типы сборки:

  • Debug: версия для отладки во время разработки;
  • Release: продакшн-версия для конечных пользователей;
  • Staging: тестовая версия;
  • Custom: определяемая пользователем.

Каждая из них может быть:

  • Signing configurations (с настройками подписи);
  • ProGuard rules (с правилами ProGuard);
  • Resources (с ресурсами);
  • BuildConfig fields (с полями BuildConfig).

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Halil Özel: 20 Essential Android Interview Questions

Предыдущая статьяПриложение React Native с поддержкой Apple Watch и виджетов
Следующая статьяСтековая и кучная память в Kotlin