在Android中利用Intent在各个组件间通讯。java
基本类型:
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();android
intent.putIntegerArrayListExtra();面试
intent.putStringArrayListExtra();数据库
intent.putParcelableArrayListExtra();json
intent.putExtras(); 传递一个bundle对象,全部数据都封装在bundle中
数组
Intent intent = new Intent(AActivity.this, BActivity.class);
byte[] bytes = new byte[1024 * 1024];
intent.putExtra("key", bytes);
startActivity(intent);
复制代码
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)
复制代码
原理:学Android 这么久,intent传递数据最大多少呢? bash
结论:说明Intent传递数据大小是有限制的;具体限制大小为 ((1*1024*1024) - (4096 *2))
app
可采用EventBus
等相似方案传递数据;测试
可声明静态变量来进行数据传递;「效率高,耦合性高」ui
可将数据先持久化再还原,可利用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传值类型要求:
1)Intent 传输的数据,都存放在一个 Bundle 类型的对象 mExtras 中,Bundle 要求全部存储的数据,都是可被序列化的。
2)为何这里的Bundle
要求传递的数据必须序列化?
由于 Activity
之间传递数据,首先要考虑跨进程的问题,而Android中又是经过 Binder
机制来解决跨进程通讯的问题。涉及到跨进程,对于复杂数据就要涉及到序列化和反序列化的过程,这就注定是一次值传递(深拷贝)的过程。
3)全部经过Bundle传递数据都须要序列化吗?
不是,这里的序列化只与Binder的跨进程通讯有关,其余例如Fragment传值用到的Bundle不须要序列化。
序列化说明:
在 Android 中,序列化数据须要实现Serializable
或者Parcelable
。对于基础数据类型的包装类,自己就是实现了Serializable,而咱们自定义的对象,按需实现这两个序列化接口的其中一个便可。
因此这个问题用反证法也能够解释,若是是引用传递,那传递过去的只是对象的引用,指向了对象的存储地址,就只至关于一个Int的大小,也就根本不会出现TransactionTooLargeException
异常。