Android Broadcast
14.2K subscribers
3.53K photos
342 videos
11 files
5.91K links
Подборка новостей и статей для Android разработчиков.

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

РКН https://abdev.by/rkn_tg_ab
加入频道
🎉 Jetpack Navigation 3 - навигация для Compose, написанная с нуля!

Будем честны Jetpack Navigation for Compose было никаким решением, до того как в ней появилась типобезопасная навигация, но и тогда остается много вопросов. Google решила что пора написать настоящую навигацию для Compose. Знакомьтесь - Jetpack Nav 3

Ключевые идеи в новой библиотеки: декларативное объявление + "навигация как состояние". Это полностью повторяет идеи что я заложил в NavState. Все это вылилось в принципы:
👉 Разработчик управляет back stack
👉 Возможность расширения и реализации собственной навигации на базовых компонентах
👉 Анимации из коробки
👉 Поддержка Predictive Back
👉 Поддержка адаптивных layout
👉 Сохранения состояния каждого элемент back stack, включая ViewModel
👉 Поддержка многомодульности

Пока представлена только первая альфа и библиотеки еще предстоит путь, как минимум обзавестись поддержкой KMP

🔗 Больше подробности в документации
🐱 Примеры использования на GitHub

Надо покопаться в ней и сделать видео на тему!

#jetpack #compose #навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83👍22🤔12
Пример использования Jetpack Compose Nav3
// Определите route в вашем приложении
@Serializable data object Home
@Serializable data class Product(val id: String)

// Создайте back stack, указав начальный route
val backStack = remember { mutableStateListOf<Any>(ProductList) }

// NavDisplay отображает ваш back stack
// Каждый раз, когда back stack меняется, отображение обновляется.
NavDisplay(
backStack = backStack, // Простой List<Any>

// Укажите, что должно происходить при нажатии кнопки "назад"
onBack = { backStack.removeLastOrNull() },

// Провайдер записей преобразует маршрут в NavEntry,
// который содержит контент для этого маршрута.
entryProvider = { route ->
when (route) {
is Home -> NavEntry(route) {
Column {
Text("Добро пожаловать в Nav3")
Button(onClick = {
// Чтобы перейти к другому экрану,
// просто добавьте его в back stack
backStack.add(Product("123"))
}) {
Text("Нажмите для навигации")
}
}
}
is Product -> NavEntry(route) { Text("Продукт ${route.id}") }
else -> NavEntry(Unit) { Text("Неизвестный route: $route") }
}
}
)


#jetpack #compose #навигация
👍37🤔19🔥14
🚀 Вышел Jetpack Window Manager 1.4 - библиотека для работы с разными форматами устройства и несколькими окнами с поддержкой KMP

Что нового в свежей версии:
👉 Улучшения Activity Embedding
👉 Улучшения API WindowMetrics
👉 Улучшили API для тестирования

#jetpack #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Media is too big
VIEW IN TELEGRAM
📹 Адаптивная Android разработка сделает ваше приложение классным на любом устройстве - Google IO 2025

Очень полезный доклад про разработку адаптивного приложения по дизайну, фичам и поведению. Учитывая, стойкий тренд перехода Android разработки в KMP это как никогда актуально!

#android #adaptive #material3 #jetpack #googleio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
В Jetpack делают KMP API для обработки системных жестов нажатия назад или Predictive Back

Новая библиотека Jetpack NavigationEvent содержит в себе API для обработки нажатия назад или для отслеживания прогресса жеста назад. API cхоже с Dispatcher которое было сделано для Back ранее. Поддерживаются KMP таргеты: Android, Desktop/JVM, iOS, JS, Linux, WASM, watchOS, tvOS, Ming

ComponentActivity реализует интерфейс NavigationEventDispatcherOwner:
interface NavigationEventDispatcherOwner {

val navigationEventDispatcher: NavigationEventDispatcher
}


NavigationEventDispatcher представляет собой класс, для передачи системны событий Назад:
class NavigationEventDispatcher(
private val fallbackOnBackPressed: (() -> Unit)?,
private val onHasEnabledCallbacksChanged: ((Boolean) -> Unit)?,
)
// Добавления callback чтобы слушать когда произйдет нажатие "Назад"
fun addCallback(
callback: NavigationEventCallback,
priority: NavigationEventPriority = NavigationEventPriority.Default
)

fun dispatchOnStarted(event: NavigationEvent)

fun dispatchOnProgressed(event: NavigationEvent)

fun dispatchOnCompleted()

