Android собеседование

Расскажите про реализацию метода View.onDraw()

Метод onDraw() отвечает за саму отрисовку View на экране пользователя. На вход она получает объект Canvas — холст. На канвасе можно рисовать все что угодно: 2D графику, текст, обычный и стилизованный, геометрические фигуры и много чего еще. Для рисования на…

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

Чем отличаются apply() и commit() в SharedPreferences?

Схема изменения данных, сохраненных в SharedPreferences выглядит как-то так: Так же есть вот такой вариант, покороче: В первом случае был использован apply(), во втором же commit() Разница между этими двумя методами состоит в том, что commit() выполняется в главном потоке…

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

Чем отличаются Preference и SharedPreferences?

Несмотря на схожие названия, это разные вещи, хоть и связанные. SharedPreferences — это класс, необходимый для хранения данных. Он позволяет хранить пары ключ — значение, где ключом выступает какая-то строка, а значения могут быть любым примитивом Данный способ хранения данных…

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

В чем разница между build type, flavor и build variant?

Build Type — тип сборки. Он используется чтобы задать настройки сборки. По умолчанию Android Studio создает 2 типа сборки, debug и release, но в файле build.gradle прописан только один. Тип сборки debug включает в себя полезные инструменты для отладки, а…

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

Способы выполнения кода в UI потоке. Можно ли обновлять View не из UI потока?

Обращаться к каким-нибудь элементам View не из UI потока нельзя, поэтому UI поток так и назван, что только он может обновлять вьюхи. Если попытаться обновить вьюхи не из UI потока, то вылетит CalledFromWrongThreadException. Есть несколько способов исполнить кусок кода в…

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

Сколько main activity может содержать AndroidManifest?

Main activity — это активити, которая в своем интент фильтре объявила action main и category launcher, как здесь: Action main означает, что данная активити является точкой входа в приложение, точек входа может быть несколько и у нескольких активити action main…

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

Intent resolution неявных интентов.

Intent Resolution — механизм поиска нужного компонента для вызова по неявному интенту. Когда вы используете явный интент, вы четко прописываете какой именно компонент запустить, используя же неявный интент, вы не знаете какой именно компонент будет запущен, вы знаете только что…

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

Особенности отличия Bundle от Intent

Bundle с английского означает пакет Этот класс используется для передачи данных между базовыми компонентами, например между активити или между фрагментами. Так же он используется для сохранения состояния активити при изменениях конфигурации. В этом классе реализованы методы get() и put() для…

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

Расскажите про Cursor

Cursor — возвращаемый методом query() тип. Объект данного класса представляет собой табличку, состоящую из строк и столбцов, где столбцы представляют собой выбранные поля в записи бд, а строки это и есть сами записи. Таким образом, Cursor, который возвращается методом query(),…

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

Особенности работы с данными через ContentResolver

ContentResolver имеет методы, одноименные методам ContentProvider, и выполняющие CRUD функции (create, read, update, delete). Вот список данных методов: insert() — соответствует функции create. Создает новую запись в провайдере и возвращает URI данной записи. Данные для новой записи помещаются в объект…

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

Системные контент-провайдеры в Android

Встроенных провайдеров довольно много, все их перечислять здесь будет проблематично. Но все встроенные провайдеры лежат в папке android.provider Android SDK, так что при желании можно будет все их посмотреть и изучить. Ну а к списку основных провайдеров относятся (здесь перечислены…

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

Для чего предназначен ContentProvider?

ContentProvider с английского переводится как “поставщик контента”. Это абстрактный класс и поэтому чтобы создать свой провайдер необходимо создать наследника этого класса. Бывают ситуации, когда одно приложение хочет использовать данные другого приложения. Но приложения не могут работать с чужими базами данных.…

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

Расскажите про утечку Activity / Context

Утечка активити/контекста в Android это утечка памяти, вызванная тем что активити/контекст уже уничтожены, но на них все еще есть внешние ссылки(например в статик переменной). В итоге сборщик мусора не может удалить эту активити/контекст, хотя он по сути уже бесполезен, тк…

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

Ограничения на BroadcastReceiver в Android 8.0

Начиная с версии Android 8.0 (API level 26) система начала накладывать дополнительные ограничения на ресиверы, объявленные статически через AndroidManifest.xml С этой версии Андроид больше не получится использовать статически объявленные ресиверы для получения неявных броадкастов (т.е броадкастов, которые предназначены не именно…

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

Расскажите про sticky broadcast

Sticky broadcast — это броадкаст, который сохраняется системой после отправки. Таким образом после того как вы отправили такой броадкаст, ресивер может его получить при регистрации, через возвращающее значение метода registerReceiver() (registerReceiver() возвращает Intent). В остальном это точно такой же броадкаст…

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

Способы отправки броадкастов в Android

Всего существует три способа отправить броадкаст. Использовать метод sendOrderedBroadcast(). При отправке броадкаста таким способом, он отправится последовательно по всем ресиверам, не больше чем к одному ресиверу одновременно. Причем каждый из ресиверов может либо распространить броадкаст дальше, либо не отправлять его…

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

Длительные операции в методе onReceive(). В чем их особенность?

Выполнять длительные операции в методе onReceive() не стоит. Дело в том, что если приложение не запущено, а ресивер принял какой-то броадкаст (это был статически зарегистрированный ресивер), то система запустит приложение (при этом не запустит активити, то есть приложение будет работать…

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

Основные методы жизненного цикла сервиса

Самыми важными методами жизненного цикла сервиса являются: 1. onStartCommand() Данный метод вызывается после того, как другой компонент (например активити) вызвал метод startService(). Когда данный метод был вызван, сервис запускается и живет до тех пор, пока в нем не будет вызван…

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

Назовите ограничения по фоновым сервисам в Android 8.0?

Для начала разберемся с разницей между foreground (не фоновое) и background (фоновое) приложениями. Приложение считается foreground если выполняется хотя бы один из этих пунктов: У приложения запущен foreground сервис У приложения видима какая-либо активити К приложению подключено другое foreground приложение…

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

Где и как работает Service?

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

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