前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android Intent 传递数据大小限制

Android Intent 传递数据大小限制

作者头像
AnRFDev
发布于 2021-02-01 07:14:54
发布于 2021-02-01 07:14:54
1.8K00
代码可运行
举报
文章被收录于专栏:AnRFDevAnRFDev
运行总次数:0
代码可运行

sendBroadcaststartActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。

Intent传递数据时,如果数据太大,可能会出现异常。比如App闪退,或是Intent发送不成功,logcat报错等等。

这就牵涉到一个问题:Intent 传递数据大小限制。

Intent到底能够携带多少数据呢?

使用Intent传送数据时,可能会出现异常

在Intent中传入一个Parcelable对象;例如传入一个bitmap对象。

代码参考: https://github.com/AnRFDev/android-Basic4

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Bitmap b1 = Bitmap.createScaledBitmap(srcBmp, dstWid, dstHeight, false);
Intent intent = new Intent(MSG_INTENT);
intent.putExtra(K_PIC, b1);

选择bitmap的原因是,Bitmap实现了Parcelable接口,并且可以通过getByteCount()得知所占内存大小。

sendBroadcast时,报出如下信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.TransactionTooLargeException
           at 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package android.os;
public class TransactionTooLargeException extends RemoteException {
    public TransactionTooLargeException() {
        super();
    }

    public TransactionTooLargeException(String msg) {
        super(msg);
    }
}

从报错信息FAILED BINDER TRANSACTION可以看出,binder传送数据失败了。