fun dispatchOnCancelled()
}


В Android Activity можно подписаться на обработку события
class MyActivity : ComponentActivity() {

init {
navigationEventDispatcher.addCallback(
callback = object : NavigationEventCallback(
isEnabled = true,
priority = NavigationEventPriority.Default
) {
override fun onEventCompleted() {
// Back сделан
}
},
priority = NavigationEventPriority.Default
)
}
}


#android #jetpack #навигация #kmp #kotlin
25👍11🔥7🤔3
🎉🚀 Новая Jetpack Библиотека - Photo Picker

Новая библиотека Jetpack Photo Picker позволит перенести встраиваемый Photo Picker из Android 16 на более ранние версии Android. Благодаря Mainline системе встраиваемый Photo Picker будет доступен на Android 14 и выше как часть ОС, а вот на других версиях будет помогать библиотека Jetpack Photo Picker, работающая скорее всего на основе Google Play Services.

Важно - сразу сделали версию для View и Compose

#android #jetpack #android16 #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥48👍93
Media is too big
VIEW IN TELEGRAM
📹 Jetpack Navigation 3 Core Concepts (EN,11м)

Рассказ про основные принципы новой навигации от Google для Compose - Jetpack Navigation 3

0:00 Вступление
1:05 Что есть Навигация
2:08 Архитектура
4:40 Требования
5:26 Почему это так сложно
7:01 Задачи Navigation 3
9:02 Владение Backstack-ом
10:04 Будущее

#android #jetpack #compose #навигация
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25🤯94🤔1
🚀 Вышел стабильный JavaScript движок от Google для Android

Новая стабильная библиотека Jetpack JavaScript Engine позволит разработчикам выполнять JS код в изолированной и ограниченной среде.

class MainActivity : ComponentActivity() {

// Теперь nullable, без lateinit
private var jsSandbox: JavaScriptSandbox? = null
private var jsIsolate: JavaScriptIsolate? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

if (!JavaScriptSandbox.isSupported()) {
Log.e("JS", "JavaScriptSandbox не поддерживается")
return
}

lifecycleScope.launch {
// Создаём и сохраняем в nullable-поле
jsSandbox = JavaScriptSandbox
.createConnectedInstanceAsync(applicationContext)
.await()
jsIsolate = jsSandbox?.createIsolate()

// При выполнении гарантируем, что jsIsolate != null
val result: String = jsIsolate
?.evaluateJavaScriptAsync(JS_SCRIPT_SCRING)
?.await()
?: "Ошибка: isolate не инициализирован"

Log.d("JS", "Результат выполнения: $result")
}
}

override fun onDestroy() {
super.onDestroy()
// Закрываем только если не null
jsIsolate?.close()
jsSandbox?.close()
}
}


#jetpack #js
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯32👍16🔥21
Media is too big
VIEW IN TELEGRAM
📹 Разбор Jetpack Navigation 3 - настоящая навигация для Compose (21 мин)

Месяц назад Google анонсировала навигацию специально разработанную под Compose и которая должна решить все боли. В видео показываю её возможности, делюсь своим мнение и рассказываю про недочеты, которые надеюсь что решат до стабильного релиза

#AndroidBroadcast #navigation #jetpack #compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥10🤔43
🚀 Вышел Jetpack Benchmark 1.4 Stable

Microbenchmark
👉 Сделали рефакторинг BenchmarkRule и перевели на работу через Kotlin Coroutines
👉 Gradke таски lockClocks и unlockClocks перенесли из root проекта в benchnmark проект

Macrobenchmark
👉 Исправили работу на Android 14 и выше
👉 Добавили ArtMetric для выявления неоптимальной загрузки классов, чтобы лучше настроить BaselineProfile

Что еще:
👉 Baseline Profile теперь может работать с приложениями с множеством процессов
👉 TraceProcessor вынесли в отдельный артефакт

#android #jetpack #производительность #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍41
🚀 Jetpack Lifecycle позволит создавать дочерние Lifecycle в Compose

В Jetpack 2.10.0-alpha01 появилась новая Composable функция LifecycleOwner для создания дочернего Lifecycle. Изменение нужно для Navigation3.

@Composable
fun MyComposable() {
LifecycleOwner(
maxLifecycle = RESUMED,
parentLifecycleOwner = LocalLifecycleOwner.current,
) {
val childLifecycleOwner = LocalLifecycleOwner.current
}
}


#compose #jetpack #android #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔236👍4🔥4
🚀 Вышел Jetpack Browser 1.9.0 - библиотека для интеграции Custom Tab в приложения

