Объекты Parcelable и Bundle предназначены для использования в разных процессах, например в транзакциях IPC/Binder, между действиями с намерениями, а также для хранения временного состояния при изменении конфигурации. На этой странице приведены рекомендации и советы по использованию объектов Parcelable и Bundle.
Примечание. Parcel не является универсальным механизмом сериализации общего назначения. Никогда не сохраняйте данные Parcel на диске и не отправляйте их по сети.
Отправка данных между действиями
Когда приложение создает объект Intent для использования в startActivity() при запуске нового Activity, оно может передавать параметры с помощью метода putExtra().
В приведенном ниже фрагменте кода показано, как выполнить эту операцию.
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
ОС упаковывает базовый объект Bundle намерения. Затем ОС создает новое действие, распаковывает данные и передает намерение новому действию.
Рекомендуем использовать класс Bundle, чтобы задавать примитивы, известные ОС, для объектов Intent. Класс Bundle оптимизирован для маршалинга и демаршалинга с помощью пакетов.
In some cases, you may need to pass complex objects across activities or preserve them in UI state.
В таких случаях пользовательский класс должен реализовывать Parcelable. Для современных приложений на Kotlin и Jetpack Compose рекомендуется использовать аннотацию @Parcelize. Это автоматически генерирует логику сериализации, необходимую для безопасной обработки ваших данных при использовании пакетов. Аналогичным образом обрабатываются ваши данные при использовании rememberSaveable.
Подробнее о том, как использовать @Parcelize, рассказывается в статье Генератор реализации Parcelable.
При отправке данных через намерение следите за тем, чтобы их размер не превышал нескольких килобайт.
Если данных слишком много, система может выдать исключение TransactionTooLargeException.
Передача данных между процессами
Передача данных между процессами похожа на передачу данных между действиями. Однако при отправке между процессами мы рекомендуем не использовать пользовательские сериализуемые объекты. Если вы отправляете пользовательский объект Parcelable из одного приложения в другое, вам нужно убедиться, что в обоих приложениях используется одна и та же версия пользовательского класса. Обычно это общая библиотека, используемая в обоих приложениях. Если приложение попытается отправить системе собственный объект Parcelable, может возникнуть ошибка, поскольку система не может демаршалировать неизвестный ей класс.
Например, приложение может установить будильник с помощью класса AlarmManager и использовать специальный Parcelable в намерении будильника. Когда срабатывает будильник, система изменяет Bundle дополнительных параметров намерения, чтобы добавить количество повторов. В результате система может удалить из дополнительных данных пользовательский параметр Parcelable. Это, в свою очередь, может привести к сбою приложения при получении измененного намерения будильника, поскольку приложение ожидает получить дополнительные данные, которых больше нет.
Буфер транзакций Binder имеет ограниченный фиксированный размер (в настоящее время 1 МБ), который используется всеми транзакциями, выполняемыми в рамках процесса. Поскольку это ограничение действует на уровне процесса, а не действия, в число транзакций входят все транзакции Binder в приложении, например startActivity, rememberSaveable (в котором используется onSaveInstanceState) и любое взаимодействие с системой. Если размер превышен, выдается ошибка TransactionTooLargeException.
В частности, при сохранении состояния с помощью rememberSaveable объем данных должен быть небольшим, поскольку системному процессу необходимо хранить предоставленные данные до тех пор, пока пользователь может вернуться к этому действию (даже если процесс действия завершен).
Рекомендуем сохранять не более 50 КБ данных.
Примечание. В Android 7.0 (уровень API 24) и более поздних версиях система выдает TransactionTooLargeException как исключение во время выполнения.
В более ранних версиях Android система показывает только предупреждение в logcat.