activity间传递值

通过Intent启动另一个activity


传递简单数据(八大基本数据类型+String)

传递简单数据的代码片段

    Intent intent = new Intent(MainActivity.this, AdditionalActivity.class);intent.putExtra("INT",12);intent.putExtra("CHAR",'字');intent.putExtra("str","张胜利");intent.putExtra("BOOLEAN",true);······

接收简单数据的代码片段

    Intent intent = getIntent();// 不需要设置默认值String str = intent.getStringExtra("str");//需要设置默认值int INT = intent.getIntExtra("INT",0);char CHAR = intent.getCharExtra("CHAR",' ');boolean BOOLEAN = intent.getBooleanExtra("BOOLEAN",false);······

传递数据包Bundle

传递数据包Bundle的代码片段

     Intent intent = new Intent(MainActivity.this, AdditionalActivity.class);Bundle bundle = new Bundle();bundle.putString("name","李师师");bundle.putInt("age",18);ArrayList<String> list = new ArrayList<>();for (int i = 1; i < 10; i++) {list.add("王文武"+i);}bundle.putStringArrayList("list",list);······intent.putExtras(bundle);startActivity(intent);

接收数据包Bundle的代码片段

    Intent intent = getIntent();// 获取数据包BundleBundle data = intent.getExtras();int age = data.getInt("age");String name = data.getString("name");ArrayList<String> list = data.getStringArrayList("list");······

传递值对象

值对象传递时需要对实体类对象进行序列化,可使用java.io中的Serializable;或者使用android.os中的Parcelable,实现自定义序列化

通过JDK自带的序列化接口Serializable实现的对象类

import java.io.Serializable;public class User implements Serializable {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

通过实现Parcelable接口自定义序列化对象类

import android.os.Parcel;
import android.os.Parcelable;public class User implements Parcelable {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public User() {}protected User(Parcel in) {name = in.readString();age = in.readInt();}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int describeContents() {return 0;}// 写数据进行保存@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeInt(age);}//用来创建自定义的Parcelable的对象public static final Creator<User> CREATOR = new Creator<User>() {//创建自定义的Parcelable的对象@Overridepublic User createFromParcel(Parcel in) {return new User(in.readString(),in.readInt());}//读取数据进行恢复@Overridepublic User[] newArray(int size) {return new User[size];}};
}

传递值对象的代码片段

传递值对象的时候可以直接使用Intent类中的putExtra()方法

    Intent intent = new Intent(MainActivity.this, AdditionalActivity.class);intent.putExtra(new User("赵柳",23));startActivity(intent);

接收值对象的代码片段

接收值对象时需要区分值对象是通过那种方式实现的序列化接口

  1. 通过Serializable接口实现序列化
        
    可以使用Intent类中的getSerializableExtra()方法获取对象,但需要强转成对应的实体类对象。
  2. 通过Parcelable接口实现序列化
        
    可以使用Intent类中的getParcelableExtra方法获取对象,不需要强转获取的对象。
    Intent intent = getIntent();//通过Serializable接口实现的序列化的对象类//User user1= (User) intent.getSerializableExtra("user1");//通过Parcelable接口实现的自定义序列化的对象类User2 user2 = intent.getParcelableExtra("user2");······

Serializable 和Parcelable 的区别

作用

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、RMI(Remote Method Invocation)以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。使用了反射技术,并且期间产生临时对象
      
Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

效率及选择

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

高级功能上

Serializable序列化不保存静态变量,可以使用transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义

如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话说,用transient关键字标记的成员变量不参与序列化过程。

效率及选择

对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。
      
而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量(AS有相关插件 一键生成所需方法),实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

代码实现
      
从上面我们可以看出Parcel的写入和读出顺序是一致的。如果元素是list读出时需要先new一个ArrayList传入,否则会报空指针异常。如下:

    list = new ArrayList<String>();in.readStringList(list);

PS: 在自己使用时,read数据时误将前面int数据当作long读出,结果后面的顺序错乱,报异常,当类字段较多时务必保持写入和读取的类型及顺序一致。

Android学习笔记之activity间传递传递参数相关推荐

  1. Android之一窥究竟Activity间的数据传递以及Intent的用处

    1.Activity与Intent * 1.1何为Intent * 1.2Intent的用武之地 * 1.3Activity间的数据传递 转载请标明出处: http://blog.csdn.net/h ...

  2. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  3. Android学习笔记(四):在Activity中跳转--Intent的使用

    Android学习笔记(四):在Activity中跳转--Intent的使用 上篇,我们实战了一个很小的项目BMI,通过BMI这个项目,可以很好的理解Activity的程序结构,以方便后面高级API的 ...

  4. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  5. Pro Android学习笔记(三三):Menu(4):Alternative菜单

    什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...

  6. Pro Android学习笔记(七七):服务(2):Local Service

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Local Service的目的是更容易实 ...

  7. Android学习笔记第五篇--网络连接与云服务(一)

    Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 ​ 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...

  8. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  9. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

最新文章

  1. mac linux loader,M3 Bitlocker Loader Mac版
  2. 如何让qtableview根据行列的宽度调整大小_T-200热熔打包机,打包宽度调整步骤
  3. C#-文件只读时进行拷贝或删除报错, 对路径不允许访问
  4. multiprocessing python_Python教程:进程和线程amp;多进程
  5. input子系统基础之按键3——input子系统架构总览
  6. 张朝阳:知识直播是长久的事情 商业模式将水到渠成
  7. 感谢Karen--oracle的system密码忘记修改办法|附sqlplus /nolog|
  8. linux 按照特定字符换行_在Linus Torvalds建议之后内核淘汰80个字符长度限制
  9. Dalvik虚拟机的内存管理
  10. 服务器共享文件有访问台数限制,Win7/xp系统下共享文件夹最大连接数限制怎么解除...
  11. stm32f103zet6定时器和pwm简单驱动步进电机
  12. arduino的pinMode()函数
  13. Elasticsearch+Hbase实现海量数据秒回查询
  14. Vue跨域问题解决方案
  15. foxmail设置,服务器备份(很实用)
  16. 渐变按钮 css,CSS3 Gradient Buttons
  17. 微服务大战:Spring启动大战。 Ballerina
  18. SpringBoot修改启动图标(详细步骤)
  19. Javascript Flash harness
  20. VR购物兴起,难道百搭的VR技术要全面“入侵”生活了?

热门文章

  1. Poj 2010-Moo University - Financial Aid
  2. 你刚才微信上撤回了什么?我都看到了
  3. 类似于语雀、石墨文档私有化部署开源代替品,你尝试了吗?
  4. win10-weblogic12.1.1.0新建域
  5. 老师计算机组合照说说,照毕业照分离说说 2018照毕业照心情感言说说朋友圈
  6. 揭开Storage vMotion的神秘面纱
  7. android 高德地图设置不能旋转_北京实习阿里巴巴、国寿投资、小饭桌、高德软件...
  8. LeetCode·每日一题·757.设置交集大小至少为2·贪心
  9. 分布式搜索引擎ElasticSearch(二)---ElasticSearch进阶使用教程
  10. 无域名HTTP请求攻击分析