Telegram Web
​​Multiple backstacks
#fragment #jetpack

Хорошая статья, где автор рассказывает о множественных backstacks, и о том, как их применять в свежей версии Navigation и Fragment.

При использовании кнопки back наша Activity закрывается. Но если у нас в ней есть Fragments, то мы можем кастомизировать это поведение при помощи OnBackPressedDispatcher , например вызывая метод popBackStack(). Он не совсем хорош, ведь не позволяет сохранить состояние наших фрагментов.

Теперь же у нас добавились два новых метода: saveBackStack() и restoreBackStack(), благодаря которым мы можем этими состояниями управлять, и по факту иметь несколько backstack.
Крутое обновление, надеюсь что текущее API не пострадало: ребята говорят о том, что им пришлось 6 месяцев на изменения API Fragments, но обещают, что текущие методы будут работать корректно.

Кроме этого, всё будет работать из коробки для Navigation и View, связанных с ней.
​​Популярные библиотеки для KMM
#kmm #kotlin

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

Тут есть краткий, не технический обзор SQLDelight, Decompose, Realm Kotlin Multiplatform SDK, Multiplatform Settings и Ktor.

С авторами некоторых из библиотек есть интервью, где рассказывается о внутренностях работы с этими библиотеками, про мотивацию, ну и будущие планы для работы с решениями.

Кроме этого, автор мотивирует нас, разработчиков, делать свой вклад в библиотеки для KMM, так как есть ещё огромное число областей, которые требуют своих библиотек. Если у вас есть мысли о том, чтоб «законтрибьютить» своё решение, вот вам статья для этого.

Ссылка на статью тут.
​​compileSdkVersion vs targetSdkVersion
#gradle

Уверен, что каждый из вас хотя бы раз обновлял параметры compileSdkVersion и targetSdkVersion. Чаще всего, мы обновляем их вместе, иногда ставим одно и то же значение, не задумываясь о том, что они значат, и для чего нужны.

Вот вам отличная статья, которая описывает разницу между этими параметрами. Если совсем кратко:

🔹 compileSdkVersion определяет, какая версия Android SDK будет использоваться gradle для компиляции вашего приложения.

Например, в последней версии Android появилось новое API для работы со splash-экранами. Если вы хотите использовать данную фичу, то вам следует поднять ваш compileSdkVersion до 31 версии.

Это не значит, что теперь вы будете использовать только новое API и забудете о пользователях, которые находятся на более старых версия системы. В случае, если minSdkVersion меньше, чем 31 вам потребуется сделать реализацию splash также и для остальных пользователей.

Частенько после изменения compileSdkVersion вы можете увидеть warnings и ошибки в логах, так как некоторые методы могут стать deprecated, а API поменяться.

🔹targetSdkVersion определяет, на какой версии системы ваше приложение было протестировано и создано.

Если запустить приложение на версии Android, которая выше, чем ваша targetSdkVersion, то система постарается сделать backwards-compatibility для некоторых из фич, добавленных именно в этой системе.

Например, в Android 12 поменялся дизайн отображения уведомлений, и они будут выглядеть по-разному, если вы поставите targetSdkVersion 30 или 31.

Кстати, между этими параметрами можно выделить следующее правило: targetSdkVersion не может быть больше compileSdkVersion, а в идеале они должны быть равны между собой и равны последней версии SDK.
​​Android приложение на Firebase
#firebase

Нашёл отличный пример приложения, написанное на Kotlin, которое использует продукты Firebase.

Автор решил ответить на топ самых популярных вопросов, связанных с Firebase в виде небольшого приложения, вот некоторые из них:
• как настроить авторизацию пользователей, и записать информацию о них в Cloud Firestore?
• как сделать авторизацию через Google корректной?
• как правильно читать данные из Realtime Database, используя MVVM, Coroutines и Flow?

Так и получилось приложение FireApp, где даны ответы на эти и многие другие вопросы. Автор говорит, что приложение будет пополняться фичами и дальше, так что, вероятно, нас ждёт большая функциональность.

Рекомендую ознакомиться, если вы раньше плотно не работали с Firebase сервисами, но задумываетесь об использовании их в своих проектах
​​ADB-команды
#tools

Уверен, что вы знакомы с таким инструметом, как adb. По сути, это программа в виде командной строки, которая позволяет коммуницировать с подсоединённым устройством Android. Сегодня пару советов про этот полезный инструмент.

