Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去。传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口。

0、解释两种接口:

1)实现Serializable接口是JavaSE本身就支持的。

2)Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。

3)什么时候使用序列化?

a)当你想把的内存中的对象写入到硬盘的时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;

b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。

c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。

1、什么是Parcelable接口呢?

1)Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

2)Parcelable接口的定义:

public interface Parcelable {

//内容描述接口,基本不用管

public int describeContents();

//写入接口函数,打包

public void writeToParcel(Parcel dest, int flags);

//读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。

//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。

public interface Creator{

public T createFromParcel(Parcel source);

public T[] newArray(int size);

}

}

3)怎么实现Parcelable接口?

从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

(1.)describeContents方法。内容接口描述,默认返回0就可以;

(2.)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见doc文档

(3.)静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

4)代码实现>

(1.)实现MyParcelable类:

package com.jyxp.my.parcelable;

import java.util.ArrayList;

import java.util.List;

import android.os.Parcel;

import android.os.Parcelable;

public class MyParcelable implements Parcelable {

private int mInteger;

private MyParcelable2 mParcelable;

private ListmyParcelable2s = new ArrayList();

private MySerializable mMySerializable;

public MyParcelable() {

// TODO Auto-generated constructor stub

}

@SuppressWarnings("unchecked")

public MyParcelable(Parcel in) {

// TODO Auto-generated constructor stub

mInteger = in.readInt();

mParcelable = in.readParcelable(MyParcelable2.class.getClassLoader());//这个地方的ClassLoader不能为null

myParcelable2s = in.readArrayList(MyParcelable2.class.getClassLoader());

mMySerializable = (MySerializable) in.readSerializable();

}

public int getmInteger() {

return mInteger;

}

public void setmInteger(int mInteger) {

this.mInteger = mInteger;

}

public MyParcelable2 getmParcelable() {

return mParcelable;

}

public void setmParcelable(MyParcelable2 mParcelable) {

this.mParcelable = mParcelable;

}

public ListgetMyParcelable2s() {

return myParcelable2s;

}

public void setMyParcelable2s(ListmyParcelable2s) {

this.myParcelable2s = myParcelable2s;

}

public MySerializable getmMySerializable() {

return mMySerializable;

}

public void setmMySerializable(MySerializable mMySerializable) {

this.mMySerializable = mMySerializable;

}

@Override

public int describeContents() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

// TODO Auto-generated method stub

dest.writeInt(mInteger);

dest.writeParcelable(mParcelable, flags);

dest.writeList(myParcelable2s);

dest.writeSerializable(mMySerializable);

}

public static final Parcelable.CreatorCREATOR = new Creator() {

@Override

public MyParcelable[] newArray(int size) {

// TODO Auto-generated method stub

return new MyParcelable[size];

}

@Override

public MyParcelable createFromParcel(Parcel source) {

// TODO Auto-generated method stub

return new MyParcelable(source);

}

};

}

注意:

1、必须实现Parcelable.Creator接口,并且访问控制必须是public!!;实现Parcelable.Creator接口对象名必须为CREATOR!!否则在获取数据的时候,会报错,如下:android.os.BadParcelableException:

2、在读取Parcel容器里的数据时,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错。

3、注意Parcel out和in对应的属性顺序不能错,否则得不到值;如果想传递的值没有write和read,同样也是获取不到值的。

4、实现Parcelable接口我采用的做法是,从android API文档中找到Parcelable接口,详见Android 文档,将demo copy,然后将MyParcelable类名全部替换,再填写write和read的值。在填写值的时候上面的代码给出了一些示例,有时候会出现以下错误:

(1、)Caused By:android.os.BadParcelableException: ClassNotFoundException when unmarshalling,原因是ClassLoader设置不对,或者没有传入ClassLoader。

(2、)java.lang.RuntimeException: Parcelable encountered IOException writing serializable object,原因是传递的Parcelable对象里面的对象也要Parcelable或者Serializable。

2、什么是Serializable接口?

1)一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。

2)如何实现Serializable接口?

很简单,只要implements Serializable接口就可以了

3)代码实现>

package com.jyxp.my.parcelable;

import java.io.Serializable;

public class MySerializable implements Serializable {

private static final long serialVersionUID = 1L;

private Double mDouble;

private Float mFloat;

public MySerializable() {

// TODO Auto-generated constructor stub

}

public Double getmDouble() {

return mDouble;

}

public void setmDouble(Double mDouble) {

this.mDouble = mDouble;

}

public Float getmFloat() {

return mFloat;

}

public void setmFloat(Float mFloat) {

this.mFloat = mFloat;

}

}

3、如何实现传值

1)基本数据类型,自身可以

