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

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

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

https://itsobes.ru
Download Telegram
to view and join the conversation
Какие лэйауты существуют в Android?

Основные лэйауты в Андроиде:

• FrameLayout. Каждая следующая View во FrameLayout отрисовывается поверх предыдущей.

• LinearLayout имеет два режима, которые задаются атрибутом orientation: vertical и horizontal. В horizontal режиме каждая следующая View отрисовывается правее предыдущей, в vertical – ниже предыдущей.

• GridLayout. View располагаются на сетке (таблице) с заданным количеством строк и столбцов.

• RelativeLayout позволяет располагать View друг относительно друга, задавая атрибуты View.

• ConstraintLayout подключается как отдельная библиотека из Android Jetpack и не входит в Android SDK. Является более мощной и эффективной заменой RelativeLayout.

#View
Чем CoordinatorLayout отличается от FrameLayout?

CoordinatorLayout входит в Android Jetpack. CoordinatorLayout позиционируется как улучшенный FrameLayout.

CoordinatorLayout позволяет контролировать взаимодействие дочерних View между собой. Одна из задач, которая решается с помощью CoordinatorLayout – скрыть ActionBar при скролле вниз и показать при скролле вверх.

Для настройки поведения дочерних View используются Behaviors-атрибуты.
Кроме существующих реализаций Behaviors, таких как AppBarLayout.ScrollingViewBehavior, можно создавать кастомные. Для этого необходимо создать наследника класса CoordinatorLayout.Behavior и указать полное имя класса в атрибуте app:layout_behavior.

#View
#Jetpack
Что такое Compound Drawable?

Compound Drawable – это картинка (drawable-ресурс), которую можно добавить в TextView.
Часто совместные картинка и текст верстаются с помощью LinearLayout, но использование Compound Drawable более эффективно.

Для добавления Compound Drawable используется метод TextView.setCompoundDrawable(left: Drawable?, top: Drawable?, right: Drawable?, bottom: Drawable?). Drawable-объект передается в соответствующий параметр, который задает положение относительно текста. В остальные параметры передается null.

#View
Как задать отступ у Compound Drawable?

C помощью метода TextView.setCompoundDrawablePadding(padding: Int) можно задать padding между текстом и картинкой. Значение, которое задается этим методом, применяется ко всем Compound Drawables в TextView. Это самое неудобное ограничение при использовании Compound Drawables.

Один из способов добавить различные отступы для разных картинок или сдвинуть картинку относительно центра – использовать drawable-ресурс inset. В inset задается оригинальный drawable-ресурс и отступы по всем сторонам.

#View
В чем разница между Data Binding и View Binding библиотеками?

Data Binding библиотека реализует два подхода. Собственно сам data binding, т.е. связывание данных и view, а также view binding – связывание view в xml и в коде. Библиотека Data Binding была создана несколько лет назад и имеет ряд недостатков.

View Binding – относительно новая библиотека, которая поставляется в Android Jetpack. Как следует из названия, эта библиотека предоставляет только решение для связывания xml и кода. Основное преимущество View Binding перед Data Binding – это скорость сборки. Помимо этого с View Binding в лэйаутах не нужно использовать тэг <layout>

#Jetpack
Что задает атрибут weight в LinearLayout?

Атрибут layout_weight указывает какую часть лэйаута займет view. В лэйауте с вертикальной ориентацией weight влияет на высоту view, а с горизонтальной – на ширину.

Размер пространства, которое занимает view, прямо пропорционален весу.
Допустим, в лэйауте есть три view. View A имеет вес 0.5, View B – 0.3, View C – 0.2. Сумма весов равна 1. В этом случае размеры view будут соответственно 50%, 30% и 20% от свободного в лэйауте места.

#View
Как атрибут weight влияет на перформанс?

Для начала вспомним, как отрисовывается дерево view. При отрисовке любого лэйаута вызываются методы onMeasure(), onLayout() и onDraw().

На шаге onMeasure() лэйаут передает желаемые значения размеров каждой дочерней view. View сохраняет размеры, которые позже используется при вызове onLayout().

При вызове onLayout() дочерние view располагаются на лэйауте с использованием размеров, полученных на шаге onMeasure().

На шаге onDraw() происходит отрисовка дерева view.

Обычно в LinearLayout каждый из этих методов вызывается один раз, но при использовании атрибута weight – фаза onMeasure() выполняется в два прохода. В этом случае перформанс LinearLayout становится таким же как у RelativeLayout.

#View
Назовите частые причины проблем с производительностью UI и как их решать

Две основные причины проблем с перформансом отрисовки лэйаутов:

• Глубокая вложенность. Плоские лэйауты отрисовываются быстрее, чем вложенные с тем же количеством View.

Double taxation. Так называется ситуация, когда для лэйаута шаги onMeasure() и onLayout() вызываются дважды. Например, double taxation случается при использовании атрибута weight в LinearLayout.


Для того, чтобы избежать проблем с производительностью следует придерживаться следующих правил:

LinearLayout c текстом и картинкой следует заменять на TextView с Compound Drawable.

• Если в качестве корневого лэйаута используется FrameLayout без кастомизированных атрибутов, то его можно заменить тегом <merge>.

• Использовать <merge> для лэйаутов, которые вкладываются в другие лэйауты;

• Использовать ConstraintLayout вместо RelativeLayout.

• Быть осторожным с атрибутом layout_weight в LinearLayout и не использовать layout_weight в нескольких вложенных лэйаутах.

#View
Описание малоизвестной, но полезной функциональности Android Studio

https://www.jetbrains.com/help/idea/pro-tips.html

#пятница
Назовите методы жизненного цикла виджета

В этом посте говорим об App Widget, а не о классах из пакета widget.

Виджет имеет следующие методы жизненного цикла:

onEnabled() – вызывается, когда пользователь добавляет на home screen первый инстанс виджета. При добавлении новых инстансов того же типа, onEnabled() вызываться не будет.
В этом методе следует выполнять общие для всех инстансов виджета операции инициализации.

onUpdate() – вызывается при добавлении инстанса виджета. Также вызывается периодически через интервал времени, который был задан в AppWidgetProviderInfo.
Этот метод используется для инициализации и обновления состояния.

onAppWidgetOptionsChanged() – вызывается при добавлении и при изменении размера.

onDeleted() – вызывается при удалении инстанса виджета.

onDisabled() – вызывается при удалении всех инстансов виджета. В этом методе следует освобождать ресурсы, созданные при инициализации в методе onEnabled().

#Widget
Какие ограничения виджетов вы знаете?

Во-первых, виджеты ограничены по жестам, которые они могут обрабатывать. Доступны только touch и вертикальный swipe. Горизонтальный swipe доставляется приложению-хосту, например домашнему экрану.

Во-вторых, виджеты поддерживают только следующие лэйауты: FrameLayout, LinearLayout, RelativeLayout, GridLayout. Набор view тоже ограничен (полный список в документации).
Причина этого в том, что лэйауты виджетов основаны на RemoteViews.

#Widget
Что такое RemoteViews?

Класс RemoteViews описывает иерархию View, которая может отрисовываться в другом процессе. Например RemoteViews используются при создании виджета или кастомного лэйаута для нотификации.
При создании объекта RemoteViews в конструктор передается id лэйаута и имя пакета, в котором этот лэйаут хранится.

RemoteViews позволяет обрабатывать клик ивенты. Реализуется это не с помощью листенера, а через PendingIntent.
Метод RemoteViews.setOnClickPendingIntent(viewId: Int, pendingIntent: PendingIntent) выставляет PendingIntent, который будет вызван при клике на view с соответствующим id.

#View
Что такое 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🤗