Android Intent 传递数据大小限制
在sendBroadcast
,startActivity
时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。
Intent传递数据时,如果数据太大,可能会出现异常。比如App闪退,或是Intent发送不成功,logcat报错等等。
这就牵涉到一个问题:Intent 传递数据大小限制。
Intent到底能够携带多少数据呢?
使用Intent传送数据时,可能会出现异常
在Intent中传入一个Parcelable对象;例如传入一个bitmap对象。
代码参考: github.com/RustFisher/…
Bitmap b1 = Bitmap.createScaledBitmap(srcBmp, dstWid, dstHeight, false);Intent intent = new Intent(MSG_INTENT);intent.putExtra(K_PIC, b1);
复制代码
选择bitmap的原因是,Bitmap实现了Parcelable
接口,并且可以通过getByteCount()
得知所占内存大小。
sendBroadcast
时,报出如下信息
V/ActivityManager: Broadcast: Intent { act=intent_bi flg=0x10 (has extras) } ordered=false userid=0 callerApp=ProcessRecord{27aeaaf5 31217:com.rustfisher.basic4/u0a113}E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!W/BroadcastQueue: Failure sending broadcast Intent { act=intent_bi flg=0x10 (has extras) }android.os.TransactionTooLargeExceptionat android.os.BinderProxy.transactNative(Native Method)at android.os.BinderProxy.transact(Binder.java:504)at android.app.ApplicationThreadProxy.scheduleRegisteredReceiver(ApplicationThreadNative.java:1170)at com.android.server.am.BroadcastQueue.performReceiveLocked(BroadcastQueue.java:576)at com.android.server.am.BroadcastQueue.deliverToRegisteredReceiverLocked(BroadcastQueue.java:848)at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:917)at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:254)at android.os.Handler.dispatchMessage(Handler.java:111)at android.os.Looper.loop(Looper.java:194)at android.os.HandlerThread.run(HandlerThread.java:61)at com.android.server.ServiceThread.run(ServiceThread.java:46)
复制代码
查看异常类TransactionTooLargeException
,它继承了RemoteException
package android.os;
public class TransactionTooLargeException extends RemoteException {public TransactionTooLargeException() {super();}public TransactionTooLargeException(String msg) {super(msg);}
}
复制代码
追踪到Binder
,它的transactNative
方法会报出RemoteException
public native boolean transactNative(int code, Parcel data, Parcel reply,int flags) throws RemoteException;
复制代码
抛出异常与Binder有关。
Intent携带信息的大小受Binder限制
Intent携带信息的大小其实是受Binder限制。本文标题也可以改为“Binder传递数据大小限制”。
数据以Parcel
对象的形式存放在Binder传递缓存中。 如果数据或返回值比传递buffer大,则此次传递调用失败并抛出TransactionTooLargeException
异常。
Binder传递缓存有一个限定大小,通常是1Mb。但同一个进程中所有的传输共享缓存空间。
多个地方在进行传输时,即时它们各自传输的数据不超出大小限制,TransactionTooLargeException
异常也可能会被抛出。
在使用Intent传递数据时,1Mb并不是安全上限。因为Binder中可能正在处理其它的传输工作。 不同的机型和系统版本,这个上限值也可能会不同。
在其它地方,例如onSaveInstanceState(@NonNull Bundle outState)
,也可能会遇到与Binder有关的类似问题。
为什么Binder要限制传输数据的大小
个人推测,作为一种IPC的方式,Binder并不是为传输大量数据而设计。
传输大量数据,可以考虑URL之类的方法。
Android Intent 传递数据大小限制相关推荐
- Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家
Android Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...
- android中intent放数据类型,Android Intent传递数据底层分析详细介绍
Android Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...
- android intent传递数据
说到intent传递数据,其实我是经常用到,不过之前用的都是简单的传递String,int,boolean的简单数据.昨天,我需要传递一个自定义的实体类时,发现自己不会,所以在网上搜索了一些资料,自己 ...
- 【转】Android 之最新最全的Intent传递数据方法
原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...
- Android之Intent传递数据
1.Android中的Intent对象中包含了多个putXXX()方法(如putExtra()方法)用来插入不同类型的额外数据,也包含了多个getXXX()方法(如getStringExtra().g ...
- Android学习之利用Intent传递数据
你能通过这篇文章学习到什么? 1. 利用intent在两个activity之间传递数据 2. 利用intent在两个activity之间传递数据包 3. 利用intent获取到返回数据 很多人在刚开始 ...
- Intent传递数据时,可以传递哪些类型数据
Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选) A.Serializable B.charsequence C.Parcelable D.Bundle 除了上面的还能传递 ...
- Intent传递数据的方法
Intent传递数据的方法 一.传递的数据是基本类型的 二.传递的数据是对象 使用intent的putExtra()方法,可以将要传递的数据附加到Intent对象,然后使用Intent对象进行数据传递 ...
- Android 开发中使用Intent传递数据的方法
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...
- 【Android】Intent传递数据量过大的问题android.os.TransactionTooLargeException
在做相册多选时,相册选择界面跳转预览界面时需要通过Intent将所有照片的数据传递给PreviewActivity(预览界面),而当数据量大的时候程序会崩溃,错误信息是android.os.Trans ...
最新文章
- 数据库事务的四大特征
- 使用脚本在Linux服务器上自动安装Kubernetes的包管理器Helm
- 【原创】SharePoint中如何判断任务是否已经延期
- Cache related website
- 创建django项目,8月版本
- zynq processing system 参数设置_【正点原子FPGA连载】第六章自定义IP核-呼吸灯实验-领航者 ZYNQ 之嵌入式开发指南...
- 算法——Java实现栈
- 杨柳青镇cad_CAD制图岗位职责|CAD制图工作内容 - 职业圈
- 【STM32F407开发板用户手册】第2章 STM32F407的开发环境搭建
- 如何在phpstudy设置多站点和二级域名
- C语言学习笔记-各项为正整数的一元二次方程的十字交叉法因式分解
- 03Blender基本修改器,渲染基础知识
- html5弹性盒做成骰子,弹性盒制作骰子
- 伟大的程序员同志们累了看看我这笑话,巨搞笑!
- 2012年10月【美国】自驾游
- 电商项目day16(购物车实现)
- PCIe物理层详细总结-PCIe专题知识(一)
- openstack restful api 使用
- 太子阿特士和公主哈娅·图芙丝之梦的故事(一)
- 图像处理计算机考试,计算机图形图像处理试题(A)(含答案).doc
热门文章
- 北京服务器托管的必要性浅析
- CAJ阅读器相关问题
- 知道Ping的最后一个返回值TTL是什么意思吗?
- 空间两直线间最短距离计算公式
- 空间中异面直线距离的计算
- 20220601超简单百度地图街景图片爬取+绿视率计算
- prolog与python_讲解:SENG201、Software、Python,Java/c++Web|Prolog
- 从“不认识”到“认识” 贫困户周风莲的笑声多了
- python转义是什么意思_什么是python转义字符?看看人士如何理解它.
- Matplotlib系列(五):三维绘图