Android Broadcast
Подборка новостей и статей для Android разработчиков. Реклама и связь с автором @ab_manager РКН https://abdev.by/rkn_tg_ab #MQRZR
Show more📈 Analytical overview of Telegram channel Android Broadcast
Channel Android Broadcast (@android_broadcast) in the Russian language segment is an active participant. Currently, the community unites 14 583 subscribers, ranking 8 750 in the Technologies & Applications category and 45 369 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 14 583 subscribers.
According to the latest data from 10 July, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by 39 over the last 30 days and by -1 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 44.92%. Within the first 24 hours after publication, content typically collects 23.72% reactions from the total number of subscribers.
- Post reach: On average, each post receives 6 551 views. Within the first day, a publication typically gains 3 459 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 42.
- Thematic interests: Content is focused on key topics such as api, kotlin, gradle, сборка, androiddev.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Подборка новостей и статей для Android разработчиков.
Реклама и связь с автором @ab_manager
РКН https://abdev.by/rkn_tg_ab #MQRZR”
Thanks to the high frequency of updates (latest data received on 11 July, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
// Пример проверки неподдерживаемых комбинаций
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