在Android中經(jīng)常會在兩個Activity之間傳輸數(shù)據(jù),又很多種方法可以實(shí)現(xiàn)椎工,比如寫在文件中,用SharedPreferences等等都可以實(shí)現(xiàn),現(xiàn)在來介紹的是使用序列化的方式來傳輸數(shù)據(jù)馋劈。Android序列化一共有兩種方式,一種是實(shí)現(xiàn)Serializable接口晾嘶,另一種就是實(shí)現(xiàn)Parcelable接口妓雾。
實(shí)現(xiàn)Serializable接口
實(shí)現(xiàn)Serializable非常簡單,只需要實(shí)現(xiàn)這個接口就可以了垒迂,沒有實(shí)現(xiàn)Parcelable接口那么復(fù)雜械姻。
/**
* 實(shí)現(xiàn)Serializable接口
*/
public class Student implements Serializable {
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
實(shí)現(xiàn)Parcelable接口
實(shí)現(xiàn)Parcelable接口比實(shí)現(xiàn)Serializable復(fù)雜了很多,但效率更高机断,是Android推薦的序列化方式楷拳。
/**
* 實(shí)現(xiàn)Parcelable
*/
public class Teacher implements Parcelable {
private String name;
private String sex;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeString(this.sex);
}
public Teacher() {
}
public Teacher(String name, String sex) {
this.name = name;
this.sex = sex;
}
protected Teacher(Parcel in) {
this.name = in.readString();
this.sex = in.readString();
}
public static final Parcelable.Creator<Teacher> CREATOR = new Parcelable.Creator<Teacher>() {
@Override
public Teacher createFromParcel(Parcel source) {
return new Teacher(source);
}
@Override
public Teacher[] newArray(int size) {
return new Teacher[size];
}
};
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
看到實(shí)現(xiàn)Parcelable接口是不是瞬間就懵逼了,用AndroidStudio的的可以安裝一個插件吏奸,可以自動的將實(shí)現(xiàn)Parcelable接口欢揖。來張效果圖大家感受下。(插件的名字叫Android parcelable code generator)
具體應(yīng)用
上面我們已經(jīng)實(shí)現(xiàn)了這兩個接口奋蔚,那么怎么來使用用這個呢她混?接下來就來用個demo來演示下,Student實(shí)現(xiàn)
Serializable接口旺拉,Teacher實(shí)現(xiàn)Parcelable接口产上,將這兩個類從MainActivity傳輸給SecondActivity并在SecondActivity中顯示出來。
Student.java
/**
* 實(shí)現(xiàn)Serializable接口
*/
public class Student implements Serializable {
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
Teacher
/**
* 實(shí)現(xiàn)Parcelable
*/
public class Teacher implements Parcelable {
private String name;
private String sex;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeString(this.sex);
}
public Teacher() {
}
public Teacher(String name, String sex) {
this.name = name;
this.sex = sex;
}
protected Teacher(Parcel in) {
this.name = in.readString();
this.sex = in.readString();
}
public static final Parcelable.Creator<Teacher> CREATOR = new Parcelable.Creator<Teacher>() {
@Override
public Teacher createFromParcel(Parcel source) {
return new Teacher(source);
}
@Override
public Teacher[] newArray(int size) {
return new Teacher[size];
}
};
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
Teacher teacher = new Teacher("teacher", "man");
bundle.putParcelable("teacher", teacher);
Student student = new Student("student", "femal");
bundle.putSerializable("student", student);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
}
SecondActivity.java
public class SecondActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mTextView = (TextView) findViewById(R.id.textview);
Intent intent = getIntent();
mTextView.append(intent.getExtras().getSerializable("student").toString() + "\n");
mTextView.append(intent.getExtras().getParcelable("teacher").toString());
}
}
運(yùn)行結(jié)果
到這里Android序列化已經(jīng)介紹完了蛾狗。
本博客同步發(fā)表在http://hjxandhmr.github.io/2016/06/19/Android-SerializeMethod/