2)传递Serializable对象时,被传递的Serializable对象里面的自定义成员对象(非API中的Serializable对象)也要实现Serializable接口,否则会出现Caused by: java.io.NotSerializableException异常。从上面的代码可以看出,在Parcelable对象中是可以传递Serializable对象的,但Serializable对象里面传递的时候可不可以有Parcelable?回答是否定的,一样会产生java.io.NotSerializableException异常.

3)android api中只能传递Parcelable对象的集合,而不能传递Serializable对象的集合,也就是只能传递ArrayList,却不能传递ArrayList。刚刚开始学android的时候,对象都是被封装成Serializable,再传递,因为Serializable是JAVASE里面的本地化接口,很熟悉,当时也产生疑问,为什么会有Parcelable接口,这两个有什么区别?到后来,当Serializable不能满足要求的时候就明白了,android利用Pacelable对自己的东西进行封装,就像Worker中的Bitmap,在read的时候可以不需要设置ClassLoader。

4)也是可以传递枚举enum的,把枚举当做类来看就行了。

5)short、char、CharSequence、Map、List是不支持的,建议换成int、String、String、HashMap、ArrayList。

6)Android Studio建议安装Android Parcelable code generation Plugin,直接ALT+INSERT找Parcelable就可以了。

4、实例代码>

传送门>>>>

转载请注明出处:http://blog.csdn.net/js931178805/article/details/8268144谢谢

android数据回传的代码,android Activity之间数据传递 Parcelable和Serializable接口的使用...相关推荐

  1. ​Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

    Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable] 在Android中的不同Activity之间传递对象,我们可以考虑采用Bun ...

  2. Android面试专题系列(四):Activity之间如何进行通信→LiveDataBus

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/105147592 <And ...

  3. 解析activity之间数据传递方法的详解

    转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Int ...

  4. Android中Parcelable与Serializable接口用法

    转自: Android中Parcelable接口用法 1. Parcelable接口 Interface for classes whose instances can be written to a ...

  5. (转载)Android进阶2之Activity之间数据交流(onActivityResult的用法)

    转载自  http://www.blogjava.net/mixer-a/archive/2012/03/23/375014.html 主要功能: 在一个主界面(主Activity)上能连接往许多不同 ...

  6. 【转】 android之如何在两个activity之间传递handler_利用broadcast广播机制

    原文:http://blog.csdn.net/jason0539/article/details/18075293 这算是如何在两个activity之间传递handler的解决方案二了,解决方案一见 ...

  7. Android编程权威指南学习:Activity之间传递参数

    2019独角兽企业重金招聘Python工程师标准>>> 在Android编程中,经常会有多个Activity之间.同Activity的旋转都要进行调用,数据传递的现象.如何理解Act ...

  8. Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系

    Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...

  9. android studio生命周期代码,Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期...

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

最新文章

  1. 我的世界正版moba服务器,《我的世界》需要氪金?反观《迷你世界》才知道差距!...
  2. 第一个dotnetcore程序,Hello World
  3. next_permutation函数
  4. Qt 设置窗口背景图片的几种方法
  5. Arm Linux 交叉编译(交叉编译是什么?CROSS_COMPILE)(交叉编译工具链【待更】)
  6. 追本溯源 —— 汉语词汇含义的演化
  7. Mybatis与JDBC的对比超详细笔记
  8. linux创建tcp命令是,linux – 为tcpdump捕获创建多播联接
  9. 【渝粤教育】国家开放大学2018年春季 8618-22T燃气行业规范 参考试题
  10. Could not autowire field: XXXXX.
  11. ES文件浏览器局域网传输文件分析
  12. 微信公众号H5开发——JSSDK调用微信接口
  13. uniapp小程序实现开屏页
  14. 单片机触发器或非门工作原理以及用途
  15. 张勇:阿里云是一家云计算产品公司,要坚定走向“产品被集成”
  16. win10修改账户权限
  17. opencv处理图片批量添加噪声、以及光照、黑暗处理
  18. numpy生成随机整数
  19. 商业智能(Business Intelligence)介绍
  20. rtsp海康威视地址格式

热门文章

  1. emacs 教程学习
  2. NOIP2018游记AFO后记
  3. 城市生命线安全风险综合监测预警解决方案
  4. js获取父元素里的所有子元素
  5. (个人总结)坐标旋转矩阵中符号正负与旋转方向
  6. 面向对象思想的三种通俗解释
  7. html vue.js readonly,使用js设置input标签只读 readonly 属性
  8. Python学习笔记(35)~异位词
  9. lol不能显示聊天服务器是怎么回事,关于LOL无法连接聊天服务器的解决方法!
  10. Linux使用rmp安装tree