👉 Появилась возможность добавить элементы контекстного меню в Custom Tabs — теперь вы можете собственные пункты меню внутри вкладки
👉 Появилось экспериментальное Auth Tab API. Цель - OAuth авторизация через Web браузер
👉 Улучшения TrustedWebActivityIntent
Есть и другие менее заметные обновления

#android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍142
🚀 Jetpack Paging теперь поддерживает таргеты watchos, tvos, mingwX64, watchosDeviceArm64 и linuxArm64

#jetpack #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍3
🚀 Выпустили стабильную версию библиотеки Security-App-Authenticator-Testing 1.0, позволяющую конфигурировать собственный AppAuthenticator для тестов

#android #jetpack #безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍1
Вышел новый стабильный релиз тестовых библиотек от Google
🚀 Test Core 1.7.0
🚀 Test Espresso 3.7.0
🚀 Test Espresso Device 1.1.0
🚀 Test JUnit Extensions 1.3.0
🚀 Test Truth Extensions 1.7.0
🚀 Test Monitor 1.8.0
🚀 Test Orchestrator 1.6.0
🚀 Test Runner 1.7.0
🚀 Test Rules 1.7.0
🚀 Test Services 1.6.0

Из основных изменений:
👉 Повышение minSdk = 21
👉 Обновление зависимостей
👉 Исправление багов

#android #jetpack #тестирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍4
🚀 Media3 1.8.0 — апдейт, который стоит внедрить прямо сейчас

Google продолжает прокачивать медиа API, и в этом релизе есть фичи, которые экономят время разработки и улучшают UX.

📺 ExoPlayer
👉 Плавная перемотка: новый ScrubbingMode делает скролл прогресс-бара без отрыва пальца супер-отзывчивым. Пользователь почувствует разницу.
👉 Встроенная видео-реклама: нативная поддержка Ads Interstitials в стриминге — меньше костылей.
👉 Длительность видео без проигрывания:
val duration = MetadataRetriever
.Builder(context, mediaItem)
.build()
.use { it.retrieveDurationUs().await() }

👉 PreCacheHelper — загрузка контента по частям для более быстрых стартов.

🎵 MediaSession
👉 Плеер в шторке не исчезает сразу после паузы — пользователю проще вернуться к просмотру.

✂️ Transformer API
👉 Экспериментальная обрезка видео через MP4 edit list.
👉 Опция CodecDbLite — ускоряет кодирование, подбирая оптимальные настройки под чипсет:
Transformer.Builder()
.setEncoderFactory(
DefaultEncoderFactory.Builder()
.setEnableCodecDbLite(true)
.build()
)
.build()


💡 Почему обновляться сейчас
👉 Меньше кастомного кода — больше нативных возможностей.
👉 Повышение отзывчивости плеера = выше удержание пользователей.
👉 Новые API для подготовки к интеграции рекламы и улучшенного UX.

Подробнее в анонсе или в changelog

#android #AndroidDev #Jetpack #Media3 #ExoPlayer
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35🔥131
‼️ Важно изменение Android Jetpack - minSdk повысили с Api Level 21 (Android 5.0) до 23 (Android 6.0). Пока только в следующих версиях библиотек, но это всего 1-2 месяца.

Если ваше приложение поддерживает Android 5.0 и выше, то использовать новые версии библиотек уже не получится. Что можно сделать:
👉 Остаться на старых версиях
👉 Повысить minSdk до 23 или выше
👉 Поддерживать всё самостоятельно

Источник - Ian Lake из команды Android Jetpack

#android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🤯14🔥13🤝3
‼️ Google нашла решения проблем багов для конкретных устройств 😂

Известно, что отдельные устройства под Android имеют собственные баги. Производители их не правят по разным причинам: закончилась поддержка, не хотят тратиться или предложили на форуме обход. Может просто идет долго доставка фикса до вашего устройства (всякое может быть)

Команда Android Jetpack сделала библиотеку core-backported-fixes, чтобы помочь разработчикам проверить состояния бага для текущего устройства 😂

Пример кода проверки issue KI_398591036 (проблема с цветом в фото на Pixel устройствах)
val fixManager = BackportedFixManager()
if (fixManager.isFixed(KnownIssues.KI_398591036)) {
Offer_experience_that_needs_fix()
} else {
Offer_experience_that_avoids_the_bug()
}


Все issue для проверки описаны в классе KnownIssues

#android #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯88👍95🤔3🔥2🎉1🙏1🏆1