Есть отличный плагин для автоматизации распространённых действий при помощи adb — ADB Idea, который крайне рекомендую поставить и пользоваться с удовольствием.

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

От себя добавлю классный флаг к команде adb install -g app.apk, который дает все разрешения приложению. Удобно, если дебажите приложение и не хотите заморачиваться с лишним прокликиванием уже знакомых диалогов. Её также можно добавить как атрибут при запуске приложения из Android Studio.

А какой ваш топ полезных команд?
​​AndroidX: App Startup
#jetpack #library

AndroidX App Startup — одна из самых малоизвестных библиотек из Jetpack. Давайте исправлять эту ситуацию и рассмотрим эту библиотеку детальнее.

Для чего она нужна?
Зачастую различные компоненты приложения инициализируют свою логику при его старте, например, такие компоненты как WorkManager или Lifecycle. Пользователь, который ожидает быстрого старта приложения, получает белый экран, особенно если у него не самый шустрый девайс. Для того, чтобы улучшить время старта приложения и появилась App Startup.

Как работает?
По сути, библиотека представляет из себя единый ContentProvider, который запускает несколько зависимостей одной за другой. Это позволяет исключить поведение, при котором компоненты используют свои собственные ContentProvider, замедляя старт приложения. Ну и killer-feature является то, что можно настроить момент инициализации компонента вручную и убрать часть инициализаций на старте.

Почитать подробнее о том, как использовать библиотеку у себя можно в этой статье.

Рассказывайте, уже использовали библиотеку? Как вам?
👍2
​​Миграция с Groovy на Kotlin DSL
#kotlin #gradle

Для многих разработчиков написание каких-то изменений в build.gradle — это боль. Во многом из-за языка groovy и его работы в Android Studio, который частенько отталкивает разработчиков от изменений.

Но решение есть, и это — Kotlin DSL, который позволяет настраивать gradle на всеми нами любимом Kotlin.
Несколько плюсов от этого:
🔹лучшая читаемость кода;
🔹большие возможности для написания скриптов, так как разработчики лучше знакомы с Kotlin;
🔹навигация по коду и подсказки;
🔹проверка ошибок во время компиляции;

…и другие плюсы, но говорят, что может работать медленнее на некоторых операциях, типа clean или изменениях в buildSrc. 🤨

Хорошая статья, которая описывает миграцию с groovy на Kotlin DSL тут.

Ну а лично я склоняюсь к тому, чтобы перейти к этому решению в своих проектах, так как удобств гораздо больше.
​​Стрим с обзором резюме №1
#youtube #android_live

Давно на YouTube-канале Android Live не было стримов. Исправляюсь и пробую новый формат — обзор резюме подписчиков.

Было несколько запросов об этой рубрике, и вот этот формат появляется на канале. Если вам зайдёт — сделаем его регулярным.

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

Наш гость — Евгений Васильев, HR-специалист с 5-летним опытом работы, на данный момент работает в Спортмастер, а до этого 2,5 года работал в системе Сбербанка.
Опыт работы связан с подбором персонала: Java, мобильные разработчики, devops/sre, администраторы баз данных, администраторы it-инфраструктуры, разработчики Oracle pl/sql и многие другие.

Вы можете отправить заявку на обзор своего резюме в эту форму. Несколько резюме из списка будут выбраны рандомно, при желании выбранные люди смогут подключиться к стриму и задать свои вопросы напрямую. Если вы хотите попасть на обзор без рандома, то можете сделать это поддержав канал на Boosty. Спасибо всем, кто это делает. 🤟

Стрим состоится 29 июня в 18:30 по МСК на канале Android Live. Подписывайтесь, чтобы не пропустить что-то интересное.😉
​​KMM для AppCode
#kmm

Сегодня вышла отличная новость: появился плагин для App Code, который позволяет писать Swift и Kotlin код внутри одной IDE. 🔥

Это очень круто, так как переключение между IDE — не самая удобная штука при написании таких проектов.

В будущем ребята обещают миграцию текущих .xcodeproj и .xcworkspace проектов на Gradle DSL, чтобы сделать возможным лучше соединить текущие проекты на Xcode с KMM и Android.

Звучит очень круто, мне такая кроссплатформа нравится. 💪
​​Вышел Kotlin 1.5.20
#kotlin

Тут вчера прилетело новое обновление Kotlin. Как всегда, детали можно почитать в блоге, а здесь опишу кратко изменения:

