- intent.putExtra();
基本类型: String byte short int long char boolean float double String[] byte[] short[] int[] long[] char[] boolean[] float[] double[] 序列化: Parcelable CharSequence Serializable Parcelable[] CharSequence[] 复制代码
-
intent.putCharSequenceArrayListExtra();
-
intent.putIntegerArrayListExtra();
-
intent.putStringArrayListExtra();
-
intent.putParcelableArrayListExtra();
-
intent.putExtras();
传递一个bundle对象,所有数据都封装在bundle中
思考一:Intent最大传递数据有限制吗? 限制是多少?
- 测试案例:用intent传递 1M 的byte数组
Intent intent = new Intent(AActivity.this, BActivity.class); byte[] bytes = new byte[1024 * 1024]; intent.putExtra("key", bytes); startActivity(intent); 复制代码
- 结果:报异常 TransactionTooLargeException
Caused by: android.os.TransactionTooLargeException: data parcel size 1048956 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:615) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3070) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518) 复制代码
-
结论:说明Intent传递数据大小是有限制的;具体限制大小为
((1*1024*1024) - (4096 *2))
思考二:如果有限制,有什么好的传输方案吗?
-
可采用
EventBus
等类似方案传递数据; -
可声明静态变量来进行数据传递;「效率高,耦合性高」
-
可将数据先持久化再还原,可利用
SharedPreferences
或 存入数据库
,sp相对简单;「效率低」
//将对象转换为 json字符串,使用sp储存 Gson gson = new GsonBuilder().serializeNulls().create(); String json = gson.toJson(userEntity); //通过json字符串取出 ,转为对象 Gson gson = new GsonBuilder().serializeNulls().create(); UserEntity loginUser = gson.fromJson(jsonEntity,UserEntity.class); 复制代码
思考三:Intent 使用 Bundle 存储数据,到底是值传递(深拷贝)还是引用传递?
-
Intent传值类型要求:
1)Intent 传输的数据,都存放在一个 Bundle 类型的对象 mExtras 中,Bundle 要求所有存储的数据,都是可被序列化的。
2)为什么这里的
Bundle
要求传递的数据必须序列化?因为
Activity
之间传递数据,首先要考虑跨进程的问题,而Android中又是通过Binder
机制来解决跨进程通信的问题。涉及到跨进程,对于复杂数据就要涉及到序列化和反序列化的过程,这就注定是一次值传递(深拷贝)的过程。3)所有通过Bundle传递数据都需要序列化吗?
不是,这里的序列化只与Binder的跨进程通信有关,其他例如Fragment传值用到的Bundle不需要序列化。
-
序列化说明:
在 Android 中,序列化数据需要实现
Serializable
或者Parcelable
。对于基础数据类型的包装类,本身就是实现了Serializable,而我们自定义的对象,按需实现这两个序列化接口的其中一个即可。 -
所以这个问题用反证法也可以解释,如果是引用传递,那传递过去的只是对象的引用,指向了对象的存储地址,就只相当于一个Int的大小,也就根本不会出现
TransactionTooLargeException
异常。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。