为什么 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 传递数据时的大小限制

相关推荐
迷路国王6 小时前
基于 kotlin版本的 Android的MVI架构
android·架构·kotlin
打工人9967 小时前
android studio 中止了一个已建立的连接
android·ide·android studio
一个假的前端男9 小时前
express(node ORM) 使用 Winston 记录日志 及数据库保存日志
android·数据库·express
运维_攻城狮11 小时前
遇到liunx服务器IO负载,读IO流量峰值347MB/s,排查并解决。
android·运维·服务器·mysql
m0_7482323912 小时前
qwenvl 以及qwenvl 2 模型架构理解
android·前端·后端
web1368856587112 小时前
PHP For 循环
android·java·php
Neo Evolution12 小时前
每天一个Flutter开发小项目 (6) : 表单与验证的专业实践 - 构建预约应用
android·开发语言·前端·javascript·flutter
小墙程序员13 小时前
Android Framework 面试系列(四)Activity 启动原理
android
和道一文字yyds13 小时前
MySQL 中如何解决深度分页的问题?什么是 MySQL 的主从同步机制?它是如何实现的?如何处理 MySQL 的主从同步延迟?
android·数据库·mysql
KdanMin13 小时前
Android SystemUI深度定制实战:下拉状态栏集成响铃功能开关全解析
android