Android Interview Review

@AndroidSobes Нравится 2 1 500

Популярные вопросы и ответы с собеседований на Android-разработчика.
Канал для Java-разработчиков @JavaSobes
Связаться с нами @SobesAdmin
https://itsobes.ru
Гео и язык канала
Россия, Русский
Категория
Образование


Написать автору
Гео канала
Россия
Язык канала
Русский
Категория
Образование
Добавлен в индекс
18.03.2019 05:12
реклама
TGStat Bot
Бот для получения статистики каналов не выходя из Telegram
TGAlertsBot
Мониторинг упоминаний ключевых слов в каналах и чатах.
Telegram Analytics
Подписывайся, чтобы быть в курсе новостей TGStat.
2 919
подписчиков
~2.5k
охват 1 публикации
~2k
дневной охват
~6
постов / нед.
87%
ERR %
7.54
индекс цитирования
Репосты и упоминания канала
22 упоминаний канала
4 упоминаний публикаций
0 репостов
Java Interview Review
Программист
Продакшн
Clean Code
Новые каналы
Java Interview Review
Clean Code
Kosmos Time
Next Time
Android Live 🤖
Лысый из браузера
Java Interview Review
Говнокод
Clean Code
Типичный программист
Coding
Типичный программист
Библиотека джависта
Java Interview Review
IT Юмор
Программист
Говнокод
Каналы, которые цитирует @AndroidSobes
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
HYPE.TECH
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Лысый из браузера
Android Live 🤖
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Последние публикации
Удалённые
С упоминаниями
Репосты
Кто такой Джейк Вортон?

Джейк Вортон (Jake Wharton) – контрибьютор в огромное количество библиотек и селебрити №1 в андроид комьюнити.

Вспомним, какой была разработка под андроид до того, как Джейк захватил наши умы:

• Приложения под андроид разрабатывали студенты, которые работали за еду. Ревьюили и обучали студентов бэкэндщики, потому что они знали Java. Каждое приложение имело свой маленький кровавый энтерпрайз. Некоторые из нас до сих пор видят в кошмарах классы NetworkFacade, DBManager, FactoryBridgeDecoratorInteractor.

• Для загрузки картинок писали свои библиотеки. Для каждого проекта новую, потому что предыдущая вызывала утечки памяти и крэши с OutOfMemoryError.

• О крэшах узнавали из отзывов на Android Market (до того как он стал Play Store), потому что Crashlytics еще не было.

• Google рекомендовал Eclipse как среду разработки.

• Коммит значил пуш, потому что SVN был наше всё.

• Бэкенд возвращал респонсы в XML.

• Проекты собирались тулзой под названием Ant, а о Gradle еще никто не слышал.

• Библиотеки добавлялись в проект в виде скачанных jar-файлов. Если в библиотеке был баг, то скачивали ее исходный код, подключали как модуль приложения и правили баг внутри проекта.

• Из-за этого многие не любили open source и предпочитали писать свои загрузчики картинок.

Но потом явился ОН.

Первой библиотекой Джейка Вортона была ActionBarSherlock, которая портировала функциональность ActionBar под андроид 2.x. Эта библиотека быстро набрала популярность и стала обращать внимание разработчиков на open source решения.

Далее была библиотека Otto (Event Bus). С релизом этой библиотеки коммьюнити впервые стало обсуждать архитектурные подходы в андроид проектах.

После поста Джейка о проблемах Ant, поднялись бурления, и Google стал двигаться в сторону Gradle.

2014-2015 года можно считать ренессансом разработки под Android. Джейк и компания Square, в которой он работал, релизят огромное количество полезных библиотек. В их числе OkHttp, Retrofit и Picassо.
Джейк рассказывает на конференциях о Dagger, RxJava, Kotlin, Annotation Processing и Code Generation. Все к чему он прикасается превращается в золото принимается комьюнити и становится новым мейнстримом.
Многие молодые разработчики выступают на конференциях и контрибьютят в open source, пытаясь повторить успех Джейка, что двигает коммьюнити вперед.

