Какие ограничения накладывает Bundle на параметры в Android
Что проверяют
Понимаете ли вы, что Bundle это не обычная мапа, а контейнер, содержимое которого едет через Binder в другой процесс. Отсюда все ограничения. Следом спросят про TransactionTooLargeException и что передавать вместо тяжёлых объектов.
Как отвечать
Разложите ограничения по природе:
- типы: примитивы и их массивы,
StringиCharSequence,Parcelable,Serializable,ArrayListиз перечисленного, вложенныйBundleиIBinderчерезputBinder. Произвольный объект положить нельзя: либо реализуйтеParcelable(в Kotlin через@Parcelize), либоSerializable, который идёт через рефлексию и медленнее; - размер: лимит принадлежит не
Bundle, а буферу Binder-транзакции, это примерно 1 МБ на процесс, причём буфер общий для всех идущих транзакций. Безопасный практический размер измеряется десятками килобайт, а падение может прийти из-за чужой параллельной транзакции. Превышение этоTransactionTooLargeException, и с Android 7 система бросает его при сохранении состояния, а не молчит; - ленивое чтение: значения хранятся сериализованными и разворачиваются при чтении, поэтому
ClassNotFoundExceptionприлетает не там, где вы клали данные, а приgetParcelable, и в чужом процессе нуженsetClassLoader; - типобезопасность: с Android 13 (API 33) есть перегрузки
getParcelable(key, Class)иgetSerializable(key, Class), старые помечены устаревшими; - что вместо: передавайте идентификатор и грузите данные на месте. Состояние, переживающее поворот, держите в
ViewModel, переживающее смерть процесса вSavedStateHandle, крупное в базе или файле. В навигации помогает Safe Args с проверкой типов аргументов на этапе сборки.
Где спотыкаются
Кладут в аргументы фрагмента Bitmap, длинный список моделей или весь ответ API. Работает на эмуляторе и падает у пользователей с объёмными данными.
Ловят TransactionTooLargeException и не понимают причину: их собственный Bundle явно меньше мегабайта. Лимит общий на процесс, и виноват суммарный объём.
Путают ViewModel и savedInstanceState. Первая переживает поворот, но умирает вместе с процессом, второй переживает смерть процесса, но жёстко ограничен по размеру.