Android Broadcast – Telegram
Android Broadcast
14.4K subscribers
3.68K photos
367 videos
11 files
6.1K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
Команда языка Kotlin запустили новый опрос, чтобы вы поделились своим опытом использования языка. Что вам нравится? Что нет? Что вызывает сложности? На все это можно ответить в опросе.

Также вы сможете выиграть призы:
🔥 3 билета на KotlinConf 2020
🔥 20 маек с символикой Kotlin
#Новости #Podcast #Kotlin #Multiplatform

Если у вас есть вопросы по Kotlin Multiplatform Mobile - спешите задать их в @android_broadcast_discussions, ведь совсем скоро я буду записывать эпизод "Android Broadcast Podcast" c представителями команды из JetBrains: Анастасией Капаниной (Product Manager Kotlin MPP) и Кириллом Шмаковым (разработчик в Kotlin MPP).
#Podcast #Kotlin #Multiplatform

Android Broadcast #3: Kotlin Multiplatform - выходим за рамки Kotlin/Android c IceRock

В ожидании выпуска вы можете послушать другие эпизоды. Например, интересующимся Kotlin MPP подойдет выпуск об опыте разработчиков из компании IceRock о адаптации этой технологии для Android и iOS проектов. Ребята разработали более 10 проектов с ее использованием и говорят уже на реальном опыте применения в production.
#Kotlin

Zero-cost* abstractions in Kotlin

Очень часто приходится сталкиваться в коде с тем, что в виде чисел могут представляться разные по смыслу переменные. Лучший пример - идентификаторы ресурсов в Android. Все это выражается цифрами и передать неправильное значение довольно легко.

Google дала нам решение в виде xxxRes, IntDef, IntRange и др. аннотаций над типами, но это не позволяет избавиться от ошибки во время компиляции.

Как же это решать? Оборачивать все в отдельные классы? Это доп. расход памяти и всех нас учили использовать Java примитивы в предпочтение типам оберткам.

В Kotlin предложили свое решение - inline классы, которые во время компиляции встраивают обернутый объект в место вызова. В статье вы найдет больше подробностей об это возможности языка Kotlin и когда компилятор не может развернуть тип
#JUnit #Test

Вышла новая версия JUnit 5.6.0

Основные изменения:
👉 Новый @Enabled/@DisabledForJreRange условия для выполнения теста
👉 Новое API TestInstancePreDestroyCallback для расширений
👉 Улучшение отчетов для крэшей во время поиска/выполнения тестов
👉 Модуляризация Javadoc

Множество других улучшений который вы можете найти в полном описание изменений
Какую версию JUnit используете вы?

JUnit 5 (Spek 2 здесь) - 33
👍👍👍 13%
JUnit 4 - 115
👍👍👍👍👍👍👍👍 47%
Не пишу тесты - 83
👍👍👍👍👍👍 34%
Не знаю - 5
👍 2%
Использую другой тестовый framework - 3
👍 1%
Секрет. Но результаты посмотрю - 7
👍 3%
👥 246 человек уже проголосовало.
#Gradle #CI #Performance

How fast are your Android CI builds? And why it matters

Android проекты растут и разрабатываются долгое время большими командами. Все разработчики локально страдают от того как собираются долго проекты, но на CI это делается еще дольше так как обычно ему надо сделать:
👉 Скомпилировать код
👉 Прогнать Unit тесты
👉 Запустить статический анализатор KtLint, Detekt, Checkstyle, Android Lint и др.

Все это еще происходит медленнее чем на локальной машине т.к. на сервере выключается Gradle демон, который не имеет смысла на CI, когда собирается много разных ветках или вовсе все в Docker контейнерах.

В статье приводится история ребят, которые вместе с DevOps сели решить проблему долгой сборки проекта (47 минут) и как у них получилось (8 минут)

От себя рекомендую периодически запускать Gradle Build Scan, чтобы проверить где у вас есть проблемные места в сборке.
#Kotlin #DSL #Builder

Builder Pattern vs Kotlin DSL

Когда у класса в конструкторе много параметров, хорошим тоном является использовать паттерн Builder. Но Kotlin может предложить более интересную альтернативу - Kotlin DSL.

В статье разбирается как заменить старый подход новым.
Починить, хакнуть, раскопать. Решаем онлайн-квест Droid Mission

В прошлом году Яндекс провел квест для мобильных разработчиков Droid Mission. После подведения итогов можно ознакомиться с решениями задач.

Тематика их абсолютно разная: SQLite, Android SDK, утечки памяти, Java, Android NDK, Dagger, Reverse Engineering и взлом приложений
#Dagger

Dagger Browser - простая утилита для навигации по сгенерированному Dagger графу с помощью SPI плагина
#Fragment

Android MultiStacks

Популярный дизайн паттерн в Android приложениях Bottom Navigation имеет один недостаток в реализации - в библиотеке AndroidX Fragment нет поддержки множества стеков для каждой вкладки ☹️. Библиотека Android MultiStacks предлагает решение этой проблемы.
#Podcast

Android Broadcast #5: "Как стать крутым разработчиком" с Денисом Неклюдовым

Каково это быть крутым и популярным разработчиком? Когда ты выступаешь на митапах и конференциях, твой голос узнают в подкастах и читают твои статьи. Однозначно интересно! Это дает как профессиональное развитие, так и карьерное продвижение. Как стать таким разработчиком выяснил с Денисом Неклюдовым. Завсегдатый Dev Fest-ов и тайный поклонник Android Academy.

Денис Неклюдов - Android разработчик в Lyft, Google Developer Expert в Android, IoT и Google Pay. Ведущий подкаста "Android Dev Podcast". Чаcтый спикер на конференция Mobius и Apps Conf.

