С днем программиста, друзья!
Время мчится, за окном осень и приходит наш профессиональный праздник 🤗.
Сегодня 256 день в году, 12 сентября, и уже несколько лет именно в этот день отмечается день программиста.
Желаю всем нам крутых проектов, интересных задач, профессионального и личностного роста. А завтрашний день лучше используйте, чтобы провести его в теплом круге друзей, а не сидя за IDE.👨💻
Хорошего вам Дня программиста и выходных!
Время мчится, за окном осень и приходит наш профессиональный праздник 🤗.
Сегодня 256 день в году, 12 сентября, и уже несколько лет именно в этот день отмечается день программиста.
Желаю всем нам крутых проектов, интересных задач, профессионального и личностного роста. А завтрашний день лучше используйте, чтобы провести его в теплом круге друзей, а не сидя за IDE.👨💻
Хорошего вам Дня программиста и выходных!
Лимит уведомлений от одного приложения
#разработка #статьи
Задумывались ли вы, есть ли ограничение на максимальное количество уведомлений от одного приложения? Если попытаться найти какие-то упоминания об этом в документации, то там не будет какой-то внятной информации об этом. Однако, такой лимит существует.
Автор статьи провёл исследование и пришёл к выводу, что количество уведомлений от одного приложения контролируется производителем смартфонов.
Например, у Google Pixel 3A максимальное количество уведомлений равно 25, а у OnePlus 6T или Samsung — 50.
Вы можете подумать: но ведь 25 уведомлений — это много, что уж говорить про 50. Но если ваше приложение завязано на уведомлениях (например мессенджер), то такое ограничение может привести к некорректной работе приложения, и тем более сервисов.
Так что рекомендую проверить своё приложение, если оно может выводить такое количество уведомлений пользователю.
#разработка #статьи
Задумывались ли вы, есть ли ограничение на максимальное количество уведомлений от одного приложения? Если попытаться найти какие-то упоминания об этом в документации, то там не будет какой-то внятной информации об этом. Однако, такой лимит существует.
Автор статьи провёл исследование и пришёл к выводу, что количество уведомлений от одного приложения контролируется производителем смартфонов.
Например, у Google Pixel 3A максимальное количество уведомлений равно 25, а у OnePlus 6T или Samsung — 50.
Вы можете подумать: но ведь 25 уведомлений — это много, что уж говорить про 50. Но если ваше приложение завязано на уведомлениях (например мессенджер), то такое ограничение может привести к некорректной работе приложения, и тем более сервисов.
Так что рекомендую проверить своё приложение, если оно может выводить такое количество уведомлений пользователю.
Не используйте LiveData в репозиториях
#разработка #статьи
Одной из частых ошибок при разработке приложений является использование LiveData в репозиториях. Связано это прежде всего с тем, что изначально Google советовали использовать её подобным образом.
Но если изучить подобный проект, то можно заметить большое количество блокировок главного потока, так как observer из LiveData всегда вызывается в нём. Поэтому, хорошей практикой будет использовать её именно на слое, который связан с отображением данных.
Альтернативой LiveData будет использование Flow, который имеет больше контроля над местом, где он исполняется. Подробнее об этом можно почитать тут.
#разработка #статьи
Одной из частых ошибок при разработке приложений является использование LiveData в репозиториях. Связано это прежде всего с тем, что изначально Google советовали использовать её подобным образом.
Но если изучить подобный проект, то можно заметить большое количество блокировок главного потока, так как observer из LiveData всегда вызывается в нём. Поэтому, хорошей практикой будет использовать её именно на слое, который связан с отображением данных.
Альтернативой LiveData будет использование Flow, который имеет больше контроля над местом, где он исполняется. Подробнее об этом можно почитать тут.
WorkManager. Базовая информация
#разработка #новичкам
За последние несколько лет в Android постоянно менялась работа с фоновыми операциями. Самая главная причина — это постоянно возрастающее количество приложений на устройстве пользователя, соответственно растущее число фоновых задач и повышенная разрядка батареи.
Поэтому, очень важно следить за тем, как исполняются фоновые операции на устройстве. Сейчас для исполнения фоновых операций существует WorkManager.
Если вы не так давно в мобильной разработке или хотите упорядочить свои знания по нему, то рекомендую две статьи.
Первая даёт базовые основы использования WorkManager: какие зависимости добавить, какие есть типы операций и параметры для них.
Вторая описывает работу с WorkManager чуть дальше и рассказывает о цепочках запросов, прогрессе, статусе операции и как завершить текущую работу.
#разработка #новичкам
За последние несколько лет в Android постоянно менялась работа с фоновыми операциями. Самая главная причина — это постоянно возрастающее количество приложений на устройстве пользователя, соответственно растущее число фоновых задач и повышенная разрядка батареи.
Поэтому, очень важно следить за тем, как исполняются фоновые операции на устройстве. Сейчас для исполнения фоновых операций существует WorkManager.
Если вы не так давно в мобильной разработке или хотите упорядочить свои знания по нему, то рекомендую две статьи.
Первая даёт базовые основы использования WorkManager: какие зависимости добавить, какие есть типы операций и параметры для них.
Вторая описывает работу с WorkManager чуть дальше и рассказывает о цепочках запросов, прогрессе, статусе операции и как завершить текущую работу.
Жизнь разработчика в Израиле
#интервью #экспаты
Друзья, первая статья из новой рубрики на канале готова.
Она получилась объёмной и рассматривает большинство вопросов жизни в Израиле и отвечает на те вопросы, которые вы задавали: как найти работу, какая там зарплата, насколько легко получить визу и гражданство, как хорошо развита медицина и быт в целом.
Была проделана огромная работа, и я надеюсь, что вам понравится статья.😎
Ссылка на статью тут, обязательно ставьте лайки (их можно поставить не один раз, а аж 50😁) !
Ещё приятный момент. Я долго размышлял, нужен ли каналу чат, и понял, что он не будет лишним, ведь в нём мы сможем обсуждать всё, что происходит на канале, в частности подобные статьи (их можно обсудить там же с героем).
Поэтому, если у вас останутся вопросы к Андрею (герою статьи), то вы можете задать их в @android_live_chat, а самыми интересными я дополню статью.😏
Давайте сделаем наш чатик уютным и интересным!
#интервью #экспаты
Друзья, первая статья из новой рубрики на канале готова.
Она получилась объёмной и рассматривает большинство вопросов жизни в Израиле и отвечает на те вопросы, которые вы задавали: как найти работу, какая там зарплата, насколько легко получить визу и гражданство, как хорошо развита медицина и быт в целом.
Была проделана огромная работа, и я надеюсь, что вам понравится статья.😎
Ссылка на статью тут, обязательно ставьте лайки (их можно поставить не один раз, а аж 50😁) !
Ещё приятный момент. Я долго размышлял, нужен ли каналу чат, и понял, что он не будет лишним, ведь в нём мы сможем обсуждать всё, что происходит на канале, в частности подобные статьи (их можно обсудить там же с героем).
Поэтому, если у вас останутся вопросы к Андрею (герою статьи), то вы можете задать их в @android_live_chat, а самыми интересными я дополню статью.😏
Давайте сделаем наш чатик уютным и интересным!
Medium
Жизнь разработчика в Израиле
Андрей — Lead Mobile Developer в компании Appcard и уже 5 лет живёт в Израиле, из которых 3 года вместе с семьей проживает в городе…
Paging3
#jetpack #чтонового
Совсем недавно появилась, так называемая, третья версия Paging-библиотеки, созданная для улучшения загрузки данных по частям и отображения их в списках.
Текущая версия — 3.0.0-alpha03.
Что нового?
🔸полностью написана на Kotlin;
🔸поддерживает Coroutines и Flow из коробки, как и RxJava с LiveData;
🔸кэширует данные в памяти, чтобы помочь в распределении системных ресурсов и загрузки данных без задержек;
🔸улучшенный адаптер для RecyclerView;
🔸встроенная поддержка обработок ошибок, повторных запросов и обновлений.
Подробнее
Ссылка на статью с примерами использования тут.
Пример codelab с Paging3 тут.
#jetpack #чтонового
Совсем недавно появилась, так называемая, третья версия Paging-библиотеки, созданная для улучшения загрузки данных по частям и отображения их в списках.
Текущая версия — 3.0.0-alpha03.
Что нового?
🔸полностью написана на Kotlin;
🔸поддерживает Coroutines и Flow из коробки, как и RxJava с LiveData;
🔸кэширует данные в памяти, чтобы помочь в распределении системных ресурсов и загрузки данных без задержек;
🔸улучшенный адаптер для RecyclerView;
🔸встроенная поддержка обработок ошибок, повторных запросов и обновлений.
Подробнее
Ссылка на статью с примерами использования тут.
Пример codelab с Paging3 тут.
Mobius 2020
#конференции
Думаю, что большинству разработчиков известна конференция Mobius. Напомню, что это крутая техническая конференция, целиком посвящённая мобильной разработке. Ну и доклады от экспертов, которые из первых рук делятся своими наработками со всеми.
В этом году конференция стала online и пройдёт с 11 по 14 ноября. Нас ждёт: 4 дня эфира, несколько треков, около 20 докладов, воркшопы и Q&A-сессии.
Для подписчиков канала ребята дают скидку на билеты из категории Personal в 1500 рублей: AndroidLive2020aupc.
Программа потихоньку заполняется, и сейчас самое время купить билеты по более низкой цене. Ссылка с информацией тут.
#конференции
Думаю, что большинству разработчиков известна конференция Mobius. Напомню, что это крутая техническая конференция, целиком посвящённая мобильной разработке. Ну и доклады от экспертов, которые из первых рук делятся своими наработками со всеми.
В этом году конференция стала online и пройдёт с 11 по 14 ноября. Нас ждёт: 4 дня эфира, несколько треков, около 20 докладов, воркшопы и Q&A-сессии.
Для подписчиков канала ребята дают скидку на билеты из категории Personal в 1500 рублей: AndroidLive2020aupc.
Программа потихоньку заполняется, и сейчас самое время купить билеты по более низкой цене. Ссылка с информацией тут.
Как оптимизировать RecyclerView?
#комментарии #recyclerview
Ни для кого не секрет, что сегодня
Автор статьи предлагает следующие оптимизации:
🔸использование библиотек для загрузки изображений. Garbage collector мог бы быть причиной неотвечающего UI, если бы не bitmap pool, который встроен в большинство современных библиотек для загрузки изображений. Думаю, что мало кто сегодня пытается самостоятельно управлять показом изображений вручную, поэтому продолжайте делегировать все задачи, связанные с загрузкой изображений специальным библиотекам.
🔸установите ширину и высоту для ImageView. Очень часто изображения, получаемые с сервера имеют динамические параметры ширины и высоты. Если мы показываем изображения без учёта этих параметров, то при полной загрузке можем получить «мигание» интерфейса. Чтобы этого избежать, попробуйте вычислить ширину и высоту или соотношение сторон заранее, до загрузки картинки.
🔸оптимизируйте метод onBindViewHolder. Проверьте метод
🔸используйте DiffUtil. При обновлении адаптера старайтесь использовать DiffUtil. Под капотом он использует методы для изменения элементов по позициям, а не полное обновление списка (
🔸избегайте вложенных view. Довольно базовое правило, нарушение которого становится ещё более критичным в RecyclerView. Добавлю, что тут важно следить за layout, которые использут веса для отрисовки.
🔸используйте setHasFixedSize. Если элементы вашего RecyclerView имеют одинаковые параметры ширины и высоты, то эта функция улучшит производительность списка.
🔸переиспользуйте RecyclerViewPool. Довольно хорошей оптимизацией является переиспользование
🔸поэкспериментируйте с setItemViewCacheSize. Из документации следует, что этот параметр устанавливает количество
А что вы бы ещё добавили к этому списку?
#комментарии #recyclerview
Ни для кого не секрет, что сегодня
RecyclerView — это базовый элемент для показа списков в приложениях. И очень важно, чтобы он работал максимально плавно. Автор статьи предлагает следующие оптимизации:
🔸использование библиотек для загрузки изображений. Garbage collector мог бы быть причиной неотвечающего UI, если бы не bitmap pool, который встроен в большинство современных библиотек для загрузки изображений. Думаю, что мало кто сегодня пытается самостоятельно управлять показом изображений вручную, поэтому продолжайте делегировать все задачи, связанные с загрузкой изображений специальным библиотекам.
🔸установите ширину и высоту для ImageView. Очень часто изображения, получаемые с сервера имеют динамические параметры ширины и высоты. Если мы показываем изображения без учёта этих параметров, то при полной загрузке можем получить «мигание» интерфейса. Чтобы этого избежать, попробуйте вычислить ширину и высоту или соотношение сторон заранее, до загрузки картинки.
🔸оптимизируйте метод onBindViewHolder. Проверьте метод
onBindViewHolder и сделайте его максимально легким. Это также даст прирост к производительности RecyclerView🔸используйте DiffUtil. При обновлении адаптера старайтесь использовать DiffUtil. Под капотом он использует методы для изменения элементов по позициям, а не полное обновление списка (
notifyDataSetChanged). Кстати, если хотите ещё больше оптимизировать свой список, попробуйте использовать асинхронный DiffUtil на coroutines. Ссылка с деталями тут.🔸избегайте вложенных view. Довольно базовое правило, нарушение которого становится ещё более критичным в RecyclerView. Добавлю, что тут важно следить за layout, которые использут веса для отрисовки.
🔸используйте setHasFixedSize. Если элементы вашего RecyclerView имеют одинаковые параметры ширины и высоты, то эта функция улучшит производительность списка.
🔸переиспользуйте RecyclerViewPool. Довольно хорошей оптимизацией является переиспользование
RecyclerViewPool при наличии одинаковых элементов. Пример можно посмотреть в статье.🔸поэкспериментируйте с setItemViewCacheSize. Из документации следует, что этот параметр устанавливает количество
ViewHolder, которые не показаны на экране перед добавлением их в RecyclerViewPool. Мы можем поэкспериментировать с этим параметром, чтобы увеличить количество ViewHolder, невидимых на экране и уменьшить количество вызовов onBindViewHolder.А что вы бы ещё добавили к этому списку?
Podlodka Android Crew — 2 сезон
#конференции
Летом ребята из Podlodka делали двухнедельную онлайн конференцию для Android-разработчиков. И вот, уже через неделю начинается второй сезон Podlodka Android Crew!
Что нас ждёт:
🌟 парное программирование от Дениса Неклюдова и Степана Гончарова;
💰доклад о том, как из мобильного разработчика вырасти в СТО;
🔥собеседование наоборот: теперь будут собеседовать не людей с конференции, а экспертов, которые там присутствуют;
☕️куча сессий и, конечно же, холиваров.
Начало конференции — 5 октября. До четверга, цена билета — 3400 рублей, что весьма демократично, учитывая количество контента. Подробнее о программе и билетах тут.
И снова, у вас, подписчиков Android Live, есть шанс выиграть билет бесплатно. Для этого не нужно никуда подписываться: просто оставь свой ник в форме до 1 октября 18:00. В этот же день будет розыгрыш одного билета.
До встречи на конференции!
#конференции
Летом ребята из Podlodka делали двухнедельную онлайн конференцию для Android-разработчиков. И вот, уже через неделю начинается второй сезон Podlodka Android Crew!
Что нас ждёт:
🌟 парное программирование от Дениса Неклюдова и Степана Гончарова;
💰доклад о том, как из мобильного разработчика вырасти в СТО;
🔥собеседование наоборот: теперь будут собеседовать не людей с конференции, а экспертов, которые там присутствуют;
☕️куча сессий и, конечно же, холиваров.
Начало конференции — 5 октября. До четверга, цена билета — 3400 рублей, что весьма демократично, учитывая количество контента. Подробнее о программе и билетах тут.
И снова, у вас, подписчиков Android Live, есть шанс выиграть билет бесплатно. Для этого не нужно никуда подписываться: просто оставь свой ник в форме до 1 октября 18:00. В этот же день будет розыгрыш одного билета.
До встречи на конференции!
Room и связь Many to Many
#room
На мой взгляд, одна из самых неудобных вещей, которая есть в Room — это работа со связью Many to Many.
Для тех, кто не использовал эту связь в Room, я расскажу вкратце. Больше деталей можно почитать тут.
Для её создания в Room есть следующий механизм:
🔸создаётся ассоциативная таблица с идентификаторами первой и второй таблицы;
🔸создаётся новый data-класс, где прописывается связь через
По идее, все довольно просто, но главная сложность возникает в фильтрации данных. В документации показан пример с получением полного списка данных, но если её нужно сделать, то единственный вариант — использование
Для такой связи нужно будет создать
Главный недостаток тут — отсутствие проверки правильности запроса во время компиляции, поэтому будьте особенно внимательны при его составлении.
#room
На мой взгляд, одна из самых неудобных вещей, которая есть в Room — это работа со связью Many to Many.
Для тех, кто не использовал эту связь в Room, я расскажу вкратце. Больше деталей можно почитать тут.
Для её создания в Room есть следующий механизм:
🔸создаётся ассоциативная таблица с идентификаторами первой и второй таблицы;
🔸создаётся новый data-класс, где прописывается связь через
Junction, указывая эту таблицу в качестве связи.По идее, все довольно просто, но главная сложность возникает в фильтрации данных. В документации показан пример с получением полного списка данных, но если её нужно сделать, то единственный вариант — использование
@RawQuery вместо @Query и генерирования запроса вручную. Для такой связи нужно будет создать
INNER JOIN по ассоциативной таблице, и дальше применить нужные фильтры.Главный недостаток тут — отсутствие проверки правильности запроса во время компиляции, поэтому будьте особенно внимательны при его составлении.
Результаты конкурса Podlodka Android Crew — 2 сезон
#конкурс
Итак, пришло время опубликовать результаты конкурса, который был описан тут.
В конкурсе приняло участие 43 человека, при помощи генератора случайных чисел был выбран победитель — @xebastjanova, с чем я её поздравляю! 🎊
Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
#конкурс
Итак, пришло время опубликовать результаты конкурса, который был описан тут.
В конкурсе приняло участие 43 человека, при помощи генератора случайных чисел был выбран победитель — @xebastjanova, с чем я её поздравляю! 🎊
Видео с выбором победителя тут. Обязательно участвуйте в новых конкурсах!
Поиск работы, оптимизация резюме. Взгляд со стороны HR
#конференции
Каждый из разработчиков рано или поздно задумывается о смене работы. Мы готовимся к собеседованиям, учим алгоритмы, но забываем о том, что прежде всего видят рекрутеры — резюме. У многих даже нет хорошо оформленного CV! 😩
В сообществе GDG Bryansk в это воскресенье, 4 октября будет митап, посвящённый поиску работы и оптимизации резюме со стороны HR.
Поликарпов Дмитрий, наш спикер, занимается подбором людей в IT с 2013 года и расскажет нам о поиске работы и ошибках в резюме соискателей.
Запись митапа будет. Тех, кто будет на мероприятии онлайн, ждет сюрприз 🎊, о котором вы узнаете в начале митапа.
Ссылка на трансляцию тут, а больше деталей можно узнать тут.
До встречи на митапе!😎
#конференции
Каждый из разработчиков рано или поздно задумывается о смене работы. Мы готовимся к собеседованиям, учим алгоритмы, но забываем о том, что прежде всего видят рекрутеры — резюме. У многих даже нет хорошо оформленного CV! 😩
В сообществе GDG Bryansk в это воскресенье, 4 октября будет митап, посвящённый поиску работы и оптимизации резюме со стороны HR.
Поликарпов Дмитрий, наш спикер, занимается подбором людей в IT с 2013 года и расскажет нам о поиске работы и ошибках в резюме соискателей.
Запись митапа будет. Тех, кто будет на мероприятии онлайн, ждет сюрприз 🎊, о котором вы узнаете в начале митапа.
Ссылка на трансляцию тут, а больше деталей можно узнать тут.
До встречи на митапе!😎
YouTube
Поликарпов Дмитрий — Поиск работы, оптимизация резюме. Взгляд со стороны HR
Каждый из разработчиков рано или поздно задумывается о смене работы. Мы готовимся к собеседованиям, учим алгоритмы, но забываем о том, что прежде всего видят рекрутеры — резюме. У многих даже нет хорошо оформленного CV! 😩
Предлагаю обсудить то, как видят…
Предлагаю обсудить то, как видят…
Оптимизируем скорость сборки приложения
#gradle
Сборка приложения — это извечная тема для споров, докладов и постоянных улучшений. И, как бы смешно это ни было, от неё зависит то, какое количество фич мы можем сделать в определённый отрезок времени.
Некоторые полагаются на стандратные настройки проекта и начинают добавлять улучшения только тогда, когда сборка становится до невозможности долгой.
Но есть советы, которые можно попробовать применить сразу после старта проекта.
Для начала выполните следуюущую команду, чтобы понять текущую скорость сборки:
Начнём улучшать:
🔹применим
🔹увеличим Java heap при помощи
🔹задействуем
🔹включим параллельную сборку мультимодульных проектов при помощи
🔹если в проекте есть room, то добавим
🔹добавим
🔹можно включить конфигурационный кэш при помощи
🔹если у вас есть png в проекте, то можно выключить автоматическое сжатие png-файлов для сборок, отличных от debug, где оно автоматически выключено при помощи
🔹посмотрите, чтобы у вас везде в проекте были указаны точные названия версий, избегайте названий в виде 1.+.
Конечно, это далеко не полный список возможных улучшений, но даже эти флаги ускорят сборку вашего проекта. Чуть больше информации о них можно почитать в статье.
#gradle
Сборка приложения — это извечная тема для споров, докладов и постоянных улучшений. И, как бы смешно это ни было, от неё зависит то, какое количество фич мы можем сделать в определённый отрезок времени.
Некоторые полагаются на стандратные настройки проекта и начинают добавлять улучшения только тогда, когда сборка становится до невозможности долгой.
Но есть советы, которые можно попробовать применить сразу после старта проекта.
Для начала выполните следуюущую команду, чтобы понять текущую скорость сборки:
./gradlew --profile --offline --rerun-tasks assembleDebugНачнём улучшать:
🔹применим
org.gradle.configureondemand=true — флаг включает конфигурацию проектов по запросу, что позволяет собирать только то, что участвует в сборке.🔹увеличим Java heap при помощи
org.gradle.jvmargs=-Xmx1536m, если позволяет ваша оперативная память.🔹задействуем
kapt.use.worker.api=true. Флаг задействует worker API для стадии annotation processing в kapt, а также перемещает выполнение этой стадии отдельно от Kotlin Compile Daemon.🔹включим параллельную сборку мультимодульных проектов при помощи
org.gradle.parallel=true.🔹если в проекте есть room, то добавим
room.incremental = true. Начиная с версии 2.3.0, флаг включен по умолчанию.🔹добавим
org.gradle.unsafe.watch-fs=true. Работает флаг так: чтобы gradle мог определить, надо выполнять задачу или нет, ему необходимо проверить, был ли изменён файл с момента последней сборки. Daemon хранит эту информацию в памяти, если задействован данный флаг. Иначе — он собирает её для каждой сборки. Больше деталей можно узнать тут.🔹можно включить конфигурационный кэш при помощи
org.gradle.unsafe.configuration-cache=true.🔹если у вас есть png в проекте, то можно выключить автоматическое сжатие png-файлов для сборок, отличных от debug, где оно автоматически выключено при помощи
crunchPngs false.🔹посмотрите, чтобы у вас везде в проекте были указаны точные названия версий, избегайте названий в виде 1.+.
Конечно, это далеко не полный список возможных улучшений, но даже эти флаги ускорят сборку вашего проекта. Чуть больше информации о них можно почитать в статье.
Безопасность современных Android-смартфонов
#security
Все мы знаем, что сегодня Android — самая распространённая операционная система в мире. Это миллиарды устройств, которые имеют массу установленных приложений и бесконечное количество персональных данных на борту. Поэтому, особенно важно следить за безопасностью своего устройства.
Мы, как разработчики приложений, тоже можем обезопасить те данные, которые хранятся внутри приложения. Есть отличный цикл статей, который рассказывает о безопасности в современной разработке. Коротко, по делу и актуально.
🔸три статьи про шифрование: первая, вторая и третья части. Они расскажут о том, как шифровать данные внутри приложения и об их хранении.
🔸немного о том, как работает биометрия, и как её лучше использовать.
🔸чуть позже нас ждёт ещё четыре статьи: про нативный код, сертификаты и изменения безопасности в Android 11.
#security
Все мы знаем, что сегодня Android — самая распространённая операционная система в мире. Это миллиарды устройств, которые имеют массу установленных приложений и бесконечное количество персональных данных на борту. Поэтому, особенно важно следить за безопасностью своего устройства.
Мы, как разработчики приложений, тоже можем обезопасить те данные, которые хранятся внутри приложения. Есть отличный цикл статей, который рассказывает о безопасности в современной разработке. Коротко, по делу и актуально.
🔸три статьи про шифрование: первая, вторая и третья части. Они расскажут о том, как шифровать данные внутри приложения и об их хранении.
🔸немного о том, как работает биометрия, и как её лучше использовать.
🔸чуть позже нас ждёт ещё четыре статьи: про нативный код, сертификаты и изменения безопасности в Android 11.
Наименование строковых ресурсов
#resources
Мы, как разработчики, часто следуем различным практикам, которые улучшают код. Например, мы следуем camelCase при написании переменных.
Но часто мы не обращаем внимание на то, как пишем ресурсы в приложении. Давайте поговорим о том, как лучше именовать ресурсы в файле strings.xml.
В целом, существует так называемая практика <HOW>_<DESCRIPTION>. Это практика, где первым словом вы указываете то, как использовать ресурс в проекте, а вторым — что означает данный ресурс. Например, label_home или hint_user_name.
В своих проектах я немного расширил эту технику до <HOW>_<WHERE>_<DESCRIPTION>. В этом случае where — это экран или модуль, где используется ресурс. Например, noscript_registration_pass. Если ресурс используется в нескольких местах, то параметр where опускается.
Для себя также обозначил следующие how:
🔸noscript — заголовки;
🔸hint — подсказки в edittext;
🔸msg — сообщения или обычные текста на экранах;
🔸error — сообщения об ошибках;
🔸action — кнопки или какие-то действия.
Подобный порядок делает использование ресурсов удобным, что особенно актуально, если ваш проект переведён на нескольких языков.
#resources
Мы, как разработчики, часто следуем различным практикам, которые улучшают код. Например, мы следуем camelCase при написании переменных.
Но часто мы не обращаем внимание на то, как пишем ресурсы в приложении. Давайте поговорим о том, как лучше именовать ресурсы в файле strings.xml.
В целом, существует так называемая практика <HOW>_<DESCRIPTION>. Это практика, где первым словом вы указываете то, как использовать ресурс в проекте, а вторым — что означает данный ресурс. Например, label_home или hint_user_name.
В своих проектах я немного расширил эту технику до <HOW>_<WHERE>_<DESCRIPTION>. В этом случае where — это экран или модуль, где используется ресурс. Например, noscript_registration_pass. Если ресурс используется в нескольких местах, то параметр where опускается.
Для себя также обозначил следующие how:
🔸noscript — заголовки;
🔸hint — подсказки в edittext;
🔸msg — сообщения или обычные текста на экранах;
🔸error — сообщения об ошибках;
🔸action — кнопки или какие-то действия.
Подобный порядок делает использование ресурсов удобным, что особенно актуально, если ваш проект переведён на нескольких языков.
Разбираемся в Jetpack Compose
#jetpack #compose
Сегодня Jetpack Compose — это технология, которая у каждого на слуху. Думаю, что после появления финальной версии, многие приложения будут создаваться с ней, а знание Compose будет обязательным, как сегодня знания Kotlin.
В статье делается краткий обзор Compose, его сравнение с layout и почему он принесёт пользу в современный мир разработки.
На мой взгляд, это хорошая статья, если вы совсем не знакомы с понятием декларативного UI или задавали себе вопрос, для чего конкретно в будущем использовать Compose.
#jetpack #compose
Сегодня Jetpack Compose — это технология, которая у каждого на слуху. Думаю, что после появления финальной версии, многие приложения будут создаваться с ней, а знание Compose будет обязательным, как сегодня знания Kotlin.
В статье делается краткий обзор Compose, его сравнение с layout и почему он принесёт пользу в современный мир разработки.
На мой взгляд, это хорошая статья, если вы совсем не знакомы с понятием декларативного UI или задавали себе вопрос, для чего конкретно в будущем использовать Compose.
Темная тема с Material Design Components
#mdc #theme
Использование тёмной темы было добавлено в последних версиях Android, и зачастую многие пользователи просят о тёмной теме в отзывах к приложениям.
Сегодня мне попалась интересная статья о некоторых принципах, которые стоит сохранить в тёмной теме.
Изучая её я понял, что если правильно настроить основные атрибуты в приложении, то поддержка тёмной темы не является чем-то сложным. Пройдёмся по некоторым из принципов.
1️⃣ Не использовать абсолютно чёрный цвет. По умолчанию в тёмной теме фоновый цвет — это не #000000, а #121212. Полностью чёрный цвет поможет увеличить время работы устройства на OLED-дисплеях, однако в приложении могут быть иконки, анимации, контрастные изображения, которые будут выглядеть хуже на полностью чёрном цвете. Ну и главная причина — это увеличение нагрузки на глаза. Поэтому, лучше использовать «не до конца чёрный цвет» 😁
2️⃣ Оттенки главных цветов. В палитре Material Design цвета нумеруются по тонам от 50 (наиболее светлый тон) до 900 (наиболее тёмный тон). Интересно, что для светлой темы стоит выбирать colorPrimary в тоне около 500, а для тёмной — около 200. Если вы используете colorPrimaryVariant, то в тёмной теме можно взять colorPrimary из светлой темы.
3️⃣ Обратить внимание на цвета поверхностей и тени. Яркие цвета могут иметь положительное влияние на приложение, если включена светлая тема. Однако, если используется темная тема, это должно интерпретироваться как желание пользователя использовать приглушенную, менее яркую цветовую схему. Стоит также обратить внимание на те тени, которые отображатся на поверхностях.
Больше рекомендаций по настройке тёмной темы можно найти тут.
#mdc #theme
Использование тёмной темы было добавлено в последних версиях Android, и зачастую многие пользователи просят о тёмной теме в отзывах к приложениям.
Сегодня мне попалась интересная статья о некоторых принципах, которые стоит сохранить в тёмной теме.
Изучая её я понял, что если правильно настроить основные атрибуты в приложении, то поддержка тёмной темы не является чем-то сложным. Пройдёмся по некоторым из принципов.
1️⃣ Не использовать абсолютно чёрный цвет. По умолчанию в тёмной теме фоновый цвет — это не #000000, а #121212. Полностью чёрный цвет поможет увеличить время работы устройства на OLED-дисплеях, однако в приложении могут быть иконки, анимации, контрастные изображения, которые будут выглядеть хуже на полностью чёрном цвете. Ну и главная причина — это увеличение нагрузки на глаза. Поэтому, лучше использовать «не до конца чёрный цвет» 😁
2️⃣ Оттенки главных цветов. В палитре Material Design цвета нумеруются по тонам от 50 (наиболее светлый тон) до 900 (наиболее тёмный тон). Интересно, что для светлой темы стоит выбирать colorPrimary в тоне около 500, а для тёмной — около 200. Если вы используете colorPrimaryVariant, то в тёмной теме можно взять colorPrimary из светлой темы.
3️⃣ Обратить внимание на цвета поверхностей и тени. Яркие цвета могут иметь положительное влияние на приложение, если включена светлая тема. Однако, если используется темная тема, это должно интерпретироваться как желание пользователя использовать приглушенную, менее яркую цветовую схему. Стоит также обратить внимание на те тени, которые отображатся на поверхностях.
Больше рекомендаций по настройке тёмной темы можно найти тут.
Как участвовать в развитии Kotlin?
#kotlin
Сегодня первый день конференции KotlinConf 2020, и один из докладов был посвящён тому, как любой разработчик может поучаствовать в развитии Kotlin.
🔸участвовать в Early Access Preview. Для каждого релиза, команда Kotlin делает несколько alpha-версий, где каждый может попробовать самые последние фичи до того, как они пойдут в production. Это крутая возможность, если вы любите попробовать новинки первым. Подробнее тут.
🔸вносить вклад в компилятор, стандартные библиотеки и tooling. Для этого нужно прочитать инструкцию о том, как правильно делать contribute в Kotlin, посмотреть открытие задачи и начать писать код.
🔸создавайте новые библиотеки или участвуйте в развитии других. Помимо стандартной библиотеки, Kotlin имеет ряд дополнительных (kotlinx) библиотек, расширяющих его функциональность. Каждая библиотека kotlinx разрабатывается в отдельном репозитории, имеет собственный цикл версий и выпуска. Например, вы можете участвовать в развитии coroutines, serialization или ktor.
🔸улучшайте документацию. Если вы нашли ошибку в документации Kotlin, вы можете сделать pull request с правкой в официальном репозитории для документации.
🔸создавайте tutorials и видео. Если вам интересно делать статьи или обучающие материалы, вы можете поделиться ими, написав в feedback@kotlinlang.org
Чуть больше информации можно взять тут.
#kotlin
Сегодня первый день конференции KotlinConf 2020, и один из докладов был посвящён тому, как любой разработчик может поучаствовать в развитии Kotlin.
🔸участвовать в Early Access Preview. Для каждого релиза, команда Kotlin делает несколько alpha-версий, где каждый может попробовать самые последние фичи до того, как они пойдут в production. Это крутая возможность, если вы любите попробовать новинки первым. Подробнее тут.
🔸вносить вклад в компилятор, стандартные библиотеки и tooling. Для этого нужно прочитать инструкцию о том, как правильно делать contribute в Kotlin, посмотреть открытие задачи и начать писать код.
🔸создавайте новые библиотеки или участвуйте в развитии других. Помимо стандартной библиотеки, Kotlin имеет ряд дополнительных (kotlinx) библиотек, расширяющих его функциональность. Каждая библиотека kotlinx разрабатывается в отдельном репозитории, имеет собственный цикл версий и выпуска. Например, вы можете участвовать в развитии coroutines, serialization или ktor.
🔸улучшайте документацию. Если вы нашли ошибку в документации Kotlin, вы можете сделать pull request с правкой в официальном репозитории для документации.
🔸создавайте tutorials и видео. Если вам интересно делать статьи или обучающие материалы, вы можете поделиться ими, написав в feedback@kotlinlang.org
Чуть больше информации можно взять тут.
Отправка данных между Fragments
#fragment
Для передачи данных между двумя фрагментами, существовало одно распространённое API —
По сути,
Несмотря на кажующуюся простоту, это API — не очень удобное.
Во-первых,
Во-вторых, API разбросано по коду и становится непонятно, откуда прилетел тот или иной кусок данных.
Не так давно появилось новое решение —
Это изменение позволяет отдельным фрагментам взаимодействовать друг с другом, отправляя результаты фрагмента и прослушивая эти результаты, не требуя, чтобы фрагменты имели прямые ссылки друг на друга.
Работает он примерно так:
А в том месте, где мы хотим отправить информацию нужно вызвать:
Точно такого же слушателя мы можем добавить и для
#fragment
Для передачи данных между двумя фрагментами, существовало одно распространённое API —
targetFragment. По сути,
targetFragment предоставляет нам способ получения данных через back stack, а всё что нам нужно — это переопределить onActivityResult в вызывающем фрагменте. Несмотря на кажующуюся простоту, это API — не очень удобное.
Во-первых,
targetFragment будет работать если фрагменты находятся в одном и том же менеджере. Во-вторых, API разбросано по коду и становится непонятно, откуда прилетел тот или иной кусок данных.
Не так давно появилось новое решение —
FragmentResultOwner. По сути, это callback, который есть у каждого FragmentManager. Это изменение позволяет отдельным фрагментам взаимодействовать друг с другом, отправляя результаты фрагмента и прослушивая эти результаты, не требуя, чтобы фрагменты имели прямые ссылки друг на друга.
Работает он примерно так:
setFragmentResultListener("requestKey") { key, bundle ->
val result = bundle.getString("name")
// Do something with the result...
}А в том месте, где мы хотим отправить информацию нужно вызвать:
tvSave.setOnClickListener {
setResult("requestKey", bundleOf("name" to updatedValue))
}Точно такого же слушателя мы можем добавить и для
childfragmentmanager. В целом, новое API выглядит гораздо интереснее предыдущего и виден явный прогресс.TextAppearance или Style
#design #view
Android даёт нам несколько способов установить атрибуты стиля для
1) Применение нужных атрибутов напрямую в вёрстке:
Этот подход имеет несколько недостатков. Во-первых, мы не используем атрибуты для цвета текста, а вместо этого используем цвет напрямую. Во-вторых, мы лишаем себя возможности использовать те же самые настройки текста для других
2) Использование Style для
Здесь мы уже можем переиспользовать настройки, заданные в стиле. И вроде этот подход выглядит идеальным и правильным, однако существует ещё и третий способ кастомизации
На самом деле, это довольно интересное свойство. Оно позволяет нам установить ограниченный набор атрибутов, специфичных только для текста: цвет текста, его размер, шрифт, семейство цветов и т.д. При этом, в Android Material сущестуют 13 стандартных
Порядок установки атрибутов такой: сначала применяются атрибуты
Подробнее можно прочитать тут.
#design #view
Android даёт нам несколько способов установить атрибуты стиля для
TextView. Есть два самых часто используемых:1) Применение нужных атрибутов напрямую в вёрстке:
<TextView
android:textSize="16sp"
android:textColor="#fff"
Этот подход имеет несколько недостатков. Во-первых, мы не используем атрибуты для цвета текста, а вместо этого используем цвет напрямую. Во-вторых, мы лишаем себя возможности использовать те же самые настройки текста для других
TextView. Такой подход возможен в случае TextView, который редко используется в приложении.2) Использование Style для
TextView, например:
<TextView
style="@style/Widget.MyApp.TextView"
Здесь мы уже можем переиспользовать настройки, заданные в стиле. И вроде этот подход выглядит идеальным и правильным, однако существует ещё и третий способ кастомизации
TextView — это textAppearance.
<TextView
android:textAppearance="?textAppearanceBody1"На самом деле, это довольно интересное свойство. Оно позволяет нам установить ограниченный набор атрибутов, специфичных только для текста: цвет текста, его размер, шрифт, семейство цветов и т.д. При этом, в Android Material сущестуют 13 стандартных
textAppearance, которые мы можем дополнить и использовать у себя в проектах. Подробнее можно посмотреть тут.Порядок установки атрибутов такой: сначала применяются атрибуты
textAppearance, дальше атрибуты стиля, и потом те, что вы напрямую определили для View.Подробнее можно прочитать тут.
Любопытный комментаррий по поводу последнего поста от @terrakok.
Существует свойства
Но в списке свойств его нет. Поэтому, будьте внимательны, если решили заморочиться pixel-perfect дизайном у себя. Единственным выходом будет тут применение
Существует свойства
android:lineSpacingMultiplier, добавляющее дополнительный интервал между строками через коэффициент и которое, по логике, подходит для TextView и должно быть в поддерживаемом списоке textAppearance.Но в списке свойств его нет. Поэтому, будьте внимательны, если решили заморочиться pixel-perfect дизайном у себя. Единственным выходом будет тут применение
style вместо textAppearance.Stack Overflow
android:lineSpacingMultiplier doesn't work in android:textAppearance
I'm trying to add android:lineSpacingMultiplier in my textAppearance style (android:textAppearance), and it's not working. Am I doing something wrong?
TextAppearance style:
<style name="
TextAppearance style:
<style name="