TGViewer
Channel Public Channel
Android Developer

Android Developer

@android_dev_ru

📱 Android-разработка без лишнего шума.

⚡️ Kotlin • Jetpack Compose • Gradle • Android Studio

🛠 Полезные библиотеки, open-source проекты, инструменты и практические разборы.

💚 Меньше поиска — больше кода.
Subscribers
1.27K
Photos
23
Videos
0
Links
22
Recent Posts 17 shown
Post #57 149
Фоновая синхронизация запускается несколько раз

Экран, вход в аккаунт и восстановление сети ставят одну синхронизацию в WorkManager. Если каждый раз вызывать enqueue(), в очереди могут оказаться несколько одинаковых работ.

Дайте операции устойчивое имя. Для одноразовой синхронизации можно выбрать enqueueUniqueWork с KEEP: пока работа с этим именем не завершена, новая не добавляется. Пример вызова с заранее созданным OneTimeWorkRequest:

workManager.enqueueUniqueWork(
"sync:$accountId",
ExistingWorkPolicy.KEEP,
request
)


REPLACE решает другую задачу: отменяет текущую работу и заменяет её. Выбирайте политику по смыслу операции. Имя с accountId разделяет аккаунты; случайный UUID в имени убрал бы дедупликацию.

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

#Android #WorkManager #Практика
  • ❤‍🔥 2
  • 👍 1
  • 🔥 1
Post #55 260
Клавиатура закрывает кнопку: где искать причину

Форма помещается на экран, пока не открылась клавиатура. Добавить снизу 300 dp — хрупкое решение: высота IME зависит от устройства, режима и самой клавиатуры.

Для Compose проверьте, какой контейнер получает IME-insets. Например, у прокручиваемой области формы можно использовать Modifier.imePadding(): отступ меняется вместе с клавиатурой. Но фиксированная кнопка вне этого контейнера сама не переместится — её область тоже должна учитывать IME.

LazyColumn(Modifier.imePadding()) {
// Поля формы
}


Это фрагмент размещения полей, а не готовый экран. Проверьте цепочку родителей: inset-модификаторы учитывают уже потреблённые отступы, а обычный padding не сообщает об этом автоматически. Слепое сложение padding и insets может дать лишнюю пустоту.

Критерий готовности: последнее поле и действие доступны при открытой IME, прокрутке и крупном шрифте. Закрывать клавиатуру должно быть удобно, но обязательная кнопка не должна зависеть от этого.

#Android #Compose #Практика
  • 👍 3
  • 🔥 1
Post #54 310
Практика · Android

После возвращения пропал фильтр поиска

Пользователь выбрал категорию, ушёл в другое приложение, вернулся — фильтр сбросился. При повороте экрана всё работает. Противоречия нет: ViewModel переживает изменение конфигурации, но не системное завершение процесса.

Разделите данные по сроку жизни. Результаты поиска держите в состоянии экрана, а небольшой ключ восстановления — строку запроса или ID категории — в SavedStateHandle. После пересоздания загрузите результаты заново. Локальное состояние Compose можно сохранять через rememberSaveable.

savedStateHandle["categoryId"] = selectedId
val categoryId = savedStateHandle.get<String>("categoryId")


Это схема работы с уже полученным SavedStateHandle, а не полный ViewModel. Не складывайте в saved state список карточек, bitmap или весь ответ API. Данные, которые нужны после явного закрытия приложения, храните в базе или DataStore.

Что проверить: отдельно поворот и системное завершение фонового процесса. Принудительная остановка из настроек — другой сценарий; сохранённое UI-состояние не является постоянным хранилищем.

#Android #Состояние #Практика
  • 👍 2
  • 🔥 1
Post #53 2.25K
🖥 Китайский разработчик выложил в открытый доступ целую автомобильную ОС, которая превращает любой Android-смартфон в беспроводной адаптер CarPlay.

Она называется OkcarOS. Это кастомная прошивка Android 13, которая напрямую общается с экраном автомобиля по протоколу CarPlay.

→ Подключение за 4 секунды
→ Видео 60 fps, битрейт 25 Мбит/с
→ Без потерь аудио PCM
→ Разрешение 1:1 с экраном в автомобиле

100% с открытым исходным кодом.

🖥 https://github.com/okcar-os/android

@android_dev_ru #android
  • 👍 9
Post #52 915
✏️ Чек-лист: полный контроль качества

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

✔️ Основные проверки

➖ Тестирование на 5+ реальных устройствах (включая старые модели)
➖ Проверка работы приложения при плохом интернет-соединении
➖ Анализ потребления батареи в фоне
➖ Тестирование на "ломанных" прошивках (для Android)

✔️ Технический аудит

➖ Проверка крэш-репортов (Firebase/Sentry)
➖ Оптимизация размера APK/IPA (<100MB для Google Play, <200MB для App Store)
➖ Проверка скорости загрузки контента (Lottie-анимации, тяжелые изображения)
➖ Тестирование deep links и универсальных ссылок

✔️ UI/UX валидация

