为什么 Intent 不能传递大数据

Intent 传递不同大小数据时的问题:

  • 传 512k 以下的数据是可以正常传递的;
  • 传 512k~1024k 的数据会出错,闪退;
  • 传 1024k 以上的数据会报错:TransactionTooLargeException;
  • 考虑到 Intent 还包括要启动的 Activity 等信息,实际可以传的数据略小于 512k;

Intent 携带信息的大小受 Binder 限制。数据以 Parcel 对象的形式存放在 Binder 传递缓存中。Binder 传递缓存有个限定的大小,通常是 1Mb。但同一个进程中所有的传输共享缓存空间,多个地方在进行传输时,即使它们各自传说的数据不超过大小显示。TrasnsactionTooLargeException 异常也可能会被抛出。因此,在使用 Intent 传递数据时,1Mb 并不是安全上限。因为 Binder 中可能正在处理其他的传输工作。不同的机型和系统版本,这个上限值也可能会不同。

普通的由 Zygote 进程 fork 出的进程,所映射的 Binder 内存大小是不到 1M 的。准确的说是:

c++ 复制代码
// /frameworks/native/libs/binder/ProcessState.cpp
#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)

如果传输的数据超过了这个大小,系统就会报错,因为 Binder 本身就是为了进程间频繁而灵活的通信所设计的,而不是为了拷贝大数据而使用的。

这个 TransactionTooLargeException 中也提到了这个:

java 复制代码
/*
 * The Binder transaction failed because it was too large.
 * 
 * The Binder transaction buffer has a limited fixed size, currently 1MB, which
 * is shared by all transactions in progress for the process.  Consequently this
 * exception can be thrown when there are many transactions in progress even when
 * most of the individual transactions are of moderate size.
 *
 */

Intent 携带的数据会经过 Binder 内核传递到目标中去,因为 Binder 映射内存的限制,所以 Intent 也受限制。

参考

Android 使用 intent 传递数据时的大小限制

相关推荐
阿巴斯甜21 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker21 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android