← Назад к вопросам

Что можно передать в Bundle

1.6 Junior🔥 201 комментариев
#Android компоненты#Работа с данными

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что можно передать в Bundle?

Bundle в Android — это коллекция пар "ключ-значение", предназначенная для передачи данных между компонентами (Activity, Fragment, Service и т.д.), сохранения состояния и других задач. Понимание его ограничений и возможностей критически важно для разработчика.

Типы данных, которые можно поместить в Bundle

Базовое правило: Bundle предназначен для сериализуемых или примитивных данных. Технически, под капотом используется Parcelable механизм Android для эффективной сериализации. Вот основной список:

  1. Примитивные типы и их обёртки: boolean, byte, char, short, int, long, float, double.
  2. Строки и CharSequence: String, SpannableStringBuilder.
  3. Массивы поддерживаемых типов: int[], long[], double[], float[], boolean[], byte[], String[], CharSequence[]. Важно: массивы должны содержать примитивы или поддерживаемые объекты.
  4. Списки (List) и массивы списков (ArrayList): ArrayList<Integer>, ArrayList<String>, ArrayList<CharSequence>. Ключевое ограничение: элементы списка должны быть типами, поддерживаемыми Bundle (см. пункты 1-3). Нельзя передать ArrayList<CustomObject> без дополнительных действий.
  5. Классы, реализующие интерфейсы Parcelable или Serializable.
    *   **`Parcelable`** — предпочтительный и высокопроизводительный способ Android. Требует ручной реализации методов `writeToParcel()` и `describeContents()`.
    *   **`Serializable`** — стандартный Java-интерфейс. Проще в реализации (просто implements), но создаёт много временных объектов и медленнее.

Типы данных, которые НЕЛЬЗЯ передать напрямую

  • Произвольные объекты, не реализующие Parcelable/Serializable.
  • Потоки данных или открытые файловые дескрипторы (для этого есть отдельный механизм, например, ParcelFileDescriptor).
  • Системные ресурсы (Drawable, View и т.д.). Вместо этого передавайте их идентификаторы (например, R.drawable.icon).
  • Анонимные и нестатические внутренние классы (у них есть неявная ссылка на внешний класс, что затрудняет сериализацию).

Практические примеры использования

// Создание Bundle и добавление данных
val bundle = Bundle().apply {
    // Примитивы и строки
    putString("USER_NAME", "Алексей")
    putInt("USER_AGE", 28)
    putBoolean("IS_PREMIUM", true)

    // Массив
    putIntArray("SCORES_ARRAY", intArrayOf(95, 87, 92))

    // ArrayList строк (поддерживается)
    putStringArrayList("TAGS_LIST", arrayListOf("android", "kotlin", "development"))

    // Пользовательский Parcelable объект
    val user = UserParcelable(id = 1, name = "Мария")
    putParcelable("USER_OBJECT", user)

    // Serializable объект (менее эффективно)
    val settings = UserSettingsSerializable(theme = "dark")
    putSerializable("USER_SETTINGS", settings)
}

// Извлечение данных из Bundle (в Activity/Fragment)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val userName = savedInstanceState?.getString("USER_NAME")
    val userAge = savedInstanceState?.getInt("USER_AGE", 0) // 0 - значение по умолчанию
    val scores = savedInstanceState?.getIntArray("SCORES_ARRAY")
    val user = savedInstanceState?.getParcelable<UserParcelable>("USER_OBJECT")
}
// Пример простого Parcelable класса (используя аннотацию @Parcelize)
import kotlinx.parcelize.Parcelize

@Parcelize
data class UserParcelable(val id: Long, val name: String, val email: String) : Parcelable

Важные нюансы и лучшие практики

  • Размер ограничен: Транзакция Binder, через которую передается Bundle, имеет ограничение в 1 МБ (на большинстве версий ОС). Для передачи больших данных (например, битмапов) используйте другие методы: сохранение в файл/БД и передачу URI, Intent.FLAG_GRANT_READ_URI_PERMISSION.
  • Ключи: Используйте константы для ключей, чтобы избежать опечаток. Хорошей практикой является префикс, указывающий на источник (например, EXTRA_ для Intent).
  • Восстановление состояния: Bundle является основным способом сохранения и восстановления состояния Activity/Fragment (onSaveInstanceState()). Помещайте туда минимально необходимые данные для восстановления UI (идентификаторы, текст полей ввода).
  • Производительность: Отдавайте предпочтение Parcelable перед Serializable для пользовательских объектов. Используйте @Parcelize (требует зависимости kotlin-parcelize), чтобы избежать ручного написания boilerplate-кода.

Итог: В Bundle можно передавать примитивы, строки, их массивы и списки, а также любые объекты, сделанные сериализуемыми через Parcelable или Serializable. Главное — помнить об ограничении по размеру и выбирать правильный механизм сериализации для сложных данных.

Что можно передать в Bundle | PrepBro