Сегодня нам приходится выбирать лучшее решение из нескольких хороших. Давайте не забывать, кому мы за это благодарны. Вопрос «‎Кто такой Джейк Вортон?»‎ должен быть на каждом собеседовании.

#1апреля
Читать полностью
Как перевести dp в px?

Значение dp (density-independent pixels) переводится в px (pixels) по формуле:
px = dp * (dpi / 160), где dpi (dots-per-inch) – плотность экрана.

Значения dpi устройства соотносятся с квалификаторами ресурсов следующим образом:

-ldpi (low-density) ~120dpi; px = 0.75 * dp.
-mdpi (medium-density) ~160dpi; px = dp.
-hdpi (high-density) ~240dpi; px = 1.5 * dp.
-xhdpi (extra-high-density) ~320dpi; px = 2 * dp.
-xxhdpi (extra-extra-high-density) ~480dpi; px = 3 * dp.
-xxxhdpi (extra-extra-extra-high-density) ~640dpi; px = 4 * dp.

Размеры картинок в drawable-ресурсах должны соответствовать этим соотношениям.
Если для конфигурации текущего устройства нет ресурса, то система выбирает наиболее близкий по dpi и масштабирует до нужного размера.

#Resources
Читать полностью
Что такое плотность экрана?

Плотность экрана – это характеристика устройства, которая отражает количество пикселей на физической площади экрана. В Андроиде для обозначения плотности экрана используется сокращение DPI (dots per inch).

Приложения под Андроид должны быть сверстаны так, чтобы размеры элементов выглядели одинаково на экранах с разной плотностью. Поэтому вместо px используется измерение dp (density-independent pixels) для указания размеров View и sp (scalable pixels) для размера текста.

Также существуют ресурсные квалификаторы, которые характеризуют плотность экрана: -ldpi, -mdpi, -hdpi, -xhdpi, и т.д.

#Resources
Читать полностью
По какому алгоритму разрешаются квалификаторы ресурсов?

Квалификаторы ресурсов разрешаются по следующему алгоритму:

1. Исключаются все ресурсы, которые противоречат текущей конфигурации. Исключением являются квалификаторы, определяющие плотность экрана (dpi). Для плотности экрана выбирается не точно соответствующий ресурс, а наиболее подходящий.

2. Выбирается следующий квалификатор, в соответствии с порядком в таблице.

3. Если существует директория ресурсов с данным квалификатором, то переходим на шаг 4, иначе возвращаемся на шаг 2.

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

5. Повторить шаги 2, 3 и 4 пока не останется единственная подходящая директория ресурсов.

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

#Resources
Читать полностью
Приглашаем на День открытых дверей базового и продвинутого онлайн-курсов «Android-разработчик» на Kotlin - 24 марта в 20-00 мск онлайн: https://otus.pw/KjT2/

📌На бесплатном вебинаре мы:
- ответим на все вопросы по промышленной Android-разработке;
- поговорим о хардкорной программе курсов, формате обучения и выпускном проекте;
- расскажем о карьерных перспективах выпускников OTUS и 28+ работодателях, которые готовы предложить собеседования на вакантные позиции по итогу обучения.

— Встречу проведут преподаватели-практики курса Антон Казаков (руководитель направления Android-разработки в Альфа Банке) и Денис Журавлёв (Android Team Lead в Mediapark).

🔥Старт курса уже 31 марта - успейте в группу по спеццене!
Читать полностью
Шпаргалка по асимптотической сложности алгоритмов:

https://www.bigocheatsheet.com/

#пятница
Если ты еще не нашел работу по душе, то самое время задуматься о дополнительном образовании в сфере дизайна. Тем более, что по итогу курса ты получишь трудоустройство!

