15 неотъемлемых вопросов любого интервью по Android
15 вопросов по Android, которые вы можете встретить на любом собеседовании. Будьте готовы к ним заранее - читайте нашу статью.
Наша статья состоит из 15 вопросов любого собеседования по Android. С их помощью вы сможете произвести нужное впечатление на своего интервьюера.
Вопрос №1.
Существует четыре класса Java, связанные с использованием датчиков на платформе Android. Назовите их и объясните цель каждого.
Четыре класса Java, связанные с использованием датчиков на платформе Android:
- Sensor: Предоставляет методы для определения возможностей, которые доступны конкретному датчику.
- SensorManager: Предоставляет методы регистрации активности с датчиков и их калибровки.
- SensorEvent: Предоставляет необработанные данные датчика, включая информацию о точности.
- SensorEventListener: Интерфейс, который определяет методы обратного вызова, которые будут получать уведомления о событиях датчика.
Вопрос №2.
Что такое ContentProvider и для чего его используют?
ContentProvider управляет доступом к структурированному набору данных. Он инкапсулирует данные и предоставляет механизмы для определения их безопасности. ContentProvider - это стандартный интерфейс, который соединяет данные в одном процессе с кодом, запущенным в другом процессе.
Вопрос №3.
При каких условиях код ниже может привести к краху вашего приложения? Как бы вы изменили его, чтобы избежать этой потенциальной проблемы? Поясните свой ответ.
Implicit intent определяет действие, которое может вызывать любое приложение на устройстве, способном его выполнить.
Его полезно использовать в случае если другие приложения могут выполнить действие, которое невозможно для вашего. Если зарегистрировано более одного приложения, которое может обрабатывать подобный запрос, пользователю будет предложено выбрать, какой из них использовать.
Однако, возможно и то, что приложений, способных выполнить ваше намерение не будет. В этом случае приложение даст сбой при вызове startActivity(). Во избежание этого, перед тем, как вызвать startActivity(),вы должны сначала убедиться, что есть хотя бы одно приложение, зарегистрированное в системе, способное обрабатывать намерение. Для этого используйте resolveActivity() для вашего объекта intent:
// Убедитесь что существует приложение, способное обработать этот intent
// (если resolveActivity возвращает null если таких нет)
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
Вопрос №4.
Последний обратный вызов в жизненном цикле активности - onDestroy(). Система вызывает его в качестве последнего сигнала о том, что экземпляр активности полностью удаляется из системной памяти. Обычно система вызывает onPause() и onStop() перед вызовом onDestroy(). Опишите сценарий, когда onPause() и onStop() не будут вызываться.
onPause()и onStop()не будут вызываться, если finish()вызывается из метода onCreate(). Это может произойти, например, при обнаружении ошибки во время вызова onCreate()и finish(). В таком случае, однако, любая очистка, которую вы ожидали сделать с помощью onPause()и onStop()не будет выполнена.
Хотя onDestroy() - это последний обратный вызов в жизненном цикле активности, стоит упомянуть, что он не всегда может быть вызван и не должен использоваться для уничтожения ресурсов. Лучше иметь ресурсы, созданные в onStart () и onResume (), и уничтожить их в onStop () и onPause соответственно.
Вопрос №5.
Какой из приведенных ниже фрагментов кода является правильным способом проверить, присутствует ли в системе датчик компаса? Объясните свой ответ.
Ответ №1
PackageManager m = getPackageManager();
if (!m.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
// This device does not have a compass, turn off the compass feature
}
Ответ №2
SensorManager m = getSensorManager();
if (!m.hasSystemFeature(SensorManager.FEATURE_SENSOR_COMPASS)) {
// This device does not have a compass, turn off the compass feature
}
Ответ №3
Sensor s = getSensor();
if (!s.hasSystemFeature(Sensor.FEATURE_SENSOR_COMPASS)) {
// This device does not have a compass, turn off the compass feature
}
Правильный ответ - ответ №1, вариант, в котором используется PackageManager.
SensorManager и Sensor являются частью фреймворка Android Sensor и используются для прямого доступа и сбора необработанных данных датчиков. Эти классы не предоставляют никакого метода вродеhasSystemFeature(),который используется для оценки возможностей системы.
Android определяет идентификаторы функций в виде ENUM для любой аппаратной или программной функции, которая может быть доступна на устройстве. Например, идентификатор функции для датчика компаса FEATURE_SENSOR_COMPASS.
Если ваше приложение не может работать без конкретной функции, доступной в системе, вы можете запретить пользователям устанавливать ваше приложение с <uses-feature> элементом в файле манифеста приложения, чтобы указать не подлежащую обсуждению зависимость.
Однако, если вы просто хотите отключить определенные элементы вашего приложения, когда функция отсутствует, вы можете использовать классPackageManager. PackageManagerиспользуется для извлечения различных видов информации, относящейся к пакетам приложений, которые в настоящее время установлены на устройстве.
Вопрос №6.
Опишите три общих варианта использования Intent.
Общие варианты использования Intent:
- Чтобы начать действие : вы можете запустить новый экземпляр Activity, передав Intent методу startActivity().
- Чтобы запустить службу: вы можете запустить службу для выполнения одноразовой операции (например, скачать файл), передав Intent вstartService().
- Для трансляций : Вы можете отправить трансляцию другим приложениям, передавав Intent вsendBroadcast(), sendOrderedBroadcast()или sendStickyBroadcast().
Вопрос №7.
Предположим, что вы запускаете службу в Activity следующим образом:
Intent service = new Intent(context, MyService.class);
startService(service);
где MyService обращается к удаленному серверу через Интернет-соединение. Если в Activity отображается анимация, указывающая на какой-то прогресс, с какой проблемой вы столкнетесь и как вы могли бы ее решить?
Ответы удаленной службы через Интернет часто могут занять некоторое время либо из-за сетевых задержек, либо из-за нагрузки на удаленном сервере, либо из-за количества времени, которое требуется удаленной службе для обработки и ответа на запрос.
В результате, если такая задержка происходит, анимация в активности (а что еще хуже, весь поток пользовательского интерфейса) может быть заблокирована и может стать «замороженной» для пользователя, пока клиент ждет ответа от службы. Это связано с тем, что служба запускается в основном потоке приложения (или потоке UI) в Activity.
Эта проблема может (и должна) быть предотвращена путем отнесения любых таких удаленных запросов к фоновому потоку или, когда это возможно, с использованием механизма асинхронного ответа.
Важно! Доступ к сети из потока пользовательского интерфейса вызывает исключение во время выполнения в новых версиях Android, что приводит к сбою приложения.
Вопрос №8.
Обычно, во время переориентации экрана, платформа Android сбрасывает активность переднего плана, а затем воссоздает ее из значений вида в слое активности. В приложении, над которым вы работаете, вы заметили, что после переориентации экрана значение вида не восстанавливается. Что может быть вероятной причиной проблемы, которую вы должны проверить, как минимум, по этому конкретному виду?
Вы должны убедиться, что он имеет верный id. Чтобы система Android могла восстановить состояние экрана, каждое из них должно иметь уникальный идентификатор, предоставляемый атрибутом android:id.
Вопрос №9.
Что такое DDMS? Опишите некоторые из его возможностей.
DDMS - это сервер мониторинга отладки Dalvik, который поставляется с Android. Он предоставляет широкий спектр функций отладки, включая:
- портовые услуги
- скриншот
- информация о потоке и куче
- отслеживание сетевого трафика
- входящие вызовы и SMS-спуфинг
- моделирование состояния сети, скорости и задержки
- спуфинг данных местоположения
Вопрос №10.
Какова связь между жизненным циклом AsyncTask и Activity? Какие проблемы могут появиться в связи с этим? Как можно их избежать?
AsyncTask не привязан к жизненному циклу Activity, который его содержит. Например, если вы запускаете AsyncTask внутри Activity и пользователь поворачивает устройство, активность будет уничтожена (и будет создан новый экземпляр Activity), но AsyncTask останется целым и продолжит работать до завершения.
Затем, когда AsyncTask завершает работу, вместо обновления UI новой Activity, он обновляет прежний экземпляр Activity (то есть тот, в котором он был создан, но который больше не отображается!). Это может привести к исключению (типа java.lang.IllegalArgumentException: View не подключен к оконному менеджеру, если вы используете, например, findViewByIdдля получения представления внутри Activity).
Также существует вероятность того, что это приведет к утечке памяти, так как AsyncTask поддерживает ссылку на Activity, что предотвращает сбор мусора, пока AsyncTask остается в живых.
По этим причинам использование AsyncTasks для длительных фоновых задач, как правило – плохая идея. Для них должен использоваться другой механизм (например, служба).
Вопрос №11.
Что такое Intent? Может ли он использоваться для предоставления данных ContentProvider? Объясните свой ответ.
Объект Intent является общим механизмом для начала новой активности и передачи данных от одного её вида к другому. Однако вы не можете начать ContentProvider используя Intent.
Когда вы хотите получить доступ к данным в ContentProvider, вместо этого вы должны использовать ContentResolverобъект в приложении Context для связи с провайдером в качестве клиента. Объект ContentResolver взаимодействует с объектом провайдера, являющийся экземпляром класса, который реализует ContentProvider. Объект провайдера получает запросы данных от клиентов, выполняет запрошенное действие и возвращает результаты.
Вопрос №12.
В чем разница между фрагментом и активностью? Объясните взаимосвязь между ними.
Активность , как правило, одиночная, целенаправленная операция, которую может выполнять пользователь (например, набрать номер, сделать снимок, отправить email, просматривать карту, и т.д.). Но в то же время нет ничего, что помешало бы разработчику произвольно создать сложную активность.
Реализации активности могут дополнительно использовать класс Fragment для создания более модульного кода, более сложных пользовательских интерфейсов для больших экранов, помощи в масштабировании приложения между малыми и большими экранами и т. д. Несколько фрагментов могут быть объединены в пределах одной активности, и, наоборот, один и тот же фрагмент часто можно использовать повторно для нескольких активностей. Эта структура в основном предназначена для содействия повторному использованию кода и облегчению масштабирования.
Фрагмент представляет собой модульный раздел активности с собственным жизненным циклом и входными событиями, который может быть добавлен или удален по желанию. Однако важно помнить, что жизненный цикл фрагмента напрямую зависит от жизненного цикла его хост-активности; т. е. когда активность приостановлена, все фрагменты в ней также будут приостановлены, и когда активность разрушена, все ее фрагменты будут разрушены.
Вопрос №13.
В чем разница между Serializable и Parcelable? Что предпочтительнее использовать в Android?
Serializable - это стандартный Java-интерфейс. Вы просто отмечаете класс Serializable, реализуя интерфейс, и Java будет автоматически сериализовать его в определенных ситуациях.
Parcelable - это специфический для Android интерфейс, где вы сами реализуете сериализацию. Он был создан более эффективным, чем Serializable, а также для обхода некоторых проблем со схемой сериализации Java по умолчанию.
Вопрос №14.
Что такое режимы запуска? Каковы два механизма, с помощью которых они могут быть определены? Какие конкретные типы режимов запуска поддерживаются?
«Режим запуска» - это способ, которым новый экземпляр активности должен быть связан с текущей задачей.
Режимы запуска могут быть определены с использованием одного из двух механизмов:
- Файл манифеста. При объявлении активности в файле манифеста вы можете указать, как она должна ассоциироваться с задачами при ее запуске. Поддерживаемые значения:
- standard(по умолчанию). Несколько экземпляров класса активности могут быть созданы и несколько экземпляров могут быть добавлены к одной и той же задаче или различным задачам. Это общий режим для большинства видов деятельности.
- singleTop отличается от standard тем, что если экземпляр активности уже существует в верхней части текущей задачи, и система перенаправляет намерение на это действие, новый экземпляр не будет создан, поскольку он будет запускать метод onNewIntent()вместо создания нового объекта.
- singleTask Всегда создается новая задача, а новый экземпляр будет перенесен в задание в качестве корневого. Однако, если какой-либо экземпляр активности существует в какой-либо из задач, система направляет намерение этому экземпляру активности через вызов метода onNewIntent(). В этом режиме экземпляры активности могут быть перенесены в одну и ту же задачу. Этот режим полезен для активностей, которые играют роль точек входа.
- singleInstance подобна singleTask, с той лишь разницей, что экземпляр no activities не может быть перенесен в ту же задачу singleInstance. Соответственно, активность в режиме запуска всегда находится в одной задаче экземпляра активности. Это специализированный режим и должен использоваться только в приложениях, которые реализуются как одно действие.
- Intent-флаги. Вызовы startActivity () могут содержать флаг в намерении, который объявляет, как новое действие должно быть связано с текущей задачей. Поддерживаемые значения:
- FLAG_ACTIVITY_NEW_TASK, То же, что и значение singleTaskв файле манифеста (см. выше).
- FLAG_ACTIVITY_SINGLE_TOP, То же, что и значение singleTopв файле манифеста (см. выше).
- FLAG_ACTIVITY_CLEAR_TOP, Если запущенная активность уже запущена в текущей задаче, то вместо запуска ее нового экземпляра будут уничтожены все остальные активности поверх нее, и это намерение будет передано возобновленному экземпляру активности (теперь вверх), через onNewIntent(). В файле манифеста нет соответствующего значения, которое создает такое поведение.
Вопрос №15.
В чем разница между Service и IntentService? Как они используются?
Service является базовым классом для служб Android, который может быть расширен для создания любой из них. Класс, который напрямую расширяет Service запускается в основном потоке. По этой причине он блокирует UI (если он есть) и должен использоваться только для кратковременных задач. Для более длительных задач лучше использовать другие потоки.
IntentService является подклассом Service, который обрабатывает асинхронные запросы (выраженные как «Intent») по требованию. Клиенты отправляют запросы через вызовы startService(Intent). Служба запускается по мере необходимости, по очереди обрабатывает каждую Intent с помощью рабочего потока и останавливается, когда заканчивается работа. Написание IntentServiceможет быть довольно простым; просто расширьте класс IntentService и переопределите метод onHandleIntent(Intent intent), в котором вы можете управлять всеми входящими запросами.
Другие статьи по теме
Подборка материалов по разработке под Android
Собеседование iOS-разработчика: устные вопросы по языку Swift