Полезные ссылки:
👉 Android Dev Podcast RU
👉 Android Dev Podcast EN
👉 Android Dev Podcast Telegram
👉 Доклад "Google Ecosystem for Apps. Total Integrations"
👉 Доклад "Переезд: подготовка, выбор, освоение территории"
👉 Доклад "Переезд Vol2. Детальный разбор направлений"
👉 Интервью с Денисом "Об удаленке в Тайланде, переезде в Сингапур, экстраординарной визе в США!"
👉 Отзывы на "90 Seconds"
👉 Анонс курсов по трудоустройству от Дениса и Кати из Подлодки Подкаста
👉 Программа "Google Developer Experts"
👉 Денис на сайте GDE

Контакты:
👉 Кирилл Розов - krl.rozov@gmail.com, t.me/krlrozov
👉 Денис Неклюдов - t.me/nekdenis

Отдельное спасибо Александру Марцинкевичу за помощь в монтаже выпуска
#Android10 #DarkTheme

Dark Mode

Темная тема - одна из самых долгожданных функций в Android 10. Её наличие позволяет сократить расход батареи и уменьшить напряжение на глаза в темных условиях. В видео разбирают как можно адаптировать ваше приложение под темную тему.
#AndroidKtx #Kotlin #Codelab

Building a Kotlin extensions library

Используете ли вы Android KTX библиотеки? Это расширения стандартного API и библиотек из Jetpack чтобы удобно писать под Android на языке Kotlin.

Google выпустила новую Codelab с руководством как создать свою собственную Ktx библиотеку и адаптировать ее API. Рассматриваются:
👉 Extension Functions
👉 Coroutines
👉 Flow

Также рекомендую посмотреть доклад "KotlinConf 2019: Android Jetpack ❤️ Kotlin: On the road to more wholesome APIs" от Wojtek Kaliciński
#Jetpack #Fragment

Jetpack Updates 22.01.2020

Новая пачка обновлений библиотек из Jetpack:
👉 Activity 1.1.0
👉 Fragment 1.2.0
👉 Lifecycle 2.2.0
👉 ViewModel-SavedState 1.0.0
👉 Navigation 2.2.0
👉 Sqlite 2.1.0
👉 Transition 1.3.0
👉 WorkManager 2.3.0

Также еще вышли новые альфы CameraX, Ads, Heif Writer и TextClassifier

Давайте подробнее пройдется по каждой из библиотек
#Jetpack #ViewModel #SavedState

ViewModel-SavedState 1.0.0

В ViewModel решена задача с сохранением данных при изменение конфигурации. Ранее состояние сохранялась пока жив процесс, но вот при его уничтожение системой способа сохранить данные "из коробки" не было. Теперь есть - SavedStateHandle
#Jetpack #Activity #ViewModel

Activity 1.1.0

Важным изменением в новой версии Activity стала изменение используемой по умолчанию фабрики для создания ViewModel. Раньше использовалась AndroidViewModelFactory на смену которой пришла SavedStateViewModelFactory.

Теперь вы можете получить SavedStateHandle в конструкторе ViewModel, например

class MyActivity : Activity() {
val vm: MyViewModel by viewModels()
}

class MyViewModel(
savedState: SavedStateHandle
) : ViewModel()
#Fragment #ViewModel #Jetpack

Fragment 1.2.0

👉 FragmentContainerView - новая ViewGroup, предназначенная специально для размещения в ней Fragment. Она исправляет проблемы с анимациями при выполнение транзакций. Забудь о FrameLayout или <fragment>, теперь только FragmentContainerView.
👉 Изменение используемой по умолчанию фабрики для создания ViewModel по аналогии с Activity 1.1.0
👉 Fragment.onDestroyView() теперь вызывается только после окончания анимации/transition
👉 Новые проверки Android Lint: теперь проверяется правильность использования getViewLifecycleOwner()
👉 Fragment.getFragmentManager() переименовано в Fragment.getParentFragmentManager()
👉 FragmentManager теперь поддерживает операции (add/replace и др.) с Fragment по их классу, в дополнение к заранее созданному объекту. Это улучшает поддержку возможности по интеграции DI в конструктор Fragment.
#ArchitectureComponent #ViewModel #Lifecycle #Coroutines

Lifecycle 2.2.0

Много новых интеграций с Kotlin Coroutines:
👉 Конвертация Flow <-> LiveData
👉 liveData { } - генератор значений с помощью Coroutine, которые доставляются через LiveData
👉 LifecycleCoroutineScope - специальный CoroutineScope, связанный с Lifecycle. Он позволяет запускать Coroutine, когда Lifecycle достигнет определенного состояния с помощью launchWhenCreated, launchWhenResumed и launchWhenStarted
👉 suspend функции, связанные с LifecycleOwner и Lifecycle, которые позволяют дождаться заданного состояния Lifecycle: whenCreated, whenStarted, whenResumed, whenStateAtLeast (только для Lifecycle)


Но помимо этого
👉 Теперь вместо ViewModelProviders.of() надо создавать ViewModelProvider через конструктор
👉 Gradle Incremental Annotation Processor: Теперь вместо аннотирования методов, который должны вызываться на методы жизненного цикла, с помощью @OnLifecycleEvent используйте DefautLifecycleObserver.
#Jetpack #ArhitectureComponents #WorkManager

WorkManager 2.3.0

Появилась возможность задавать системе, что выполняемая операция важна, и что процесс должен оставаться живым как можно дольше во время выполнения. Работает механизм поверх Foreground Service. Используйте setForegroundAsync

Также появилась возможность отображать прогресс выполнения задачи с помощью setProgressAsync