🔸для получения максимальной пользы от последних JVM-фич, Kotlin расширяет использование динамических вызовов (invokedynamic). В этой версии добавилась конкатенация строк через invokedynamic, или если попроще, то теперь используется StringConcatFactory.makeConcatWithConstants() вместо StringBuilder.append(). Подробнее тут.

🔸добавлена экспериментальная поддержка Java’s Lombok-generated методов. Тут можно почитать, что поддерживается на данный момент.

🔸также появилась экспериментальная поддержка плагина JSpecify, который включает в себя набор аннотаций для проверки на null в Java. По идее, плагин даёт возможность лучше управлять nullability, если вам важна совместимость с Java.

🔸компилятор Kotlin/Native теперь поддерживает экспорт KDoc из Kotlin-кода в Objective-C. Фича даёт возможность делать комментарии видимыми для тех, кто использует написанный вами код, что весьма удобно.

🔸исправлена функция Array.copyInto() в Kotlin/Native, которая теперь работает гораздо быстрее.

🔸добавлено руководство для миграции на новый JS backend.

🔸параллельное выполнение задач в gradle теперь контролируется Gradle parallel execution mechanism. Аннотация kotlin.parallel.tasks.in.project стала deprecated.

🔸экспериментальная фича для настройки кэширования, которая позволит увеличить скорость запуска kapt.

🔸пара мелких изменений в стандартной библиотеке, связанной с функциями isLowerCase(), isUpperCase() и digitToInt().
​​Android-приложения на Windows 11

Тут недавно вышла новая операционная система от Microsoft — Windows 11.
Новость совсем не про Android-разработку, однако добавился интересный момент: теперь на ней можно будет запускать Android-приложения, скачанные с Amazon’s Appstore через Microsoft Store.

Microsoft заявляет, что эти приложения будут работать так же, как и остальные. Вроде как, это ответ на действия Apple с их новым процессором M1.

Мне кажется, что новость довольно любопытная, и очень интересно, будет ли возможность запустить приложения для debug во время разработки или же нет?

Чуть больше деталей тут.
​​Развитие механизмов безопасности Android
#security

В современной разработке безопасности отводится довольно важная часть. Для нас, разработчиков под Android, с каждым обновлением ОС приходится исправлять своё приложение в зависимости от нововведений.

Если вам интересно, как изменилась безопасность системы Android с самых первых версий, то вот отличная статья.

Можно наблюдать, как эволюционировала безопасность Android от версии к версии и как это повлияло на дальнейшее развитие системы. Так что если вы увлекаетесь безопасностью, да и вообще людите историю операционных систем — welcome. 😎
Пятничный опрос на провокационную тему:

Какая у вас зарплата? (в ₽ на руки) Можно честно, опрос анонимный 😉
Anonymous Poll
25%
до 69К
12%
70К — 99К
16%
100К — 149К
16%
150К — 199К
11%
200К — 249К
8%
250К — 299К
4%
300К — 349К
2%
350К — 399К
7%
400К и больше
​​Nearby Connections API
#theory #api

Сегодня расскажу вам о довольно редком, но, на мой взгляд крутом и недооценённом API — Nearby Connections API. Оно позволяет устройствам связываться друг с другом даже при отсутствии Интернета.

Для чего нужно?
Это API даёт возможность делиться какими-то файлами, сообщениями и другими данными в своём приложении без сети. На сайте с документацией приведены такие примеры:
🔹трансфер файлов оффлайн;
🔹использование девайса в качестве контроллера в играх;
🔹игры с оффлайн мультиплеером;
🔹доски для совместной работы.

Как работает?
API использует Bluetooth и другие технологии, например WiFi, которые обеспечивают peer-to-peer соединение на близком расстоянии (в пределах 100 метров).
Безусловно, есть лимиты на количество соединений: Bluetooth поддерживает около 4 соединений одновременно, WiFi ограничивает примерно от 10 до 100 подключений одновременно в зависимости от того, доступны ли маршрутизаторы, которые можно использовать как «мост».

Помимо этого API существует альтернатива — Nearby Messages API, правда ей для работы нужен Интернет и размер передаваемых данных довольно мал.
С другой стороны, Nearby Connections API может работать только на Android, а прыдущий аналог поддерживает ещё и iOS.

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

Больше деталей о том, как добавить в проект это API можно найти тут.
​​Material Transitions
#api #fragment

