sendBroadcaststartActivity时,我们会用到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 传递数据大小限制相关推荐

  1. Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  2. android中intent放数据类型,Android Intent传递数据底层分析详细介绍

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...

  3. android intent传递数据

    说到intent传递数据,其实我是经常用到,不过之前用的都是简单的传递String,int,boolean的简单数据.昨天,我需要传递一个自定义的实体类时,发现自己不会,所以在网上搜索了一些资料,自己 ...

  4. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  5. Android之Intent传递数据

    1.Android中的Intent对象中包含了多个putXXX()方法(如putExtra()方法)用来插入不同类型的额外数据,也包含了多个getXXX()方法(如getStringExtra().g ...

  6. Android学习之利用Intent传递数据

    你能通过这篇文章学习到什么? 1. 利用intent在两个activity之间传递数据 2. 利用intent在两个activity之间传递数据包 3. 利用intent获取到返回数据 很多人在刚开始 ...

  7. Intent传递数据时,可以传递哪些类型数据

    Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选) A.Serializable  B.charsequence C.Parcelable  D.Bundle 除了上面的还能传递 ...

  8. Intent传递数据的方法

    Intent传递数据的方法 一.传递的数据是基本类型的 二.传递的数据是对象 使用intent的putExtra()方法,可以将要传递的数据附加到Intent对象,然后使用Intent对象进行数据传递 ...

  9. Android 开发中使用Intent传递数据的方法

    Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.short ...

  10. 【Android】Intent传递数据量过大的问题android.os.TransactionTooLargeException

    在做相册多选时,相册选择界面跳转预览界面时需要通过Intent将所有照片的数据传递给PreviewActivity(预览界面),而当数据量大的时候程序会崩溃,错误信息是android.os.Trans ...

最新文章

  1. 数据库事务的四大特征
  2. 使用脚本在Linux服务器上自动安装Kubernetes的包管理器Helm
  3. 【原创】SharePoint中如何判断任务是否已经延期
  4. Cache related website
  5. 创建django项目,8月版本
  6. zynq processing system 参数设置_【正点原子FPGA连载】第六章自定义IP核-呼吸灯实验-领航者 ZYNQ 之嵌入式开发指南...
  7. 算法——Java实现栈
  8. 杨柳青镇cad_CAD制图岗位职责|CAD制图工作内容 - 职业圈
  9. 【STM32F407开发板用户手册】第2章 STM32F407的开发环境搭建
  10. 如何在phpstudy设置多站点和二级域名
  11. C语言学习笔记-各项为正整数的一元二次方程的十字交叉法因式分解
  12. 03Blender基本修改器,渲染基础知识
  13. html5弹性盒做成骰子,弹性盒制作骰子
  14. 伟大的程序员同志们累了看看我这笑话,巨搞笑!
  15. 2012年10月【美国】自驾游
  16. 电商项目day16(购物车实现)
  17. PCIe物理层详细总结-PCIe专题知识(一)
  18. openstack restful api 使用
  19. 太子阿特士和公主哈娅·图芙丝之梦的故事(一)
  20. 图像处理计算机考试,计算机图形图像处理试题(A)(含答案).doc

热门文章

  1. 北京服务器托管的必要性浅析
  2. CAJ阅读器相关问题
  3. 知道Ping的最后一个返回值TTL是什么意思吗?
  4. 空间两直线间最短距离计算公式
  5. 空间中异面直线距离的计算
  6. 20220601超简单百度地图街景图片爬取+绿视率计算
  7. prolog与python_讲解:SENG201、Software、Python,Java/c++Web|Prolog
  8. 从“不认识”到“认识” 贫困户周风莲的笑声多了
  9. python转义是什么意思_什么是python转义字符?看看人士如何理解它.
  10. Matplotlib系列(五):三维绘图