— Что будет, если мы вызовем finish() в одном из колбэков жизненного цикла, а чуть дальше напишем что-то еще?
Выполнится весь метод и только потом произойдет завершение. Почему так?
Все методы жизненного цикла всегда обрабатываются в главном потоке в порядке очереди. И вот если мы вызовем finish() в одном из методов жизненного цикла, то в эту очередь добавится сообщение, но оно не будет выполнено, пока не вернется выполняемый callback, т.е. пока главный поток не освободится от текущей задачи.
— Когда в activity вызывается finish(), какие методы жизненного цикла вызываются?
onPause — onStop — onDestroy. Тут важно, что метод onSaveInstanceState не вызывается, потому что активити полностью уничтожается.
Выполнится весь метод и только потом произойдет завершение. Почему так?
Все методы жизненного цикла всегда обрабатываются в главном потоке в порядке очереди. И вот если мы вызовем finish() в одном из методов жизненного цикла, то в эту очередь добавится сообщение, но оно не будет выполнено, пока не вернется выполняемый callback, т.е. пока главный поток не освободится от текущей задачи.
— Когда в activity вызывается finish(), какие методы жизненного цикла вызываются?
onPause — onStop — onDestroy. Тут важно, что метод onSaveInstanceState не вызывается, потому что активити полностью уничтожается.
Немного про исключения — https://zen.yandex.ru/media/android_junior/rasskaji-chto-ty-znaesh-pro-iskliucheniia-sobesedovanie-6232399b1eaba10787ccd1d3
Дзен | Статьи
Расскажи, что ты знаешь про исключения. Собеседование.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Если честно, я не думаю, что меня такое спросят. Но хочется разобрать что-то легкое, так что просто вспомним исключения.
Какая разница между val и var?
Такое точно не спросят, но просто повторим для общего образования.
var — изменяемое значение. Переменная может изменить свое значение с одного на другое. Это аналогично тому как мы в Java объявляем переменные.
val — переменная, которая разрешает чтение, но запрещает запись. Из этого следует, что val должна быть проинициализирована сразу, потому что она не может меняться после создания.
Такое точно не спросят, но просто повторим для общего образования.
var — изменяемое значение. Переменная может изменить свое значение с одного на другое. Это аналогично тому как мы в Java объявляем переменные.
val — переменная, которая разрешает чтение, но запрещает запись. Из этого следует, что val должна быть проинициализирована сразу, потому что она не может меняться после создания.
Разница между const и val
Оба слова используются для объявления неизменяемой переменной. Так в чем же разница?
const используется для объявления тех свойств, которые являются неизменяемыми по своей природе, т.е. они должны определяться во время компилирования. Во время выполнения константу нельзя объявить и проинициализировать.
Для констант есть несколько требований:
— Должна быть на уровне top-level или членом object или companion object
— Это должна быть строка или примитивный тип;
— Без кастомных геттеров.
Из этого следует, что мы не можем сделать константой какую-то функцию или класс, потому что они инициализируются в рантайме.
val мы можем инициализировать в рантайме. Например, можно в коде написать что-то в стиле valCatName = getCatName() и оно будет работать.
Зачем использовать const, если можно всегда использовать val? Когда мы используем константу, то она создается во время компиляции и не будет никаких дополнительных расходов во время выполнения.
Оба слова используются для объявления неизменяемой переменной. Так в чем же разница?
const используется для объявления тех свойств, которые являются неизменяемыми по своей природе, т.е. они должны определяться во время компилирования. Во время выполнения константу нельзя объявить и проинициализировать.
Для констант есть несколько требований:
— Должна быть на уровне top-level или членом object или companion object
— Это должна быть строка или примитивный тип;
— Без кастомных геттеров.
Из этого следует, что мы не можем сделать константой какую-то функцию или класс, потому что они инициализируются в рантайме.
val мы можем инициализировать в рантайме. Например, можно в коде написать что-то в стиле valCatName = getCatName() и оно будет работать.
Зачем использовать const, если можно всегда использовать val? Когда мы используем константу, то она создается во время компиляции и не будет никаких дополнительных расходов во время выполнения.
Когда не вызывается onPause и onStop?
Если в onCreate будет finish(). Аналогично, если finish() будет в onStart(), то вызовутся все методы, начиная с парного, т.е. с onStop.
Если finish() поставим в onResume(), то вызовутся все методы, начиная с onPause.
Может ли так быть, что не вызовется onDestroy?
Такое действительно может быть, поэтому не стоит использовать этот метод для сохранения данных. Бывают ситуации, когда система может убить процесс, которому принадлежит активити, не вызывая этот метод.
Ну и вспомнила еще один похожий вопрос. Может ли быть, что не вызовется finally?
Да, и таких вариантов на самом деле много:
— Вызываем System.exit(0) в блоке try;
— У JVM закончилась память;
— Наш джава-процесс убит;
— Дедлок в блоке try;
— Когда наше устройство выключается (например, из-за зарядки).
Если в onCreate будет finish(). Аналогично, если finish() будет в onStart(), то вызовутся все методы, начиная с парного, т.е. с onStop.
Если finish() поставим в onResume(), то вызовутся все методы, начиная с onPause.
Может ли так быть, что не вызовется onDestroy?
Такое действительно может быть, поэтому не стоит использовать этот метод для сохранения данных. Бывают ситуации, когда система может убить процесс, которому принадлежит активити, не вызывая этот метод.
Ну и вспомнила еще один похожий вопрос. Может ли быть, что не вызовется finally?
Да, и таких вариантов на самом деле много:
— Вызываем System.exit(0) в блоке try;
— У JVM закончилась память;
— Наш джава-процесс убит;
— Дедлок в блоке try;
— Когда наше устройство выключается (например, из-за зарядки).
https://zen.yandex.ru/media/android_junior/content-provider-chto-eto-623623a623af6b76efa08cd8 — утро начинается с Content Provider :)
Дзен | Статьи
Content Provider. Что это?
Статья автора «Блог Android-разработчицы» в Дзене ✍: Мы знаем, что каждое приложение живет в отдельном процессе. Но иногда так бывает, что мы хотим получить доступ к данным из другого приложения.
Сегодня разберем немного простых вопросов.
Что ты знаешь про lateinit?
Это один из самых спорных инструментов. Его или любят и везде используют или опасаются и яростно оберегают проект от подобного.
Довольно часто бывает, что мы хотим объявить переменную, но проинициализировать её позже. Конечно, можно сделать private var cat: String? = null, но что если переменная не должна быть null?
Тут нам поможет слово lateinit. Оно позволяет объявить переменную, но проинициализировать её в другом месте. И вот тут самый большой подвох. Может случиться так, что мы попробуем получить значение до того, как присвоим его переменной. И тогда мы получим UninitializedPropertyAccessException. Поэтому, если не уверены, то лучше предварительно проверять через this::cat.isInitialized (выражение вернет true или false), а потом уже пытаться получить значение.
Я отношусь к тем людям, которые предпочитают не использовать lateinit. Мы не роботы и обязательно случится так, что мы где-то попробуем получить значение раньше или что-то случится и в итоге приложение упадет с исключением.
Кстати, тут еще можно добавить, что lateinit как раз используется в даггере при инжекте объекта. Но тогда стоит ожидать, что собеседующий дальше спросит про даггер и перейдет к этой теме.
Что ты знаешь про lateinit?
Это один из самых спорных инструментов. Его или любят и везде используют или опасаются и яростно оберегают проект от подобного.
Довольно часто бывает, что мы хотим объявить переменную, но проинициализировать её позже. Конечно, можно сделать private var cat: String? = null, но что если переменная не должна быть null?
Тут нам поможет слово lateinit. Оно позволяет объявить переменную, но проинициализировать её в другом месте. И вот тут самый большой подвох. Может случиться так, что мы попробуем получить значение до того, как присвоим его переменной. И тогда мы получим UninitializedPropertyAccessException. Поэтому, если не уверены, то лучше предварительно проверять через this::cat.isInitialized (выражение вернет true или false), а потом уже пытаться получить значение.
Я отношусь к тем людям, которые предпочитают не использовать lateinit. Мы не роботы и обязательно случится так, что мы где-то попробуем получить значение раньше или что-то случится и в итоге приложение упадет с исключением.
Кстати, тут еще можно добавить, что lateinit как раз используется в даггере при инжекте объекта. Но тогда стоит ожидать, что собеседующий дальше спросит про даггер и перейдет к этой теме.
https://zen.yandex.ru/media/android_junior/dataklassy-v-kotline-623b8930e3bb621ab12ced3b?& — немного про дата-классы. То, что почти всегда спрашивают на собеседованиях.
Дзен | Статьи
Дата-классы в котлине.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Вопрос, кстати, довольно популярный. Среди джуниоров точно, но и повыше уровнем встречается. Давайте попробуем ответить.
Как запустить компонент андроида в другом процессе?
Тут нам поможет android:process="имя_процесса" в манифесте.
Обычно все компоненты приложения выполняют в процессе, созданным для приложения. Но бывают ситуации, когда нужно какой-то компонент вынести в другой процесс. За три года моей работы я встречала такое только один раз. Но встречала же, так что вполне реальная ситуация.
Если имя указанного процесса начинается с ':', то создается новый процесс. Если двоеточия нет, то будет выполняться в существующем процессе с таким именем. Так разные компоненты в разных приложениях могут использовать один процесса, тем самым сокращая потребление ресурсов.
Новый процесс — достаточно тяжелое действие, так что лучше его не использовать, если это не необходимо.
Тут нам поможет android:process="имя_процесса" в манифесте.
Обычно все компоненты приложения выполняют в процессе, созданным для приложения. Но бывают ситуации, когда нужно какой-то компонент вынести в другой процесс. За три года моей работы я встречала такое только один раз. Но встречала же, так что вполне реальная ситуация.
Если имя указанного процесса начинается с ':', то создается новый процесс. Если двоеточия нет, то будет выполняться в существующем процессе с таким именем. Так разные компоненты в разных приложениях могут использовать один процесса, тем самым сокращая потребление ресурсов.
Новый процесс — достаточно тяжелое действие, так что лучше его не использовать, если это не необходимо.
👍1
Разбираем сложности — https://zen.yandex.ru/media/android_junior/chto-ty-znaesh-pro-dalvik-i-art-623720033c14f46c081849fe
Дзен | Статьи
Что ты знаешь про Dalvik и Art?
Статья автора «Блог Android-разработчицы» в Дзене ✍: Сейчас будет сложно. Dalvik и Art — это две виртуальные машины, которые были разработаны специально для Android.
❤1
Вспоминаем основное про манифест.
Обычно про него задают довольно поверхностные вопросы, так что кратко пройдемся. Впрочем, много про него и не рассказать.
Манифест — то, что должно быть в каждом приложении. Там описывается основная информация о нашем приложении для ОС Андроид, Google Play и инструментов сборки.
В манифесте обязательно должны быть указаны:
— Компоненты, которые мы используем, и их имена. Если не укажем, то система не сможет стартовать компонент. Интент-фильтры, если используем.
— Необходимые разрешения, в которых приложение нуждается. А еще разрешения, которые другие приложения должны иметь, чтобы получить доступ к данным нашего приложения. Начиная с 6 андроида пользователь может отклонять какие-то разрешения в рантайме. Но мы все равно должны указать их в манифесте.
— Различные требования к девайсам, которые необходимы для корректной работы приложения. Например, минимальная версия системы.
Что можно спросить?
— Что за интент-фильтры?
— А что там с разрешениями? Какие знаешь и какие нужны?
Обычно про него задают довольно поверхностные вопросы, так что кратко пройдемся. Впрочем, много про него и не рассказать.
Манифест — то, что должно быть в каждом приложении. Там описывается основная информация о нашем приложении для ОС Андроид, Google Play и инструментов сборки.
В манифесте обязательно должны быть указаны:
— Компоненты, которые мы используем, и их имена. Если не укажем, то система не сможет стартовать компонент. Интент-фильтры, если используем.
— Необходимые разрешения, в которых приложение нуждается. А еще разрешения, которые другие приложения должны иметь, чтобы получить доступ к данным нашего приложения. Начиная с 6 андроида пользователь может отклонять какие-то разрешения в рантайме. Но мы все равно должны указать их в манифесте.
— Различные требования к девайсам, которые необходимы для корректной работы приложения. Например, минимальная версия системы.
Что можно спросить?
— Что за интент-фильтры?
— А что там с разрешениями? Какие знаешь и какие нужны?
👍1
https://zen.yandex.ru/media/id/5ddd77e9f4882e4380666d35/62409bac1717ba751231bc2d — немного про даггер
Дзен | Статьи
Dagger. Вопросы на собеседовании.
Статья автора «Блог Android-разработчицы» в Дзене ✍: На самом деле меня никогда не спрашивали о таком, но я много читала, что на собеседованиях вопросы часто встречаются. Попробуем поразмышлять.
Доброе утро :) Немного про солид — https://zen.yandex.ru/media/android_junior/solid--bukovki-kotorye-sprosiat-na-liubom-sobesedovanii-624dd0386fbedf720e838a6e
Дзен | Статьи
SOLID — буковки, которые спросят на любом собеседовании.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Что это вообще за буквы и почему они так важны?
Очень кратко про рефлексию.
Рефлексия — это специальное API, которое позволяет получить доступ к данным приложения во время выполнения.
С помощью рефлексии мы можем узнать кучу всего о классах, методах и т.п. А еще мы можем получить приватные поля и даже изменить их значения. И можем создавать экземпляры класса прямо во время выполнения.
Рефлексия работает через java.lang.Class. JVM создает его для каждого объекта и именно через него мы можем всё делать.
Почему не любят рефлексию? Чуть выше я писала, что так мы можем получать доступ к приватным полям и менять значения. И тут мы напрочь ломаем инкапсуляцию и архитектуру приложения. Плюс дополнительно из-за того что мы все делаем динамически, снижается производительность. Ну и код, написанный с помощью рефлексии, довольно сложный и запутанный.
Рефлексия — это специальное API, которое позволяет получить доступ к данным приложения во время выполнения.
С помощью рефлексии мы можем узнать кучу всего о классах, методах и т.п. А еще мы можем получить приватные поля и даже изменить их значения. И можем создавать экземпляры класса прямо во время выполнения.
Рефлексия работает через java.lang.Class. JVM создает его для каждого объекта и именно через него мы можем всё делать.
Почему не любят рефлексию? Чуть выше я писала, что так мы можем получать доступ к приватным полям и менять значения. И тут мы напрочь ломаем инкапсуляцию и архитектуру приложения. Плюс дополнительно из-за того что мы все делаем динамически, снижается производительность. Ну и код, написанный с помощью рефлексии, довольно сложный и запутанный.
Немного про фрагменты — https://zen.yandex.ru/media/android_junior/fragment-i-ego-jiznennyi-cikl-6244b24dbbdad86f49814af1
Дзен | Статьи
Фрагмент и его жизненный цикл.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Изначально фрагменты придумали когда-то давно (в android 3), потому что люди стали пользоваться планшетами и там приложения растягивались и...
Небольшие итоги по собеседованиям — https://zen.yandex.ru/media/android_junior/itogi-testovyh-sobesedovanii-6266fce322e6cb08a4fbb5bc
Дзен | Статьи
Итоги тестовых собеседований.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Недавно я проходила несколько тестовых собеседований. Цель была довольно простой: понять какие есть пробелы и пообщаться с другими разработчиками.
👍4
А я наконец-то попробовала новый datastore. Он и правда такой удобный, как о нём все рассказывают — https://zen.yandex.ru/media/android_junior/poprobovala-preferences-datastore-627d310bdc17f5097db75395?&
Дзен | Статьи
Попробовала Preferences DataStore
Статья автора «Блог Android-разработчицы» в Дзене ✍: В начала года Google представил новый вариант сохранения взамен SharedPreferences.
Вчера немного занималась UI и поняла, что многие не помнят про такую крутую штуку как Barrier и продолжают оборачивать вьюшки в дополнительные Layout — https://zen.yandex.ru/media/android_junior/zachem-nujen-barrier-uproscaem-verstku-v-constraintlayout-6282920d4434fb3ce4981c50
Дзен | Статьи
Зачем нужен Barrier? Упрощаем верстку в ConstraintLayout.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Часто бывает такая ситуация: мы используем ConstraintLayout и там есть какой-то ряд элементов и под ним еще один элемент.
👍1
https://www.educative.io/courses/grokking-the-behavioral-interview — закончила курс по подготовке к собеседованию. Он бесплатный, поэтому многого я не ожидала от него, но на самом деле довольно хороший. Не зря educative советуют для подготовки.
Из интересного: очень много вопросов, которые вам могут задать, примеры ответов на них и возможность самостоятельно записать ответ на видео и посмотреть как ты выглядишь.
Из минусов: сертификат никак не купить. У меня не сработал ни один способ. Но тут уж сайт не виноват. 😔
Из интересного: очень много вопросов, которые вам могут задать, примеры ответов на них и возможность самостоятельно записать ответ на видео и посмотреть как ты выглядишь.
Из минусов: сертификат никак не купить. У меня не сработал ни один способ. Но тут уж сайт не виноват. 😔
www.educative.io
Grokking the Behavioral Interview - Free AI-Powered Course
The ultimate guide to behavioral interviews. Developed by FAANG engineers. Use real-world questions, video recording, and structured strategies to get interview-ready in just a few hours.
Немного про раскрашивание текста — https://zen.yandex.ru/media/android_junior/kak-raskrasit-tekst-v-prilojenii-629365697faaea548ef20cf0
Дзен | Статьи
Как раскрасить текст в приложении?
Статья автора «Блог Android-разработчицы» в Дзене ✍: Мы все знаем как сделать весь текст другого цвета. Но что делать, если приходит дизайнер и приносит макет, а там каждое слово разного цвета?