Поскольку 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).
Читайте также:
- Секреты в Android. Часть 2
- Почему имена Android-пакетов имеют вид com.xyz.abc?
- Топ-10 типичных ошибок при реализации паттерна MVVM в Android
Читайте нас в Telegram, VK и Дзен
Перевод статьи Halil Özel: 20 Essential Android Interview Questions