Android Interview Review
4.16K subscribers
232 links
Популярные вопросы и ответы с собеседований на Android-разработчика.

Канал для Java-разработчиков @JavaSobes

Связаться с нами @SobesAdmin

https://itsobes.ru
Download Telegram
to view and join the conversation
Что такое RemoteViewsService?

RemoteViewsService используется для создания виджетов (App Widget), которые отображают коллекции элементов.

На стороне UI такие виджеты используют одну из следующих view:

ListView – для отображения обычного списка элементов;
GridView – располагает элементы коллекции в виде сетки;
StackView – элементы перекрывают друг друга.
AdapterViewFlipper – анимируется при переключении между элементами.

Доступ к данным, которые виджет показывает в виде коллекции, предоставляется через ContentProvider.
В качестве адаптера выступает класс, реализующий интерфейс RemoteViewsFactory. Этот класс является прослойкой между данными в ContentProvider и UI-коллекцией. В качестве элементов коллекции выступают объекты RemoteViews.

RemoteViewsService – это сервис, который который связывает виджет с определенной реализацией RemoteViewsFactory.

Для создания виджета с коллекцией необходимо реализовать интерфейс RemoteViewsFactory и абстрактный класс RemoteViewsService.

Пример реализации можно найти здесь.
Полное описание реализации виджета с коллекцией в документации.

#Widget
Что такое 9-Patch Drawable?

9-Patch – это специальный формат, который используется в Андроиде для эффективного хранения PNG-картинок.
9-Patch хранит в себе информацию о паддингах и о том, как можно растянуть картинку.

Реализуется это с помощью рамки толщиной в один пиксель, изображенной вокруг оригинальной картинки. Части рамки, окрашенные в черный цвет, задают поведение 9-Patch.

Левая и верхняя границы задают область, которая может быть растянута. Незакрашенная часть сохранит размер оригинальной картинки.

Правая и нижняя границы контролируют расположение контента. Незакрашенная область становится паддингом.

#Resources
Как Андроид масштабирует 9-Patch?

Андроид может увеличивать 9-Patch, но не уменьшать. Поэтому чем меньше оригинальный размер картинки, тем лучше.

Для вычисления цвета новых пикселей не применяется интерполяция. Увеличение размера достигается дублированием оригинальных пикселей в размеченных областях. Каждый новый пиксель в масштабированном изображении имеет цвет одного из оригинальных пикселей.

Если 9-Patch имеет несколько размеченных областей, то каждая область увеличивается пропорционально.

#Resources
Что такое AIDL?

AIDL (Android Interface Definition Language) – язык, который используется для межпроцессного взаимодействия в Андроиде.

Разные процессы не имеют общего пространства памяти, поэтому данные между процессами передаются через сообщения. Интерфейс передачи данных создается на языке AIDL.

AIDL поддерживает передачу объектов, реализующих Parcelable и Serializable.

#Service
А вот и мы – прямиком из небольшого отпуска, всем привет!

Из поездок возвращаются с сувенирами, а мы вернулись с новостями. Первая новость: мы запустили Патреон! Некоторые из вас спрашивали про него, и мы решили – почему бы и нет? Для нас это хороший способ получить обратную связь, а для вас – сказать спасибо тем, кто работает над каналами.

Вторая новость: теперь, помимо Android и Java, у нас есть @ITSobes с вопросами для любого IT-собеседования. Computer sceince, владение компьютером, знания о работе информационных систем – мы готовы отвечать на любые вопросы.

Stay tuned,
Команда ITSobes🤗
Как проиграть аудио в приложении?

Есть несколько способов сделать это. Самый простой – использовать класс MediaPlayer.

Это стейт-машина для воспроизведения медиафайлов. Она не предоставляет готовый графический интерфейс, но позволяет вручную вызывать методы seekTo(), play(), stop(), и т. д. Полная диаграмма состояний описана на изображении ниже.

MediaPlayer не потокобезопасен – все операции должны производиться в том же потоке, в котором он был создан.

Альтернативный API предлагает библиотека с открытым исходным кодом ExoPlayer.

#Media
В каком случае onDestroy вызовется без onPause и onStop?

Такое может произойти в единственном случае, когда метод finish() использован в коллбэке активити onCreate().

Всё дело в том, что onStop и onPause – коллбэки завершающих фаз для onStart и onResume соответственно. На момент вызова onCreate() эти фазы еще не случились. Подробнее про жизненный цикл активити читайте в ранней публикации.

Согласно документации, в любой другой нормальной ситуации вызов этих коллбэков гарантирован.

#Lifecycle
Что означают dpi, dp, sp, dip, px, mm, in и pt?

