Блог Android-разработчицы
849 subscribers
13 photos
179 links
ex-VK, ex-MTS, 6+ лет опыта. Team Lead

Заметки, интересные задачи с работы (в рамках NDA) и просто мои мысли.

Блог: https://dzen.ru/android_junior

Личный канал: https://t.me/android_junior_notes

Мой аккаунт: https://t.me/bagena
Download Telegram
Какая разница между val и var?

Такое точно не спросят, но просто повторим для общего образования.

var — изменяемое значение. Переменная может изменить свое значение с одного на другое. Это аналогично тому как мы в Java объявляем переменные.

val — переменная, которая разрешает чтение, но запрещает запись. Из этого следует, что val должна быть проинициализирована сразу, потому что она не может меняться после создания.
Разница между 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;
— Когда наше устройство выключается (например, из-за зарядки).
Сегодня разберем немного простых вопросов.

Что ты знаешь про lateinit?

Это один из самых спорных инструментов. Его или любят и везде используют или опасаются и яростно оберегают проект от подобного.

Довольно часто бывает, что мы хотим объявить переменную, но проинициализировать её позже. Конечно, можно сделать private var cat: String? = null, но что если переменная не должна быть null?

Тут нам поможет слово lateinit. Оно позволяет объявить переменную, но проинициализировать её в другом месте. И вот тут самый большой подвох. Может случиться так, что мы попробуем получить значение до того, как присвоим его переменной. И тогда мы получим UninitializedPropertyAccessException. Поэтому, если не уверены, то лучше предварительно проверять через this::cat.isInitialized (выражение вернет true или false), а потом уже пытаться получить значение.

Я отношусь к тем людям, которые предпочитают не использовать lateinit. Мы не роботы и обязательно случится так, что мы где-то попробуем получить значение раньше или что-то случится и в итоге приложение упадет с исключением.

Кстати, тут еще можно добавить, что lateinit как раз используется в даггере при инжекте объекта. Но тогда стоит ожидать, что собеседующий дальше спросит про даггер и перейдет к этой теме.
Как запустить компонент андроида в другом процессе?

Тут нам поможет android:process="имя_процесса" в манифесте.

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

Если имя указанного процесса начинается с ':', то создается новый процесс. Если двоеточия нет, то будет выполняться в существующем процессе с таким именем. Так разные компоненты в разных приложениях могут использовать один процесса, тем самым сокращая потребление ресурсов.

Новый процесс — достаточно тяжелое действие, так что лучше его не использовать, если это не необходимо.
👍1
Вспоминаем основное про манифест.

Обычно про него задают довольно поверхностные вопросы, так что кратко пройдемся. Впрочем, много про него и не рассказать.

Манифест — то, что должно быть в каждом приложении. Там описывается основная информация о нашем приложении для ОС Андроид, Google Play и инструментов сборки.

В манифесте обязательно должны быть указаны:

— Компоненты, которые мы используем, и их имена. Если не укажем, то система не сможет стартовать компонент. Интент-фильтры, если используем.

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

— Различные требования к девайсам, которые необходимы для корректной работы приложения. Например, минимальная версия системы.

Что можно спросить?
— Что за интент-фильтры?
— А что там с разрешениями? Какие знаешь и какие нужны?
👍1
Очень кратко про рефлексию.

Рефлексия — это специальное API, которое позволяет получить доступ к данным приложения во время выполнения.

С помощью рефлексии мы можем узнать кучу всего о классах, методах и т.п. А еще мы можем получить приватные поля и даже изменить их значения. И можем создавать экземпляры класса прямо во время выполнения.

Рефлексия работает через java.lang.Class. JVM создает его для каждого объекта и именно через него мы можем всё делать.

Почему не любят рефлексию? Чуть выше я писала, что так мы можем получать доступ к приватным полям и менять значения. И тут мы напрочь ломаем инкапсуляцию и архитектуру приложения. Плюс дополнительно из-за того что мы все делаем динамически, снижается производительность. Ну и код, написанный с помощью рефлексии, довольно сложный и запутанный.
https://www.educative.io/courses/grokking-the-behavioral-interview — закончила курс по подготовке к собеседованию. Он бесплатный, поэтому многого я не ожидала от него, но на самом деле довольно хороший. Не зря educative советуют для подготовки.

Из интересного: очень много вопросов, которые вам могут задать, примеры ответов на них и возможность самостоятельно записать ответ на видео и посмотреть как ты выглядишь.

Из минусов: сертификат никак не купить. У меня не сработал ни один способ. Но тут уж сайт не виноват. 😔
Когда я начала смотреть WorkManager, то думала, что там всё достаточно просто. Это же обычная фоновая работа и что там вообще изучать-то. Оказалось, что там очень много всего. И это я ещё не дошла до дебага и общение с воркером 🤔
👍4