Как это возможно?
Онлайн-университет Skillbox подготовил сильный курс «Дизайнер мобильных приложений» с гарантированным трудоустройством.

Скорее переходи по ссылке: https://clc.to/xEgUNg

Если тебе близок дизайн, то на курсе ты углубленно освоишь:
📌 основы Figma и Sketch: от введения, до создания хардкор-дизайна за 45 минут;
📌 дизайн мобильных приложений: от первого макета, до работы над портфолио, работе в команде и построения собственного бренда;
📌 UX-дизайн: от изучения психологии пользователей, до создания единой экосистемы продуктов;
📌 и завершишь курс анимацией интерфейсов и дипломной работой.

Все уроки будут подкреплены практическими заданиями, их проверкой и работой над твоим портфолио. А еще тебя ждут оффлайн-воркшопы и закрытый чат студентов и преподавателей.

Выглядит очень круто!
Читать полностью
Можно ли создавать ресурсы с несколькими квалификаторами?

– Да.

Но существуют ограничения:

1. Квалификаторы должны быть расположены в порядке приоритета. Приоритет квалификаторов соответствует порядку в таблице.
Неверный вариант: drawable-mdpi-ru.
Верный вариант: drawable-ru-mdpi.

2. Невозможно применить несколько квалификаторов из одной категории, например values-ru-be/. Ресурс придется продублировать в двух директориях: values-ru/, values-be/

#Resources
Читать полностью
В чем разница между Assets и Raw-ресурсами?

Assets и Raw-ресурсы – это механизмы, которые позволяют добавить дополнительные файлы произвольного формата в Android-приложение.

Для использования Assets создается директория src/main/assets. Эта директория может содержать произвольные файлы и поддиректории.
Для получения контента asset-файла используется метод Context.getAssets(), который возвращает объект класса AssetManager. Далее вызывается метод AssetManager.open(), который принимает имя файла и возвращает InputStream.
Если файла с заданным именем не существует, то метод open() бросает IOException.

Для использования Raw-ресурсов создается resource-директория res/raw. Эта директория подчиняется тем же правилам, что и другие ресурсы. Она может иметь квалификаторы (например -ru), в ней нельзя создавать вложенные директории, а имена файлов должны быть в нижнем регистре.
Во время компиляции для каждого raw-файла создается id в классе R. Для файла sound.mp3 будет создан id R.raw.sound.
Для доступа к raw-ресурсу используется метод Resources.openRawResource(), который принимает id ресурса и возвращает InputStream.

Доступ к raw-ресурсам более эффективен и безопасен за счет статической генерации id. Также с помощью квалификаторов возможно использование разных файлов для различных конфигураций системы.
С другой стороны механизм Assets более гибкий, т.к. позволяет получать полное имя файла и создавать вложенные директории.

#Resources
Читать полностью
16 марта в 20:00 мск OTUS приглашает Android-разработчиков с опытом на бесплатный пробный вебинар «ProGuard / R8. Сжатие и оптимизация кода для Android-приложений»: https://otus.pw/lBUI/

📌На вебинаре мы с вами:
— научимся писать максимально строгие keep-директивы и настраивать оптимизации;
— увидим на практике, как ProGuard/R8 миницифируют, оптимизируют и убирают неиспользуемый код;
— сравним эффективность ProGuard и R8;
— разберемся, как внедрять ProGuard/R8 в существующий проект.

Делиться экспертизой будет преподаватель-практик курса Антон Казаков (Руководитель направления Android-разработки одного из крупнейших банков России). Не упустите возможность задать ему все интересующие вопросы!

Чтобы попасть на курс с welcome-скидкой прямо сейчас, пройдите вступительный тест!
Читать полностью
Где хранятся данные onSaveInstanceState()?

Метод onSaveInstanceState() используется для сохранения состояния активити при изменении конфигурации.
onSaveInstanceState() сохраняет данные в объекте Bundle, который реализует ассоциативный массив (хранилище вида ключ-значение).