➖ Соответствие гайдлайнам Material Design/Human Interface
➖ Проверка адаптивности на экранах от 4.7" до 7.9"
➖ Тестирование темной/светлой темы
➖ Валидация тач-зоны всех интерактивных элементов

✔️ Процесс публикации

➖ Подготовка release notes на 3+ языках
➖ Проверка возрастного рейтинга и контент-фильтров
➖ Включение всех необходимых разрешений в манифест
➖ План отката на предыдущую версию

Какие важные пункты мы забыли? Пишите в комментариях 💬

#буст
  • 👍 12
  • 🔥 12
  • ❤ 10
Post #51 789
🎁 pod install --repo-update – надежный способ избежать "кэш-проблем" с CocoaPods

Эта команда гарантирует, что перед установкой:

• Локальный репозиторий CocoaPods синхронизируется с удаленным
• Вы получаете актуальные версии всех зависимостей
• Исключаются проблемы с устаревшим кэшем

⚠️ Важно знать:

Для экономии времени в CI можно использовать pod install --repo-update --verbose (лог поможет отладить проблемы)

Альтернатива для "чистого" старта:

rm -rf ~/.cocoapods/repos && pod setup


Лайфхак: Добавьте в ваш Fastfile:

lane :setup_pods do
sh "pod install --repo-update"
end


А вы часто сталкиваетесь с проблемами CocoaPods? Делитесь в комментариях своими способами решения 💬

#буст
  • 🔥 11
  • 👍 10
  • ❤ 9
Post #49 1.56K
🔗 Реализуем deep links в мобильных приложениях

Пользователи ожидают:

• Плавных переходов из писем/сообщений в приложение
• Сохранения контекста при открытии ссылок
• Рабочих ссылок даже когда приложение не установлено

Базовые концепции:

• Deep Links - открывают конкретный экран в приложении
• Deferred Deep Links - работают даже без установленного приложения
• App Links (Android) / Universal Links (iOS) - веб-ссылки, открывающие приложение

Реализация на Android

1. Добавьте intent-filter в манифест:

<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="https" android:host="yourdomain.com"/>
</intent-filter>


2. Обработка ссылки в Activity:

override fun onCreate(savedInstanceState: Bundle?) {
if (intent?.action == Intent.ACTION_VIEW) {
val data = intent.data
// Анализ URL и навигация
}
}


Реализация на iOS

1. Настройка Associated Domains:

<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:yourdomain.com</string>
</array>


2. Обработка в AppDelegate:

func application(_ application: UIApplication, 
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return false
}
// Обработка URL
return true
}


Продвинутые сценарии

1. Аналитика переходов:

• Добавьте UTM-метки к ссылкам
• Отслеживайте источник установки

2. Совместная работа с бэкендом:

{
"url": "https://app.com/product/123",
"ios_store_id": "123456789",
"android_package": "com.yourapp"
}


3. Тестирование:

# Android
adb shell am start -W -a android.intent.action.VIEW -d "https://yourdomain.com/product/123"

# iOS
xcrun simctl openurl booted "https://yourdomain.com/product/123"



Лучшие практики:

• Используйте Firebase Dynamic Links для кроссплатформенного решения
• Поддерживайте веб-версии всех deep link-страниц
• Документируйте все схемы URL для команды

Какие библиотеки для deep links вы используете? Делитесь опытом в комментариях 💬

#буст
  • 🔥 9
  • ❤ 5
  • 👍 4
  • 🤯 1
Post #48 1.64K
Как мы использовали Codex, чтобы запустить приложение Sora под Android за 28 дней четырьмя инженерами

Это статья из официального блога OpenAI, но подход меня так зацепил, что решил перевести для всех. Я тоже часто переношу веб-приложения на мобилки примерно таким же способом и было очень здорово увидеть такой же подход (архитектура+рабочее_приложение-как-пример) у по сути создателей сильного AI.

Читать статью
Teletype Как мы использовали Codex, чтобы запустить приложение Sora под Android за 28 дней четырьмя инженерами Это статья из официального блога OpenAI, но подход меня так зацепил, что решил перевести для всех. Я тоже часто переношу веб-приложения...
  • 🔥 8
  • ❤ 5
  • 👍 4
Post #47 2.18K
👩‍💻 Inure — необычный файловый менеджер для Android с открытым исходным кодом. Этот проект выделяется полностью кастомным интерфейсом, поддержкой Material You и встроенным терминалом.

Приложение разрабатывается одним человеком, но уже попало в подборки лучших open-source решений для Android. Оно работает как на рутированных устройствах, так и через Shizuku, предлагая продвинутый анализ установленных приложений.

🖥 GitHub

@android_dev_ru
  • ❤ 5
  • 👍 5
  • 🔥 3
Post #46 1.96K
🖥 Currencies — приложение для Android, которое предоставляет простой и удобный конвертер валют. Программа поддерживает несколько провайдеров обменных курсов, таких как Европейский Центральный Банк, OpenExchangeRates и другие, а также предлагает функции калькулятора и исторические курсы

