Специализация
Python Backend Developer
Java Backend Developer
Node.js Backend Developer
Golang Backend Developer
React Frontend Developer
Выберите навыки
Kotlin
Networks
Git
Java
Docker
Сложность
1-3
4-6
7-8
9-10
Рейтинг вопросов
1
2
3
4
5
Подпишись на Android Developer в телеграм
Как работают дженерики в Kotlin «под капотом»?
Kotlin-дженерики реализованы через стирание типов (type erasure) на JVM, аналогично Java: информация о конкретном параметре типа недоступна в рантайме. Компилятор проверяет типы во время компиляции, а затем генерирует код без параметризации. Для сохранения информации о типе используют реифицированные (reified) параметры в inline-функциях.
Расскажите об основных компонентах Android-приложения.
В Android-приложении есть четыре ключевых компонента: Activity (экран UI), Service (фоновая работа), BroadcastReceiver (приём широковещательных сообщений) и ContentProvider (доступ к данным). Каждый компонент объявляется в манифесте и управляется системой. Они взаимодействуют через Intent, что даёт гибкость в навигации и общении внутри и между приложениями.
Есть четыре ViewModel, и нужно каждые 5 секунд подписываться на запрос из сети. Как это лучше организовать?
Лучше запускать единственный Flow или LiveData в одном ViewModel, который внутри viewModelScope с помощью flow {} и delay(5000) эмитит результат каждые пять секунд. Остальные три ViewModel могут делегировать подписку на общий источник данных (SharedFlow или отдельный синглтон-репозиторий), чтобы не создавать дубли HTTP-запросов и экономить ресурсы.
При повороте экрана нужно сохранить и изменить определённые данные в Presenter без ViewModel. На каком этапе жизненного цикла и как это сделать?
При повороте экрана Activity уничтожается и создаётся заново. В MVP можно сохранить данные в onSaveInstanceState(Bundle) Presenter-а через Bundle (через интерфейс Activity → Presenter) и восстановить в onCreate нового View, передав сохранившийся Bundle. Либо хранить Presenter с данными в setRetainInstance(true) у Fragment.
Как работают методы bind и unbind у Android-сервисов?
bindService(Intent, ServiceConnection, flags) связывает клиент (Activity или другой компонент) с сервисом, вызывая в сервисе onBind(Intent) и возвращая IBinder для взаимодействия. unbindService(ServiceConnection) разрывает связь, и если нет других клиентов и сервис не был запущен через startService, он завершается.
Сколько времени может работать фоновый Service?
Нужно обмениваться broadcast-сообщениями только между своими приложениями, запрещая внешним их принимать. Как это реализовать?
В чём отличие регистрации BroadcastReceiver в манифесте и в коде (runtime-регистрация)?
Какие проблемы могут возникнуть при перехвате Intent через BroadcastReceiver?
В чём различие между явным (explicit) и неявным (implicit) Intent?
Рейтинг:
2
Сложность:
7
Начиная с Android 8.0, обычный фоновой сервис может работать только несколько секунд после ухода приложения в фон, иначе система убьёт его. Для долгой фоновой работы нужно использовать Foreground Service с уведомлением, тогда он работает бесконечно, пока пользователь его не остановит, но за ним следят ограничения по энергопотреблению.
Рейтинг:
2
Сложность:
7
При отправке читайте разрешение через sendBroadcast(intent, YOUR_PERMISSION) и регистрируйте BroadcastReceiver с тем же правом: в манифесте укажите android:permission="YOUR_PERMISSION". Тогда только приложения, у которых есть это разрешение, смогут отправлять или принимать ваш Broadcast.
Рейтинг:
2
Сложность:
7
При объявлении в манифесте приёмник работает даже если приложение не запущено (до Android 8.0, с ограничениями в O+), а runtime-регистрация (registerReceiver) действует только пока жив активный компонент (Activity/Service) и служит для динамических фильтров. Manifest-регистрация удобна для системных событий, runtime — для событий в пределах экрана.
Рейтинг:
2
Сложность:
7
При перехвате могут быть уязвимости: подставить злонамеренный Intent (Intent-spoofing), вызвать переполнение очереди при многих Broadcast, получить лишние System-Broadcast после Android 8.0. Также возможны утечки ресурсов при незакрытых регистрации и таймауты, если приёмник обрабатывает тяжёлую работу в main-потоке.
Рейтинг:
2
Сложность:
7
Явный Intent указывает точный компонент (имя пакета и класса) для запуска, а неявный содержит только действие (action), категорию и/или данные, система сама выбирает подходящий компонент через intent-filter. Явные используют для внутренних переходов в своём приложении, неявные — для взаимодействия с другими приложениями (открыть браузер, поделиться текстом).
Рейтинг:
2
Сложность:
5
Рейтинг:
2
Сложность:
6
Рейтинг:
2
Сложность:
6
Рейтинг:
2
Сложность:
6
Рейтинг:
2
Сложность:
5