Какие типы существуют в Android и как их применять
Типы в Android — это набор правил и форматов (примитивы, ссылочные объекты, Parcelable/Serializable, MIME-типы, component types, ресурсы и асинхронные типы), которые определяют, как данные хранятся, передаются и обрабатываются в приложении. Ниже — кратко и с практическими советами.
Основные категории типов и их роль
- Примитивные (int, long, float, boolean): быстрые, без аллокаций — используйте для счетчиков, анимаций, частых вычислений.
- Ссылочные (String, List, View, Bitmap): хранят сложные структуры — списки для RecyclerView, изображения для ImageView. В Kotlin избегайте лишнего боксинга; по возможности используйте inline-классы.
- Parcelable vs Serializable:
- Parcelable — нативная сериализация Android, быстрее и компактнее; применяйте для передачи объектов через Intent или Binder.
- Serializable — проще, но медленнее и с большим риском OOM на слабых устройствах.
- MIME-типы (image/jpeg, application/pdf): задают формат контента для Intent-фильтров и ContentProvider; обязательны при шаринге и открытии файлов.
- Компоненты (Activity, Service, BroadcastReceiver, ContentProvider): каждый имеет собственный lifecycle и "тип" Intent/URI для маршрутизации данных.
- Ресурсы и layout-типы: drawable, color, string-array, layout (ConstraintLayout, LinearLayout) — используются через R и data binding/Compose.
- Асинхронные типы (suspend, Flow
, StateFlow): современный способ работы с потоками данных и UI-обновлениями (collectAsState в Compose, Flow в Room).
Для передачи объектов между Activity в Kotlin используйте @Parcelize — код сокращается и избегаются ошибки ручной реализации.
Где и как применять — конкретные сценарии
- Передача данных между экранами: intent.putExtra("data", myParcelableObject) — реализуйте Parcelable через @Parcelize.
- IPC и сервисы: использовать AIDL/Parcelable для передачи сложных объектов между процессами.
- Открытие/шаринг файлов: intent.setType("image/*").setAction(Intent.ACTION_SEND) и манифестные intent-filter с mimeType.
- Работа с БД и UI: возвращайте Flow
из DAO, в UI используйте collectAsState/collect для реактивного обновления. - Ресурсы: группируйте повторяющиеся строки в string-array, используйте vector drawable для масштабируемости.
Сравнение Parcelable и Serializable
Сравнение для выбора при передаче объектов
| Тип | Скорость | Размер | Рекомендация |
|---|---|---|---|
| Parcelable | Высокая (без рефлексии) | Компактный | Для Intent/Binder, @Parcelize в Kotlin |
| Serializable | Низкая (рефлексия) | Больше | Только для простых, редко передаваемых объектов |
Не передавайте большие bitmap/массивы через Intent — лучше использовать файл/URI (SAF) или SharedViewModel.
Частые ошибки
- Использование Serializable вместо Parcelable в performance-критичных местах.
- Передача больших объектов через Intent и получение OOM.
- Приведение raw-типов (Object) и unchecked-cast — приводит к ClassCastException.
- Отсутствие exported в манифесте для публичных компонентов на Android 12+.
FAQ
- Нужно ли всегда писать Parcelable вручную?
- Нет. В Kotlin используйте @Parcelize, если класс прост и не требует кастомной логики.
- Когда использовать MIME в intent-filter?
- Когда приложение должно открывать/обрабатывать файлы или внешние ссылки по их формату.
- Чем Flow лучше RxJava для Android?
- Меньше boilerplate, лучше интеграция с Kotlin Coroutines и lifecycle-aware API.
Вкратце: начните с четкого разделения примитивных и ссылочных данных, используйте Parcelable/@Parcelize для передачи, MIME для работы с файлами, а Flow/StateFlow — для асинхронной логики. Это сразу улучшит производительность и стабильность приложения.