🌟 Приложение написано на Kotlin с использованием Material Design и поддерживает светлую и тёмную темы интерфейса

🖥 GitHub

@android_dev_ru
  • ❤ 3
  • 🔥 3
  • 👍 2
Post #42 2.15K
👩‍💻 Android Lab - это комплексная платформа для разработки и оценки агентов Android.

Интегрируя контролируемую среду и стандартизированные тесты, а также используя набор данных Android Instruct, инструмент повышает производительность мл-моделей и агентов с открытым исходным кодом.

Внутри два режима выполнения: AVD на Mac (arm64) и Docker на Linux (x86_64). Вы можете свободно добавлять или изменять новые задачи или образы для Android приложений в соответствии с нашей платформой. Android Lab содержит полную систему оценки, которая может быть использована для оценки производительности различных агентов Android.

Тест AndroidLab включает в себя готовые виртуальные устройства Android и 138 задач в девяти приложениях, созданных на этих устройствах.

🖥 Github

@android_dev_ru
  • ❤ 3
  • 👍 2
  • 🔥 2
Post #41 2.41K
👩‍💻 Gallery — реализация приложения "Галерея" на языке Kotlin для Android. Основная цель проекта — предоставить пользователю возможность просматривать, управлять и упорядочивать свои изображения и видео на устройстве.

🔍 Основные особенности репозитория:

🌟 Просмотр медиафайлов — отображение изображений и видео, хранящихся на устройстве

🌟 Упорядочивание — поддержка сортировки и фильтрации контента.
Минималистичный интерфейс — простая и удобная навигация

🌟 Основы на стандартных API Android — использование стандартных библиотек для работы с медиафайлами и UI


💡 Этот проект может быть полезен для разработчиков, интересующихся созданием приложений для управления мультимедийными данными на Android

🖥 Github

@android_dev_ru
  • 👍 6
  • 🔥 3
Post #40 2.23K
👩‍💻 Android Quick Guides — это недавно вышедшая серия официальных кратких руководств от Google, созданных для разработчиков, работающих с платформой Android. Эти руководства нацелены на предоставление основных рекомендаций и шаблонов для быстрого внедрения стандартных компонентов и функциональности Android-приложений

🔗 Ссылка: *клик*

@android_dev_ru
  • 👍 9
  • 🔥 4
  • 🆒 4
  • ❤ 1
Post #39 2.71K
Топ плагинов для Android Studio

1. Kotlin Fill Class — фантастический плагин, который делает разработку намного более приятной и быстрой. С его помощью вы можете заполнять классы и функции на лету.

2. ADB Idea — это дополнение к ADB, которое вы можете запустить с помощью всплывающего окна.

3. Key Promotex X — поможет вам освоить основные сочетания клавиш во время работы. Когда вы нажимаете мышью на кнопку в среде IDE, Key Promoter X показывает сочетание клавиш, которое вы должны были использовать вместо этого.

4. IdeaVim — это Vim в Android Studio. Вы можете настроить его по своему вкусу с помощью файла .ideavimrc в вашем домашнем каталоге, как если бы вы использовали .vimrc.

@android_dev_ru #android
  • 👍 11
  • 🔥 1
Post #38 2.29K
🖥 Duress

Приложение с открытым исходным кодом Duress, наспинное на Kotlin, помогает следить за безопасностью вашего устройства.

Оно позволяет установить специальный пароль принуждения, который можно использовать при угрозе безопасности. Если кто-то попытается заставить вас разблокировать телефон, просто введите этот пароль.

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

🖥 Github: https://github.com/x13a/Duress
👩‍💻F-droid: https://f-droid.org/en/packages/me.lucky.duress/

@android_dev_ru #android
  • 👍 7
  • 🔥 3
Post #37 2.19K
Как получить ссылку на фрагмент из активити?

Отвечая на этот вопрос, не рассказывайте, пока не спросят, об использовании в активити объекта List<MyFragment>, в который вы добавляете фрагменты при вызове onAttach() и удаляете в onDetach(). Интервьюер хочет услышать знаете ли вы стандартные методы API.

Системное API предоставляет два метода для поиска и получения фрагмента внутри активити: findFragmentByTag() и findFragmentById().

findFragmentByTag() принимает параметром тег, который передается в методе add() или replace() или в XML в элементе <fragment>. Возвращает null, если фрагмент не найден.

findFragmentById() принимает параметром id фрагмента. Если фрагмент добавляется методом add() или replace(), то id фрагмента – это id контейнера, который передается первым параметром. В случае добавления фрагмента через XML, id задается в элементе <fragment>. findFragmentById() возвращает null, если фрагмент не найден.


#android @android_dev_ru
  • 👍 7
  • 🔥 2
Older posts →

About this channel

How can I read @android_dev_ru without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Android Developer: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Android Developer have?
Android Developer (@android_dev_ru) has 1.27K subscribers on Telegram, refreshed roughly every 30 minutes.
Does Android Developer know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →