Android中Intent/Bundle的通信原理及大小限制(Parcelable原理及与Serializable的区别)

71 篇文章 7 订阅
订阅专栏
27 篇文章 36 订阅
订阅专栏

​我们知道可以通过Intent和bundle在activity或fragment间进行通信,那么这个通信是如何实现的。
通过intent的bundle的源码可以看到它们都是实现了Parcelable,其实就是通过序列化来实现通信的。


提到Parcelable就不得不提Serializable,这里引用一段网上的总结:

介绍Parcelable不得不先提一下Serializable接口,Serializable是Java为我们提供的一个标准化的序列化接口,那什么是序列化呢? —- 简单来说就是将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 ,那反序列化就是从二进制流(序列)转化为对象的过程.


Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用相对复杂一些,但Parcelable的效率相对Serializable也高很多,这一直是Google工程师引以为傲的,有时间的可以看一下Parcelable和Serializable的效率对比 Parcelable vs Serializable 号称快10倍的效率


Parcelable的底层使用了Parcel机制。传递实际上是使用了binder机制,binder机制会将Parcel序列化的数据写入到一个共享内存中,读取时也是binder从共享内存中读出字节流,然后Parcel反序列化后使用。这就是Intent或Bundle能够在activity或者跨进程通信的原理。(参考“探索startActivity流程及在Activity间是如何传递Intent的”)


关于Parcelable和Serializable的区别,同样引用一段网上的总结:

Parcelable和Serializable的区别和比较
Parcelable和Serializable都是实现序列化并且都可以用于Intent间传递数据,Serializable是Java的实现方式,可能会频繁的IO操作,所以消耗比较大,但是实现方式简单 Parcelable是Android提供的方式,效率比较高,但是实现起来复杂一些 , 二者的选取规则是:内存序列化上选择Parcelable, 存储到设备或者网络传输上选择Serializable(当然Parcelable也可以但是稍显复杂)



这样我们了解了Intent/Bundle的通信原理,但是使用时我们经常会遇到数据过大的问题,一般我们都知道intent不能传输大数据,这个限制是1MB,那么是什么或在哪里限制了呢?
当我们用Intent传输过大数据时,一般logcat会报出TransactionTooLargeException错误,谷歌官方对这个错误的描述如下:

The Binder transaction failed because it was too large.
During a remote procedure call, the arguments and the return value of the call are transferred as
Parcel objects stored in the Binder transaction buffer. If the arguments or the return value are too
large to fit in the transaction buffer, then the call will fail and TransactionTooLargeException
will be thrown.

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.

There are two possible outcomes when a remote procedure call throws TransactionTooLargeException.
Either the client was unable to send its request to the service (most likely if the arguments were
too large to fit in the transaction buffer), or the service was unable to send its response back to
the client (most likely if the return value was too large to fit in the transaction buffer). It is
not possible to tell which of these outcomes actually occurred. The client should assume that a
partial failure occurred.

The key to avoiding TransactionTooLargeException is to keep all transactions relatively small.
Try to minimize the amount of memory needed to create a Parcel for the arguments and the return
value of the remote procedure call. Avoid transferring huge arrays of strings or large bitmaps.
If possible, try to break up big requests into smaller pieces.

If you are implementing a service, it may help to impose size or complexity contraints on the
queries that clients can perform. For example, if the result set could become large, then don't
allow the client to request more than a few records at a time. Alternately, instead of returning
all of the available data all at once, return the essential information first and make the client
ask for additional information later as needed.


简单来说,我们上面提到了Parcel机制使用了一个共享内存,这个共享内存就叫Binder transaction buffer,这块内存有一个大小限制,目前是1MB,而且是共用的,当超过了这个大小就会报错。
也就是说不仅仅是一次性传递大数据会出问题,当同时传递很多数据,尽管每个都不超过1MB,但是总大小超过1MB也会出错。

AndroidIntent机制详解
世上只有一种英雄主义
11-23 5281
Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:启动 Activity:Activity 表示应用的一个屏幕。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。 如果
androidIntent传值与Bundle传值的区别详解
09-05
Android开发IntentBundle都是用来在组件之间传递数据的重要工具,但它们在使用场景和方式上有所不同。本文将详细解析Intent传值与Bundle传值的区别。 首先,IntentAndroid系统的一个核心概念,主要用于...
Android 进程间通信实现原理分析
u011470899的专栏
12-20 635
只有你允许客户端从不同的应用程序为了进程间的通信而去访问你的service,以及想在你的service处理多线程,下面为大家详细介绍下 Android Service是分为两种:   本地服务(Local Service): 同一个apk内被调用   远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成。 AIDL 是什
Intent如何图片传输限制(TransactionTooLargeException )
最新发布
彬_小彬的博客
07-28 295
通过Intent传递数据时,Android 平台对传输的数据大小有严格限制,通常限制在 1MB 左右。如果尝试传递过大的数据(例如大图片),可能会导致异常。因此,不建议直接通过Intent的 extras 传递大图片。
Android Bundle大小限制
qq_38386983的博客
04-24 3831
最近在项目碰到startActivity()方法调用崩溃的情况,仔细查看错误信息,发现提示 IntentBundle里的东西有5034408bytes,上网查了一下,Bundle大小限制为1M 自己测试后发现,不同的手机上这个问题的反应也不一样,在版本比较新的手机上会直接崩溃,在版本比较旧的手机上则表现为startActivity()这个方法无效。 解决这个问题可以用静态对象,跳转时提前将...
Android: Bundle机制
五山口老法师
05-31 582
BundleAndroid开发十分常见,常用于以下场合: 1.Activity状态数据的保存与恢复涉及到的两个回调:void onSaveInstanceState (Bundle outState)、void onCreate (Bundle savedInstanceState) 2.Fragment的setArguments方法:void setArguments (Bundle args) 3.消息机制的Message的setData方法:void setData (Bundle data)
Android开发------IPC机制之Bundle实现
自由
05-23 2426
android前面介绍了Android的IPC机制,现在我们通过Bundle实现他的IPC机制,后面会相继介绍不同的跨进程通信方式 场景:手机上存在两个应用,现在需要通过应用A的Activity跳转到应用B的Activity并传递数据,从而实现进程间通信 1.首先创建两个应用A,与应用B 应用A的Activity如下 private Button button=null; @O
AndroidIntent传递对象的两种方法Serializable,Parcelable
01-04
Android的传递有两个方法,一个是Serializable,另一个是ParcelableSerializable是J2SE本身就支持的。而ParcelableAndroid所特有的。 二者的使用场景和区别: 1)在使用内存的时候,ParcelableSerializable...
Android 数据传递(IntentBundleSerializableParcelable等)
10-04
AndroidSerializable常用于IntentBundle的数据传递。序列化的过程是将对象转换为字节流,反序列化则相反。虽然使用简单,但序列化速度较慢,且生成的字节流占用空间大,不适合大量数据传输。 4. **...
Android 通过Intent使用Bundle传递对象详细介绍
09-01
Android开发Intent是应用程序之间以及应用程序内部组件之间通信的主要手段。Intent通常用于启动新的Activity或者Service,而在Intent传递数据时,Bundle是常用的工具。本文将详细讲解如何通过Intent使用...
Android传值IntentBundle区别小结
08-26
Android应用开发IntentBundle是两种常见的数据传递机制,它们在不同场景下有着各自的优势。本篇文章将深入探讨IntentBundle在传值上的差异,帮助开发者更好地理解和选择合适的传递方式。 首先,Intent...
使用Intent方式跨进程访问
04-20
NULL 博文链接:https://coderlxl201209164551.iteye.com/blog/1902790
Android应用源码之Bundle_Bundle.zip
09-03
Android应用源码之Bundle_Bundle
Android学习笔记之bundle用法源码
08-05
Android学习笔记之bundle用法源码,非常非常简单,看了就懂,看了就能掌握bundle的基础用法,以及如何通过Intent传递及取出bundle
Android Bundle App内部实现原理
低调的成长
07-28 5678
  core的代码   首先我们在代码调用了 manager = SplitInstallManagerFactory.create(this) 1.SplitInstallManagerFactory.class public class SplitInstallManagerFactory {     public static SplitInstallManager...
Android开发】Bundle机制
qianshanyany的博客
04-26 173
BundleAndroid开发十分常见,常用于以下场合: 1.Activity状态数据的保存与恢复涉及到的两个回调:void onSaveInstanceState (Bundle outState)、void onCreate (Bundle savedInstanceState) 2.Fragment的setArguments方法:void setArguments (Bundle ar...
写文章

热门文章

  • java中四种线程池及poolSize、corePoolSize、maximumPoolSize 42083
  • 详解Bitmap之ARGB_8888/RGB_565/ALPHA_8/ARGB_4444 14622
  • Android中如何使控件保持固定宽高比 14430
  • android中几种定位方式详解 13916
  • Android 12新功能:启动画面SplashScreen 13524

分类专栏

  • android开发 71篇
  • Vue入门+进阶
  • 逆向与安全 5篇
  • flutter入门+进阶 8篇
  • Android进阶之路 27篇
  • 利器!Android开发工具之谈 2篇
  • Android魔术 - 玩一玩那些酷炫的效果 5篇
  • Kotlin入门 5篇
  • 算法
  • java 2篇
  • c++

最新评论

  • 【Android】实现一个悬浮在软键盘上的输入栏

    BennuCTech: https://github.com/chzphoenix/FastWidget4Android_HCZ

  • 【Android】实现一个悬浮在软键盘上的输入栏

    BennuCTech: https://github.com/chzphoenix/FastWidget4Android_HCZ

  • 【Android】实现一个悬浮在软键盘上的输入栏

    BennuCTech: https://github.com/chzphoenix/FastWidget4Android_HCZ

  • 【Android】实现一个悬浮在软键盘上的输入栏

    会做饭的程序猿: 有空放个demo吧

  • Android 如何获取有效的DeviceId

    BennuCTech: 直接看结论

大家在看

  • 3、软连接和硬链接什么区别 428
  • 鹏哥C语言46-48---函数的递归和迭代
  • java计算机毕业设计毕业生就业创业交流网站(开题+程序+论文)
  • 使用Python实现深度学习模型:智能音乐创作与生成
  • 基于Jeecgboot3.6.3的flowable流程增加任务节点操作按钮的控制(四)

最新文章

  • 【Android开发】如何打包压缩文件、文件夹?
  • 说一说Kotlin协程中的同步锁——Mutex
  • 深入理解Flutter中的Mixin机制
2024年3篇
2023年20篇
2022年8篇
2021年13篇
2019年3篇
2018年15篇
2017年33篇
2014年8篇
2013年2篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BennuCTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家山西玻璃钢雕塑价格商场门厅美陈图片浙江大型商场创意商业美陈多少钱广西省玻璃钢雕塑银川卡通玻璃钢雕塑价格蜗牛玻璃钢卡通雕塑订做玻璃钢雕塑艺术特点昆明玻璃钢烤漆雕塑定制加工西宁玻璃钢雕塑在哪找嘉兴玻璃钢卡通雕塑供货商登封玻璃钢花盆花器仿生玻璃钢蚂蚁雕塑新乡抽象玻璃钢人物雕塑端州玻璃钢机器人雕塑批发青岛销售玻璃钢造型雕塑博一玻璃钢雕塑玻璃钢雕塑哪里最多山西欧式玻璃钢雕塑定制商场美陈门头效果图江门出售玻璃钢雕塑玻璃钢牛雕塑厂家选哪家玻璃钢雕塑报价免费咨询南阳玻璃钢卡通雕塑定做重庆玻璃钢不锈钢雕塑湖北艺术雕塑玻璃钢中式玻璃钢雕塑价格宿州人物玻璃钢雕塑订做价格玻璃钢卡通雕塑找哪家青海园林玻璃钢雕塑厂家玻璃钢佛像雕塑生产厂香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化