Какие типы существуют в 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 — для асинхронной логики. Это сразу улучшит производительность и стабильность приложения.