关于Intent

栏目: Android · 发布时间: 6年前

  • 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)
复制代码

思考二:如果有限制,有什么好的传输方案吗?

  • 可采用 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 异常。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据挖掘概念与技术

数据挖掘概念与技术

(加)Jiawei Han;Micheline Kamber / 范明、孟小峰 / 机械工业 / 2007-3 / 55.00元

《数据挖掘概念与技术(原书第2版)》全面地讲述数据挖掘领域的重要知识和技术创新。在第1版内容相当全面的基础上,第2版展示了该领域的最新研究成果,例如挖掘流、时序和序列数据以及挖掘时间空间、多媒体、文本和Web数据。本书可作为数据挖掘和知识发现领域的教师、研究人员和开发人员的一本必读书。 《数据挖掘概念与技术(原书第2版)》第1版曾是受读者欢迎的数据挖掘专著,是一本可读性极佳的教材。第2版充实了数据......一起来看看 《数据挖掘概念与技术》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具