dpiплотность экрана, количество пикселей на дюйм.

dp, sp – абстрактные независимые от плотности пиксели для размеров элементов и текста. Ранее мы писали о соотношении между dp и px.

dip – не упоминаемый в документации, но понимаемый компилятором синоним для dp.

px – размер, выраженный в физическом количестве пикселей экрана.

mm, in – физический размер на экране, в милиметрах и дюймах (inches) соответственно.

ptтипографский пункт (point), тоже физический размер, равный 1/72 дюйма.

#Resources
Как спрятать клавиатуру?

По умолчанию изначально фокус автоматически устанавливается на первый EditText в активити, в результате чего появляется клавиатура. Избавиться от этого поведения помогает значение stateAlwaysHidden для атрибута манифеста windowSoftInputMode. Но, к сожалению, этот атрибут не срабатывает при последующей ручной установке фокуса.

Чтобы спрятать клавиатуру в процессе работы, придется воспользоваться сервисом InputMethodManager:

(InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE)


Для этого вызывается InputMethodManager.hideSoftInputFromWindow(). Он требует параметр windowToken, который можно достать из текущего View методом getWindowToken().

Второй параметр метода hideSoftInputFromWindow – флаг. Без флага (значение 0) метод сработает в любой ситуации. Если же передать флаг InputMethodManager.HIDE_IMPLICIT_ONLY, не скроется клавиатура, которую пользователь вызвал явно.

Чтобы клавиатура не появилась снова, кроме вызова hideSoftInputFromWindow необходимо снять с элемента фокус: getCurrentFocus().clearFocus().

#View
Чем идентифицировать пользователя?

Речь здесь идет только об идентификации – присвоении юзеру уникального ID, не об аутентификации. Это бывает необходимо для хранения связанных с пользователем данных. Полностью тема раскрыта в соответствующем разделе документации. Есть разные типы идентификации:

1. «Железные» идентификаторы: SSAID, IMEI, MAC-адрес, серийный номер, и другие. Только некоторые из них могут меняться, доступ к некоторым ограничен. Возможность смены пользователем идентификатора нужна из соображений приватности. Их рекомендуется по возможности не использовать.

2. Для рекламных целей используется Advertising ID. Для его получения используется класс AdvertisingIdClient. Помимо ID, он также сообщит, ограничено ли для пользователя отслеживание рекламы. Этот идентификатор нельзя использовать для хранения персональных данных.

3. Instance ID идентифицирует экземпляр приложения. Он изменяется не только при смене девайса, но и при переустановке приложения. Управляется классом FirebaseInstallations. Рекомендуется использовать для не рекламных случаев именно этот идентификатор (либо же генерировать их хранить собственный GUID).

4. Для некоторых специфических нужд идентификацию дает соответствующее API. Например SafetyNet API идентифицирует спамеров и других мошенников; Subscription ID API предоставляет идентификатор для управления подписками.

Конкретную реализацию идентификатора выбирают исходя из его характеристик:

• Границы действия (приложение/набор приложений/девайс);
• Время жизни и сбрасываемость
• Вероятность коллизий
• Сложность подделать

#Architecture
Опишите архитектуру платформы Android

Архитектура состоит из пяти слоев:

1. Ядро Linux. Сердце Android, в котором реализуется безопасность межпроцессного взаимодействия и низкоуровневая работа с памятью.

2. Hardware Abstraction Layer (HAL). Интерфейсы для работы с железом. Драйвер для USB, Bluetooth, программный интерфейс OpenGL. Уровень, который дает платформо-независимость Android.

3. Android Runtime и нативные библиотеки. То что выполняет пользовательский код: компиляторы, сборщик мусора, интерпретатор байткода.

4. Android Framework. Java API, через которое пользовательская программа взаимодействует с системой. Обеспечение жизненного цикла системных компонентов.

5. Android Applications. Непосредственно приложения, как пользовательские, так и системные (календарь, камера, и т.д.).

#Architecture
Как уменьшить APK?

• Подключить к своему приложению Proguard;

• Избавиться от неиспользуемых ресурсов с помощью атрибута shrinkResources;

• Избавиться от ресурсов сторонних библиотек, которые не подходят под вашу локаль, с помощью атрибута resConfigs;

• Сконвертировать все картинки в формат webp или VectorDrawable.

Подробнее об этих советах можно почитать в статье.

#Build
Как отладить приложение на девайсе?

Для удаленной отладки используется технология Android Debug Bridge. Она включает три компонента:

• adbdдемон на стороне девайса, который принимает и выполняет команды.

