很少在博客上敲文本了,都是直接上代码就结束了,今天抽点时间写点东西。
我们知道在一般情况下,在两个或者多个Activity中传递数据中通过Intent的函数只能传递基本数据类型,那当我们想传输复杂的类的数据类型时候,我们就必须用到Parcelable或者Serializable接口经行传递数据。
Parcelable和Serializable都是能对数据经行序列化,将数据转化成字节流的方式进行传输,当这些字节流传输完毕后再对其进行反序列化,达到传输复杂数据的目的。
Serializable接口是原先Java Se中就存在的Api,但是在google公司在Android中又添加了Parcelable接口,为什么呢?第一,Parcelable比Serializable的传输速率要快很多倍,大概十倍左右(具体不知道),所以实现Parcelable接口可能提高程序的性能。第二,Parcelable可以进行IPC通讯,即跨进程通讯,这是Serializable做不到的。还有一些优点大家可以摸索,我就不累述了。
不说了,上代码
package com.example.administrator.test;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by hd on 2015/12/16.
*/
public class Student implements Parcelable {
private String name;
private int age;
private String address;
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel in) {
Student a = new Student();
a.setName(in.readString());
a.setAddress(in.readString());
a.setAge(in.readInt());
return a;
}
@Override
public Student[] newArray(int size) {
return new Student[0];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(address);
dest.writeInt(age);
}
@Override
public String toString() {
return "name:" + name + "\n" +
"address:" + address + "\n" +
"age:" + age;
}
}
可以看到,在这个bean中我实现了Parcelable接口,我们需要实现一些接口中的方法:
public int describeContents();
对接口的描述,可以直接return 0;
public void writeToParcel(Parcel dest, int flags);
这个方法提供一个Parcel对象,在传递中就是通过将数据保存在这个对象中进行传递,所以我们要对这个Parcel进行写入数据的操作。至于flag参数只是作为一个标记,你可以在添加在数据中传递。
/**
* 此接口必须被实现,并且需要写成public权限以及对象名为CREATOR(必须大写)
*/
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
这是一个Parcelable内部的一个接口, 其中createFromParcel就是从Parcel中反序列化数据。
注意:
// 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
// android.os.BadParcelableException:
// Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
// 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
// 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
// 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
// 5.反序列化对象
package com.example.administrator.test;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button btnSend;
private Button btnSeriaSend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSend = (Button) findViewById(R.id.btnSend);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Student a = new Student();
a.setName("小明");
a.setAddress("福建");
a.setAge(25);
intent.setFlags(0);
intent.setClass(MainActivity.this, SecondActivity.class);
intent.putExtra("hd", a);
startActivity(intent);
}
});
btnSeriaSend = (Button) findViewById(R.id.btnSeriaSend);
btnSeriaSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Teacher t = new Teacher();
intent.setFlags(1);
t.setName("小红");
t.setAddress("浙江");
t.setAge(24);
intent.putExtra("hd", t);
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
package com.example.administrator.test;
import java.io.Serializable;
/**
* Created by hd on 2015/12/16.
*/
public class Teacher implements Serializable {
private String name;
private String address;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "name:" + name + "\n" +
"address:" + address + "\n" +
"age:" + age;
}
}
这是Serializable的序列化,很简单,直接实现接口就行,但是不推荐噢。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.test.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvTest"/>
</RelativeLayout>