Android Broadcast
Подборка новостей и статей для Android разработчиков. Реклама и связь с автором @ab_manager РКН https://abdev.by/rkn_tg_ab #MQRZR
Больше📈 Аналитический обзор Telegram-канала Android Broadcast
Канал Android Broadcast (@android_broadcast) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 14 583 подписчиков, занимая 8 750 место в категории Технологии и приложения и 45 369 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 14 583 подписчиков.
Согласно последним данным от 10 июля, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 39, а за последние 24 часа — -1, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 44.92%. В первые 24 часа после публикации контент обычно набирает 23.72% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 6 551 просмотров. В течение первых суток публикация набирает 3 459 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 42.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как api, kotlin, gradle, сборка, androiddev.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Подборка новостей и статей для Android разработчиков.
Реклама и связь с автором @ab_manager
РКН https://abdev.by/rkn_tg_ab #MQRZR”
Благодаря высокой частоте обновлений (последние данные получены 11 июля, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
// Пример проверки неподдерживаемых комбинаций
val unsupportedFeatures = mutableSetOf<GroupableFeature>()
val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)
appFeatureOptions.forEach { featureOption ->
if (currentFeatures.contains(featureOption)) return@forEach
val isSupported = cameraInfo.isFeatureGroupSupported(
SessionConfig(
useCases = useCases,
requiredFeatureGroup = currentFeatures + featureOption
)
)
if (!isSupported) unsupportedFeatures.add(featureOption)
}
Так можно заранее отсеять неподдерживаемые сочетания — например, когда HDR и стабилизация не работают вместе при 60 FPS 🎥
Подробнее в статье (EN)
#android #camerax #Jetpack #androidjetpackViewModel.❗️Баг: при переходе в папку навигация срабатывает, UI не меняется. Современные ИИ подсказали общие вещи, но не помогли — промты, видимо, подвели (тут мне ещё надо прокачать знания) 🙂
Вспомнил ключевой факт про архитектуру:
👉 Все ViewModel живут в ViewModelStore.
👉 В пределах одного ViewModelStoreOwner (Activity/Fragment/NavBackStackEntry) получение ViewModel по умолчанию идёт по типу.
👉 Если нужно несколько экземпляров одного типа на одном owner’е — используем key.
Решение в одну строку — привязать ключ к ViewModel, связанный с текущей папкой:
@Composable
fun FileNavigator(
folderId: Id,
modifier: Modifier = Modifier,
) {
// новый folderId → новый экземпляр ViewModel → новый UI-стейт
val viewModel: FileNavigatorViewModel = viewModel(
key = "files(rootId='$folderId')"
)
// ...
}
Мини-чеклист, если ловите такой баг
👉 Один экран используется повторно с разными параметрами? → Нужен key.
👉 Меняется route, но owner тот же? → key обязателен.
👉 Используете Hilt/Koin? → У этих функций тоже есть параметр key (hiltViewModel(key=...), koinViewModel(key=...)).
👉 key должен детерминированно зависеть от входных данных (например, folderId).
👉 При навигации назад убедитесь, что ViewModel освобождается ожидаемо.
Ещё нюанс - если у вас сложная иерархия графов, проверьте, к какому ViewModelStoreOwner вы реально привязаны.
Рекомендую посмотреть мои видео по теме:
📹 Разбор Jetpack Navigation 3
🪙 Полный разбор Jetpack ViewModel в Android и Kotlin Multiplatform
#android #compose #androidjetpack #viewmodel #архитектураActivityManager.isUserAMonkey()
UserManager.isUserAGoat()
UserManager.DISALLOW_FUN
// Отдали дань памяти хиту
Chronometer.isTheFinalCountdown()
Log.wtf()
// Попало в релиз, хотя явно должно было быть исправлено
AdapterViewFlipper.fyiWillBeAdvancedByHostKThx()
// Звёздные войны
SensorManager.GRAVITY_DEATH_STAR_I
Разработчики в Google точно любит пошутить 😄
А вы где встречали весёлые названия API или переменных — в Android, KMP или своих проектах?
#androidclass ViewModel @Inject constructor(
// Зависимость получается из графа сразу при создании
private val useCase: DataUseCase,
// Получаем зависимость из графа каждый раз при обращении Provider.get()
private val useCaseFactory: Provider<DataUseCase>,
// Получаем зависимость из графа при первом обращении
// и затем она кэшируется в Lazy объекте
private val useCaseLazy: Lazy<DataUseCase>,
)
💡 Чтобы перейти на Lazy без боли в существующем коде — можно использовать делегаты свойств в Kotlin:
// Вариант использования без Lazy
class ViewModel @Inject constructor(
private val useCase: DataUseCase
)
// Миграция на Lazy без потери API совместимости
class ViewModel @Inject constructor(
useCaseFactory: Lazy<DataUseCase>,
) {
private val useCase: DataUseCase by useCaseFactory
}
И небольшой хелпер, чтобы это работало красиво 👇
// Функция расширения для использования property делегата
operator fun <T> Lazy<T>.getValue(thisRef: T, property: KProperty<*>): T = get()
Таким образом, вы снижаете нагрузку на DI граф, откладываете инициализацию и избегаете ненужных каскадов при старте компонентов.
#di #dagger #hilt #лучшиепрактики// Создаем экземпляр менеджера
val ageSignalsManager = AgeSignalsManagerFactory.create(
ApplicationProvider.getApplicationContext()
)
// Запрашиваем проверку возрастных сигналов
ageSignalsManager
.checkAgeSignals(AgeSignalsRequest.builder().build())
.addOnSuccessListener { ageSignalsResult ->
// Сохраняем installId для дальнейшего использования
val installId = ageSignalsResult.installId()
when (ageSignalsResult.userStatus()) {
AgeSignalsVerificationStatus.SUPERVISED_APPROVAL_DENIED -> {
// Пользовтаелю меньше 18 лет и родитель запретил доступ
}
AgeSignalsVerificationStatus.VERIFIED -> {
// Пользователю больше 18 лет
}
else -> {
// Обрабатываем другие статусы
}
}
}
#googleplay