追踪到Binder,它的transactNative方法报出RemoteException

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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之类的方法。

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。
LoveWFan
2018/08/07
6850
Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
[011]一个看似是系统问题的应用问题的解决过程
今天遇到一个问题,应用工程师分析是系统层的问题,然后就把这个锅给了我。最后我又把锅甩回给了应用工程师。
王小二
2020/06/08
6.6K1
[011]一个看似是系统问题的应用问题的解决过程
Android Binder 机制——AIDL 的使用和原理分析
为了便于理解,这里用一个 Demo 来展示 AIDL 的实现过程:Activity 作为 Client 与作为 Server 端的远程 Service 实现数据交互,在绑定远程 Service 之后,点击 AddUser 后 Service 会将 Client 端传进来的 User 对象加入列表中,点击 GetSize 后远程 Service 将会把列表的长度返回给客户端。建议在继续阅读之前先查看或者运行一下项目源码:
没关系再继续努力
2021/12/01
7710
android基础部分再学习--AIDL
AIDL与其他IDL语言类似,你需要做一些工作。 它允许你定义客户端与服务端达成一致的程序接口使用进程间通信相互交流。 在ANdroid上面,一个进程不能正常的访问另一个进程的内存。 所以说,他们需要分解他们的对象为操作系统可以理解的基本单位,然后为你把这些对象按次序跨越进程边界 书写这些代码是单调冗长的,所以android使用AIDL为你处理这个问题。
wust小吴
2022/03/07
5830
借助 AIDL 理解 Android Binder 机制——AIDL 的使用和原理分析
在上一篇文章——借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉[1]中我们已经分析了使用 Binder 机制的原因以及分析了 Binder 机制,本章我们将继续从 AIDL 的使用过程体验 Binder 在应用层的使用和原理。
程序亦非猿
2020/04/15
1K0
借助 AIDL 理解 Android Binder 机制——AIDL 的使用和原理分析
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时确实存在大小限制,大约是 1MB。这主要是因为 Intent 的设计初衷和 Android 系统架构的限制。以下是详细的原因解释:
AntDream
2024/10/18
4690
Android经典面试题之Intent传递数据大小为什么限制是1M?
[012]如何解决Binder泄漏问题
[011]一个看似是系统问题的应用问题的解决过程中我们解决了一个注册过多的BroadcastReceiver导致的某一次发送广播失败的问题。我这边遇到了一个类似的问题,但是我用了一个可能网络上从来没有提出过的方法,解决了这个问题,写下这个文章记录一下,如果三年前的我肯定想不出这种解决手段。
王小二
2020/06/08
3.5K0
听说你Binder机制学的不错,来面试下这几个问题(三)
很多文章将Binder框架定义了四个角色:Server,Client,ServiceManager、以及Binder驱动,但这容易将人引导到歧途:好像所有的Binder服务都需要去ServiceManager去注册才能使用,其实不是这样。例如,平时APP开发通过bindService启动的服务,以及有些自己定义的AIDL远程调用,都不一定都ServiceManager注册这条路,个人理解:ServiceManager主要功能是:管理系统服务,比如AMS、WMS、PKMS服务等,而APP通过的bindService启动的Binder服务其实是由SystemServer的ActivityManagerService负责管理。这篇主要关注Android APP Java层Binder通信一些奇葩点:
看书的小蜗牛
2018/06/29
2K0
听说你Binder机制学的不错,来面试下这几个问题(三)
彻底理解 Android Binder 通信架构
roid 6.0的源码剖析, 本文深度剖析Binder IPC过程, 这绝对是一篇匠心巨作,从Java framework到Native,再到Linux Kernel,带你全程看Binder通信过程.
哲洛不闹
2018/09/14
6.2K0
彻底理解 Android Binder 通信架构
Android进阶必备:跨进程通讯机制
Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从Linux相关的基础概念知识开始介绍,从基础概念知识中引出Binder机制,归纳Binder机制与Linux系统的跨进程机制的优缺点,接着分析Binder的通信模型和原理,而Binder机制最佳体现就是AIDL,所以在后面会分析AIDL的实现原理,最后简单的提下AMS的Binder体系,整篇文章中间会穿插有IBinder、Binder、Parcel的介绍,整篇文章阅读难度不大,不会涉及到framework层的Binder原理,AIDL部分需要有AIDL的使用基础
陈宇明
2020/12/15
7010
Android进阶必备:跨进程通讯机制
Android 反序列化漏洞攻防史话
Java 在历史上出现过许多反序列化的漏洞,但大部分出自 J2EE 的组件。即便是 FastJSON 这种漏洞,似乎也很少看到在 Android 中被实际的触发和利用。本文即为对历史上曾出现过的 Android Java 反序列化漏洞的分析和研究记录。
evilpan
2023/03/27
1.9K0
Android 反序列化漏洞攻防史话
[008]Cursor引发的一系列思考
在[007]一次Binder通信最大可以传输多大的数据?这个文章,我得到了一个结论,就是正常情况下一次Binder通信最大可以传输的数据的大小是1MB-8KB。突然想到我们在通过ContentResolver对象调用ContentProvider的调用query返回Cursor的时候,本质上这是一次Binder通信,那这个Cursor对象大小有没有限制呢?是不是也要小于1MB-8KB?
王小二
2020/06/08
1.3K0
架构·微服务架构·ANDROID 源码分析(二)
上一篇的文章架构·微服务架构详细描述微服务架构相关的理论基础,为这一篇文章打好了理论基础。这篇文章将站在 Android Framework 设计者的角度上,剖析在 Android 中应用的微服务架构。
幺鹿
2018/08/21
7110
架构·微服务架构·ANDROID 源码分析(二)
Android 最全 Intent 传递数据姿势
点击上面蓝色字体关注“IT大飞说” 置顶公众号(**ID:ITBigFly**)第一时间收到推送
程序员飞飞
2020/02/27
2.9K0
Android跨进程通信IPC之14——其他IPC方式
前面几篇文章,我们介绍了IPC的基础知识和Binder机制,本篇文章主要讲解各种跨进程的通信方式。
隔壁老李头
2018/08/30
1.8K0
Android跨进程通信IPC之14——其他IPC方式
Android Binder框架实现之bindService详解「建议收藏」
为了更加方便的读者阅读博客,通过导读思维图的形式将本博客的关键点列举出来,从而方便读者取舍和阅读!
全栈程序员站长
2022/09/30
1.3K0
Android Binder框架实现之bindService详解「建议收藏」
Android AIDL 传递对象(Parceable)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/78444374
程序员徐公
2018/09/17
8740
Android AIDL 传递对象(Parceable)
不得不说的Android Binder机制与AIDL
说起Android的进程间通信,想必大家都会不约而同的想起Android中的Binder机制。而提起Binder,想必也有不少同学会想起初学Android时被Binder和AIDL支配的恐惧感。但是作为一个Android开发者,Binder是我们必须掌握的知识。因为它是构架整个Android大厦的钢筋和混凝土,连接了Android各个系统服务和上层应用。只有了解了Binder机制才能更加深入的理解Android开发和Android Framework。这也是为什么无论是《Android开发艺术探索》还是《深入理解Android内核涉及思想》这些进阶类书籍把进程间通信和Binder机制放到靠前章节的原因,它太重要了,重要到整个Android Framework都离不开Binder的身影。
没关系再继续努力
2021/12/28
6220
Intent传递数据全解
可以以直接通过调用Intent的putExtra()方法存入数据,然后在获得Intent后调用getXxxExtra获得 对应类型的数据;传递多个的话,可以使用Bundle对象作为容器,通过调用Bundle的putXxx先将数据 存储到Bundle中,然后调用Intent的putExtras()方法将Bundle存入Intent中,然后获得Intent以后, 调用getExtras()获得Bundle容器,然后调用其getXXX获取对应的数据。
小小工匠
2021/08/16
1K0
Binder进程间通信详解
前言 隔行如隔山,这句话同样适用于任何时候,即时同一个专业,深入下去的话,差别也是巨大的。今天,讲下自己如何学习binder进程间通信的机制的一些见解。开始的时候,只知道 Binder 是个很底层的东西,甚至对于具体是什么用都不是很清楚。 主要是通过两种方式: 看别人写的Binder博文 目的很简单,大概了解Binder是个什么东西,有哪些核心的东西,对于看源码的时候选择性过滤有帮助,最好是看了后画下思维导图总结下或者可以画下流程图。 看Binder源码 对于切入点的话,从最熟悉的客户端入手;选择
用户1148881
2018/05/28
1.3K0
推荐阅读
相关推荐
Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验