Анимация редко меняет главную функциональность приложения. Но нельзя отрицать, что она имеет большое значение для пользователя. Когда в приложении есть анимация, все выглядит плавнее и пользователю легче понять, как элементы экрана сочетаются друг с другом.

Одним из типов анимаций является Transitions: это анимации перемещения с одного экрана на другой. Мы можем анимировать или весь экран целиком, или только некоторые View этого экрана.

Попалась статья, где автор рассказывает о добавлении анимаций в приложение, где не было никаких анимаций перехода и о результатах, которые он получил.
​​Оптимизация RecyclerView при помощи префетчинга
#recyclerview

Даже стандартная реализация RecyclerView работает довольно стабильно и хорошо. ✌️
Однако, если ваш список состоит из нескольких типов элементов или эти элементы сложные, самое время задуматься о дополнительных оптимизациях. Самыми быстрыми и простыми в добавлении будут setHasFixedSize, DiffUtil, создание плоских View.

Автор статьи решил пойти дальше и добавить префетчинг View вне основного потока. Для этого он использовал RecyclerView.RecycledViewPool, который и выполнял нужную работу.

Лично у меня ещё не было шанса оценить скорость прироста при использовании данного подхода, так как в текущих проектах нет RecyclerView с большим числом разных viewType и нет экранов, где есть первоначальные загрузки списков. Но подход выглядит круто, и если вы хотите ещё больше оптимизировать ваши списки, то воспользуйтесь.

Кстати, есть уже готовая библиотека с реализацией этого подхода на Kotlin Coroutines, RxJava2, RxJava3 и Executor.
Windows 11, 10, etc - авторский канал с тайным знанием о флагманской ОС Microsoft

В комплекте срыв покровов и доставка пруфов.
​​Recycler View Series
#recyclerview #новичкам

Мне тут случайно в рекомендациях попался ряд статей про RecyclerView, где рассказываются основы этого замечательного элемента, и о том, как его правильно применять.

В первой статье рассматривается этот компонент, его принцип работы, ну и то как добавить самый простой список в проект. Отлично показано, как работают методы onCreateViewHolder(), onBindViewHolder().

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

Третья — очень короткая статья, которая рассказывает про имплементацию клика на элемент, а последняя в этой серии — про создание Header при помощи ConcatAdapter.

Так что если вы новичок — эта серия поможет разобраться во всей базе, связанной с RecyclerView. 🤟
​​Mock API для разработчиков
#tools

Думаю, что всем знакома ситуация, когда нам нужно закончить фичу, но backend ещё не готов. В этом случае каждый выкручивается как может: делает заглушки в виде JSON на клиенте, заполняет классы вручную, или оставляет список пустым, ожидая завершения работ на сервере.

Но, вероятно, самым удобным способ является использование Mock API. По сути, это обычный сервер, который просто возвращает вам предварительно заполненный JSON-файл. Если у вас есть чёткое понимание ответа от сервера, то всё что вам нужно сделать при завершении работ на сервере — это переключить сервер.

Вот пара сервисов для организации Mock API — Mockable.io и Postman. В целом, мне больше нравится второй вариант, видимо по причине того, что я использую это средство для совершения запросов к реальному серверу.

Тут описано то, как настраивать сервер.
​​AppCode и KMM-плагин — как работает внутри?
#youtube #android_live

Совсем недавно на канале был анонс того, что в AppCode появился плагин для разработки под KMM. Подобное решение выглядит классно, ведь можно использовать одну IDE для того, чтобы писать приложения под KMM сразу и на iOS и на Android.

Но всё ли так хорошо? Насколько стабильно всё работает, и можно ли использовать этот плагин в проде? А какие планы на будущее и что нас ожидает? Ответы на эти и многие другие вопросы мы получим на YouTube-канале AndroidLive.😉

А поговорим обо всём этом с Айдаром Мухаметзяновымразработчиком из JetBrains, который трудится над AppCode и KMM-плагином для него. До этого Айдар 7 лет разрабатывал iOS приложения в разных компаниях.

Трансляция пройдёт 21 июля в 18:30 по МСК. Мы обсудим то как плагин работает внутри, а потом вместе сделаем небольшое приложение, которое покажет все возможности IDE. Ссылка на трансляцию тут. Уверен, что будет интересно 😎

А свои вопросы вы уже можете задать уже сейчас, тут.

До встречи на стриме! 😉
2025/08/28 02:49:54
Back to Top
HTML Embed Code: