Какие могут быть причины краша при передаче данных без ухода в минус
Что проверяют
Знаете ли вы, что приложение падает не только из-за кривых значений: сама передача данных между компонентами Android имеет ограничения и ломается по своим причинам. Следом обычно спрашивают, как такой краш воспроизвести и как передавать большие объёмы.
Как отвечать
Причины по механизму:
TransactionTooLargeException:IntentиBundleидут через Binder, у которого буфер транзакций около 1 МБ на процесс, общий для всех одновременных вызовов. Крупный список илиBitmapв extras, раздутыйonSaveInstanceStateдают краш. ВBundleбезопасно держать десятки килобайт, а большие данные передают идентификатором и берут из базы или файла;- ошибки
Parcelable: в ручной реализации не совпал порядок записи и чтения, R8 вырезал или переименовал класс, и при распаковке падаетBadParcelableExceptionилиClassNotFoundException. Надёжнее@Parcelize; Serializableс несериализуемым полем: в момент записи получаетеRuntimeExceptionсNotSerializableExceptionвнутри;- смерть процесса: система убила приложение в фоне, экран восстановился из
Bundle, а данные, переданные через синглтон или статическое поле, пропали. ИтогNullPointerExceptionили неинициализированныйlateinit; - потоки: результат пришёл в фоновом потоке и трогает View (
CalledFromWrongThreadException) или вызываетLiveData.setValueне с главного потока; - передача в другое приложение:
file://URI даётFileUriExposedException, нуженFileProviderиFLAG_GRANT_READ_URI_PERMISSION.PendingIntentбезFLAG_IMMUTABLEилиFLAG_MUTABLEприtargetSdk31 и выше падает сIllegalArgumentException.
Extras читайте через IntentCompat и BundleCompat: типобезопасный getParcelableExtra(key, Class) на Android 13 содержал ошибку.
Где спотыкаются
Советуют обернуть всё в try/catch. Краш уходит, данные теряются молча, причина остаётся.
Не проверяют смерть процесса. Она воспроизводится опцией «Don’t keep activities» в настройках разработчика или командой adb shell am kill при свёрнутом приложении.
Передают большие объекты через общий ViewModel или синглтон. Без персистентного хранилища это та же смерть процесса.