• ADB Сервер – демон на стороне компьютера, с которого ведется отладка. Принимает запросы от отладочных клиентов на TCP порт 5037. Служит единой точкой доступа к удаленной отладке. Запускается при первом старте adb клиента.

• Клиенты – различные приложения, которые пользуются инструментами отладки. Самое простое – консольный клиент adb из SDK. Более сложные клиенты могут использовать adb внутри, либо самостоятельно подключаться к порту ADB сервера.

Сервер передает команды от клиентов в adbd на эмуляторах через TCP порты, либо в adbd на реальных девайсах через USB или WiFi.

Помимо самого дебаггера для отладки применяются дополнительные инструменты, такие как Android profiler и Device File Explorer. Для исследования проблем полезны баг репорты.

Если необходимо отладить web-приложение, используется специальная фича Chrome DevTools.

#Tools
Какие классы служат для доступа к сенсорам?

Таких классов четыре:

• SensorManager – точка входа для работы с сенсорами и listener-ами их событий. Системный сервис, получаемый по имени Context.SENSOR_SERVICE;

• Sensor – представляет отдельно взятый сенсор. Дает различную метаинформацию (энергопотребление, точность, производителя, и т.д.);

• SensorEventListener – интерфейс для реализации обработчиков событий, приходящих из сенсоров. В нём реализуется логика обработки входящих данных;

• SensorEvent – отдельное событие из сенсора: данные и точность их измерения.

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

#Hardware
Как передать параметры в конструктор фрагмента?

Параметры передаются в конструктор Fragment-а через Bundle, с помощью метода Fragment.setArgument(Bundle). Переданный бандл может быть получен через Fragment.getArguments() в соответствующем методе жизненного цикла фрагмента.

Распространенная ошибка передавать данные через кастомный конструктор. Использовать не-дефолтные конструкторы фрагментов не рекомендуется, потому что фрагмент может быть уничтожен и пересоздан вследствие изменений конфигурации (например при повороте экрана).

Использование пары методов setArguments/getArguments гарантирует, что при пересоздании Bundle будет сериализован/десериализован, и данные восстановятся.

#Fragment
Перечислите доступные хранилища данных

• Shared Preferences – приватные примитивные данные в виде ключ-значение.

• SQLite – структурированные данные в приватной базе данных.

• Внешнее хранилище – общедоступное файловое хранилище: мультимедиа, документы, и прочее.

• Внутреннее хранилище – файловое хранилище, доступное только для приложения.

• Сетевое хранилище – любой сторонний сервис для хранения данных, доступный по сети.

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

#Architecture
Какова структура Android-проекта?

В проекте обычно присутствуют следующие файлы и директории:

AndroidManifest.xml – определение компонентов и требуемых возможностей девайса для приложения.
build.gradle – файлы конфигурации сборки для всего приложения и отдельных модулей.
src – исходный код классов и ресурсы проекта.
• Файл .R – сгенерированный на этапе компиляции перечень всех ресурсов проекта.
assets – файлы, которые должны попасть в .apk как есть, без изменений.

res/drawable – директория для картинок (drawable-объектов).
res/layout – директория для файлов которые определяют UI приложения.
res/values – директория для различных XML-файлов с простыми ресурсами, такими как строки, цвета и числа.
res/mipmap – иконки для launcher-а разных разрешений.
res/menu – XML с определениями разных меню.
res/font – шрифты.
res/xml – XML файлы, доступные через Resources.getXML().
res/raw – различные файлы, доступные в виде потоков данных через Resources.openRawResource().
res/anim, res/animator – анимации.

#System
Назовите три основных применения интентов

1. Запустить активити. Intent передается в метод startActivity() явно, либо разрешается с помощью механизма Intent Resolution.

2. Запустить сервис. Можно запустить сервис для выполнения единичной операции, передав Intent в startService().

3. Доставить броадкаст. Для отправки броадкаст-ивента в другие приложения интент передается в sendBroadcast(), sendOrderedBroadcast(), или sendStickyBroadcast().

#Intent
Назовите два способа очистить back stack при создании Activity

Флаг интента FLAG_ACTIVITY_CLEAR_TASK используется для того, чтобы очистить все активити таска. Activity, запущенная таким интентом становится новым корнем пустого бэкстека. Этот флаг обязан быть использованным вместе с FLAG_ACTIVITY_NEW_TASK.

Другой вариант – FLAG_ACTIVITY_CLEAR_TOP. Разница в том, что если этот флаг задан, а в таск листе существует старый экземпляр данной активити, все другие активити будут удалены, а корнем станет тот старый экземпляр. Использовать при этом FLAG_ACTIVITY_NEW_TASK не обязательно, но рекомендуется.

#Intent
#Activity