Ранее мы писали, что данные, сохраненные через onSaveInstanceState(), переживают остановку процесса приложения. Это значит, что Bundle хранится не в памяти приложения.

Также известно, что onSaveInstanceState() не сохраняет данные на диске. Это можно понять потому, что состояния приложений не могут быть восстановлены после перезагрузки девайса. Кроме того документация класса Parcel, который используется для сохранения Parcelable объектов в Bundle, не рекомендует использовать Parcel для persistent storage.

Где же сохраняется Bundle из onSaveInstanceState()?

Ответ: в системном классе ActivityManagerService, о котором мы уже писали в посте о запуске приложения.

Для каждой запущенной активити создается инстанс класса ActivityRecord. Этот класс имеет поле icicle типа Bundle. Именно в это поле сохраняется состояние после вызова onSaveInstanceState().

При остановке активити Bundle отправляется в системный процесс через Bindler IPC. Далее на классе ActivityManagerService вызывается метод activityStopped(), который принимает объект Bundle. Этот метод находит ActivityRecord, соответствующий остановленной активити и записывает полученный Bundle в поле icicle класса ActivityRecord.

Данная реализация не задокументирована и может быть изменена в будущих версиях Android.

#OS
#State
Читать полностью
Канал с книгами по разработке приложений под ОС Android

Библиотека содержит полезные материалы как для новичка, так и профессионала.

t.me/android_books_channel
Является ли ViewModel заменой onSaveInstanceState()?

– Нет. ViewModel и onSaveInstanceState() используются в разных ситуациях.

onSaveInstanceState() предназначен для сохранения небольшого количества данных, которые позволяют восстановить состояние UI в следующих случаях:

• Остановка процесса приложения для восстановления ресурсов памяти;

• Изменение конфигурации.

Не следует использовать onSaveInstanceState() для сохранения больших массивов данных.

ViewModel переживает только изменение конфигурации, но уничтожается при остановке процесса. Это делает ViewModel менее универсальным механизмом, чем onSaveInstanceState(), но позволяет сохранять большие объекты во время изменения конфигурации и пересоздания активити.

#Jetpack
#State
Читать полностью
Только до 12 марта 2020 г. и только в ТЕХНОПАРК при оформлении предзаказа на Samsung Galaxy S20| S20+| S20 Ultra — наушники Samsung Galaxy Buds+ в подарок!

Забирай бесплатные наушники! 📱🎧

https://clc.to/xXqZOQ
Только до 12 марта 2020 г. и только в ТЕХНОПАРК при оформлении предзаказа на Samsung Galaxy S20| S20+| S20 Ultra — наушники Samsung Galaxy Buds+ в подарок!

Забирай бесплатные наушники! 📱🎧

https://clc.to/xXqZOQ
Примеры паттернов и антипаттернов использования LiveData и ViewModel

https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54

#пятница
Для чего нужен класс ViewModel из Architecture Components?

ViewModel – абстрактный класс, упрощающий реализацию паттерна MVVM в Android-приложении.

В общем случае ViewModel используется следующим образом:

1. Создается наследник класса ViewModel, который реализует VM-логику в MVVM компоненте.

2. Объект ViewModel инстанциируется во View-слое (активити или фрагменте) с помощью delegated property viewModels():

val viewModel: MyViewModel by viewModels()

3. Активити или фрагмент использует объект viewModel для получения обновлений UI.

Объект, созданный с помощью by viewModels() переживает пересоздание активити и фрагмента при изменении конфигурации (например при повороте экрана).

Объект ViewModel уничтожается только в случае, если соответсвующий View-класс не пересоздается. Для активити это происходит, когда вызывается onDestroy() после вызова метода finish(). В случае фрагмента – после вызова onDetach().

При уничтожении объекта ViewModel вызывается метод onCleared().

#Jetpack
Читать полностью