Разработчики Android несут ответственность за разработку и улучшение мобильных приложений на платформе Android. Во время собеседования вы можете сосредоточиться на портфолио ваших кандидатов и прошлом опыте, чтобы определить тех, кто может повысить ценность вашей компании, внедряя инновационные идеи. Вы также можете использовать эти вопросы вместе с заданием, чтобы проверить способность кандидатов писать функциональный код и разрабатывать удобные для пользователя приложения.
Мы поделимся 18 вопросами и ответами на собеседование по Android, которые станут для вашего кандидата хорошей проверкой, а также получим полезное представление об их отношении к разработке Android.
18 вопросов для собеседования с Android разработчиком
1. В чем разница между неявным и явным намерением?
Явное намерение , где вы сообщаете систему, активность или компонент системы, который следует использовать , чтобы реагировать на это намерение. Неявные намерения позволяют вам объявить действие, которое вы хотите выполнить; Затем система Android проверит, какие компоненты зарегистрированы для обработки этого действия.
Здесь вы ищете понимание того, когда следует использовать каждый тип намерения, поскольку в подавляющем большинстве случаев вы будете использовать явные намерения для запуска компонентов в собственном приложении, в то время как неявные намерения чаще всего используются для связи с компоненты из сторонних приложений.
2. Когда следует использовать фрагмент, а не действие? Это все еще очень обсуждаемая тема, но код, используемый для создания Activity, существенно более сложен, чем код, используемый для создания фрагмента. Старое действие должно быть уничтожено, приостановлено или остановлено, а новое действие должно быть создано. Разработчик должен признать, что лучше всего использовать Activity только тогда, когда вам нужно поменять местами весь экран, и использовать фрагменты повсюду.
Бонусные баллы, если разработчик Android упоминает любой из следующих вариантов использования, в которых вы почти всегда будете использовать фрагмент, а не действие:
- Когда вы работаете с компонентами пользовательского интерфейса или поведением, которое вы собираетесь использовать в нескольких Activity.
- Когда вы используете один из методов навигации, которые тесно связаны с фрагментами, например, прокрутки.
- Когда вашим пользователям будет полезно видеть два разных макета рядом.
- Когда у вас есть данные, которые должны сохраняться при перезапусках Activity (т.е. вам нужно использовать сохраненные фрагменты).
3. Вы заменяете один фрагмент другим - как обеспечить, чтобы пользователь мог вернуться к предыдущему фрагменту, нажав кнопку «Назад»? Этот вопрос дает представление о том, как разработчик приложения понимает жизненный цикл динамических фрагментов, а также транзакций фрагментов и обратного стека.
Если кнопка «Назад» вернет пользователя к предыдущему фрагменту, тогда вам нужно будет сохранять каждую транзакцию фрагмента в задний стек, вызывая эту транзакцию addToBackStack()перед вами commit().
Разработчик определенно не должен предлагать создавать кнопку «Назад» специально для управления перемещением между фрагментами, но бонусные баллы, если они упоминают, что вы никогда не должны пытаться зафиксировать FragmentTransaction после вызова onSaveInstanceState(), так как это может привести к исключению.
4. Как бы вы могли создать многопоточное приложение для Android без использования класса Thread?
Если вам нужно только переопределить run()метод, а не другие методы Thread, вам следует реализовать Runnable.
В частности, на смотровой для андроида разработчика , демонстрирующего понимание того, что вы должны только расширить из класса , когда вам нужно изменить некоторые из его функциональных возможностей .
5. Что такое пул потоков? И действительно ли это более эффективно, чем использование нескольких отдельных потоков?
ThreadPool состоит из очереди задач и группы рабочих потоков, что позволяет ему запускать несколько параллельных экземпляров задачи.
Здесь вы оцениваете понимание разработчиком приложения того, как многопоточность может улучшить производительность приложения, а также как она может отрицательно повлиять на производительность при неправильном использовании.
Использование ThreadPool более эффективно, чем ожидание выполнения нескольких операций в одном потоке, но оно также помогает избежать значительных накладных расходов на создание и уничтожение потока каждый раз, когда вам требуется рабочий поток.
6. Какая связь между жизненным циклом AsyncTask и жизненным циклом Activity? К каким проблемам это может привести и как их избежать?
AsyncTask не связан с жизненным циклом деятельности , который его содержит. Если Activity уничтожается и создается новый экземпляр Activity, AsyncTask не будет уничтожен. Это может привести к ряду проблем, но основные из них, о которых должен знать разработчик Android:
После завершения AsyncTask он попытается обновить предыдущий экземпляр Activity, что приведет к исключению IllegalArgumentException.
Поскольку AsyncTask поддерживает ссылку на предыдущий экземпляр Activity, это Activity не будет собираться мусором, что приведет к утечке памяти.
Решение состоит в том, чтобы избегать использования AsyncTasks для длительных фоновых задач.
7. Как бы вы могли получить доступ к данным в ContentProvider?
Для начала убедитесь, что у вашего приложения Android есть необходимые разрешения на чтение. Затем получите доступ к объекту ContentResolver, вызвав getContentResolver()объект Context и получив данные, создав запрос с использованием ContentResolver.query().
ContentResolver.query()Метод возвращает курсор, так что вы можете получить данные из каждого столбца с использованием методов управления курсором.
Доступ к данным - одна из задач, которая, скорее всего, заблокирует основной поток, поэтому разработчик должен подчеркнуть важность выполнения запросов к данным в отдельном потоке.
8. В чем разница между Serializable и Parcelable?
Serializable - это стандартный интерфейс Java, который легко интегрировать в ваше приложение, поскольку он не требует никаких методов. Несмотря на простоту реализации, Serializable использует API отражения Java, что делает его медленным процессом, создающим множество временных объектов.
Parcelable оптимизирован для Android, поэтому он быстрее, чем Serializable. Он также полностью настраивается, поэтому вы можете четко указать процесс сериализации, что приведет к уменьшению количества мусорных объектов.
Хотя разработчик может признать, что реализация Parcelable требует дополнительной работы, преимущества в производительности означают, что им следует рекомендовать использовать Parcelable вместо сериализации, где это возможно.
9. Что такое адаптер?
Здесь вы проверяете, понимает ли разработчик Android, что вам нужен дополнительный компонент для подключения AdapterView (например, ListView или GridView) к внешнему источнику данных. Адаптер действует как этот мост, а также отвечает за преобразование каждой записи данных в представление, которое затем можно добавить в AdapterView.
10. Что такое ошибка приложения «Не отвечает» (ANR) и как предотвратить ее появление в своем приложении?
Этот вопрос проверяет, знает ли разработчик о золотом правиле многопоточности в Android: никогда не выполняйте длительные или интенсивные операции с основным потоком.
Диалоговое окно ANR появляется, если ваш пользовательский интерфейс не отвечает более 5 секунд, обычно из-за того, что вы заблокировали основной поток. Чтобы избежать ошибок ANR, вам следует перенести как можно больше работы из основного потока.
11. Опишите процесс создания пользовательских представлений.
Это сложная тема, поэтому вам нужен только общий обзор необходимых шагов. Однако разработчик должен прояснить, что вы всегда должны создавать подкласс View, который больше всего похож на настраиваемый компонент, который вы хотите создать - очень редко вы расширяете класс View.
После расширения класса вам необходимо выполнить следующие шаги:
- Создайте файл res / values / attrs.xml и объявите атрибуты, которые вы хотите использовать в своем пользовательском представлении.
- В своем классе View добавьте метод конструктора, создайте экземпляр объекта Paint и получите свои настраиваемые атрибуты.
- Заменить либо onSizeChanged()или onMeasure().
- Нарисуйте свой вид, переопределив onDraw().
12. Что такое BuildType в Gradle? И для чего это можно использовать?
Типы сборки определяют свойства, которые Gradle использует при создании и упаковке вашего Android-приложения.
Этот вопрос позволяет вам проверить, может ли разработчик различать разновидности продукта, варианты сборки и типы сборки, поскольку это очень похожие концепции, которые часто вызывают путаницу:
Тип сборки определяет, как создается модуль, например, запускается ли ProGuard.
Аромат продукта определяет, что создается , например, какие ресурсы включены в сборку.
Gradle создает вариант сборки для всех возможных комбинаций вкусов и типов сборки вашего проекта.
13. В чем основное различие между ListView и RecyclerView?
Между ListView и RecyclerView есть много различий , но разработчик Android должен знать, в частности, следующее:
- Шаблон ViewHolder не является обязательным в ListView, но он встроен в RecyclerView.
- ListView поддерживает только вертикальную прокрутку, но RecyclerView не ограничивается списками с вертикальной прокруткой.
14. Кратко опишите некоторые способы оптимизации использования представления.
Существует несколько методов, но наиболее эффективными являются следующие:
- Проверка на чрезмерную перегрузку : установите приложение на устройство Android, а затем включите параметр «Обзор отладки графического процессора».
- Сглаживание иерархии представлений : проверьте иерархию представлений с помощью инструмента Android Studio «Просмотр иерархии».
- Измерение времени, необходимого каждому представлению для выполнения этапов измерения, макета и рисования. Вы также можете использовать Hierarchy Viewer, чтобы определить любые части конвейера рендеринга, которые необходимо оптимизировать.
15. Для чего обычно используется Handler?
Вы используете Handler для связи между потоками, чаще всего для передачи действия из фонового потока в основной поток Android.
Этот вопрос позволяет вам проверить, понимает ли разработчик еще одну фундаментальную концепцию многопоточности в Android: вы не можете обновлять пользовательский интерфейс из любого потока, кроме основного.
16. Какие шаги необходимы для создания связанной службы с помощью языка определения интерфейса Android (AIDL)?
Определите интерфейс AIDL в файле .aidl.
Сохраните этот файл в каталоге src / приложения, в котором размещается Activity, и любого другого приложения, которое необходимо привязать к этой службе - последнее особенно важно и часто игнорируется.
Создайте свое приложение. Инструменты Android SDK затем сгенерируют файл интерфейса IBinder в вашем каталоге gen.
Реализуйте этот интерфейс, расширив сгенерированный интерфейс Binder и реализовав методы, унаследованные от файла .aidl.
Расширьте Service и переопределите, onBind()чтобы вернуть вашу реализацию класса-заглушки.
17. В чем разница между onCreate () и onStart ()?
Метод onCreate () вызывается один раз в течение жизненного цикла Activity, либо при запуске приложения, либо когда Activity было уничтожено, а затем воссоздано, например, во время изменения конфигурации.
Метод onStart () вызывается всякий раз, когда Activity становится видимым для пользователя, обычно после onCreate()или onRestart().
18. Когда можно использовать FrameLayout?
Здесь вы хотите понять, что вы всегда должны использовать максимально простой макет для того, чего вы хотите достичь, поскольку FrameLayouts предназначены для содержания одного элемента, что делает их эффективным выбором, когда вам нужно отображать одно представление.
Если вы добавляете несколько представлений в FrameLayout, они складываются друг над другом, поэтому FrameLayouts также полезны, если вам нужны перекрывающиеся представления, например, если вы реализуете наложение или элемент HUD.
Завершите собеседование с разработчиками Android
Технические собеседования и просмотры являются важной частью найма разработчика приложения, будь то разработчик Android, разработчик iOS или любой разработчик мобильных приложений, знакомый с созданием приложений для обеих операционных систем. С помощью этих вопросов для собеседования вы сможете должным образом проверить технические навыки ваших кандидатов в разработке Android, даже если вы не знакомы с этой технологией.