對于Android來說傳遞複雜類型,主要是将自己的類轉換為基礎的位元組數組,Activity之間傳遞資料是通過Intent實作的。 Android序列化對象主要有兩種方法,實作Serializable接口、或者實作Parcelable接口。實作Serializable接口是 Java
SE本身就支援的,而Parcelable是Android特有的功能,效率比實作Serializable接口高,而且還可以用在程序間通信 (IPC)中。實作Serializable接口非常簡單,聲明一下就可以了。而實作Parcelable接口稍微複雜一些,但效率更高,推薦用這種方法提高性能。
Parcelable接口的作用:實作了Parcelable接口的執行個體可以将自身的狀态資訊(狀态資訊通常指的是各成員變量的值)寫入Parcel,也可以從Parcel中恢複其狀态。
Parcel用來完成資料的序列化傳遞。下面就介紹一下實作Parcelable接口的方法。
通過實作Parcelable接口序列化對象的步驟:
1、實作Parcelable接口。
2、并且實作Parcelable接口的public
void writeToParcel(Parcel dest, int flags)方法 。
3、自定義類型中必須含有一個名稱為CREATOR的靜态成員,該成員對象要求實作Parcelable.Creator接口及其方法。
簡而言之:通過writeToParcel将你的對象映射成Parcel對象,再通過createFromParcel将Parcel對象映射成你的對象。也可以将Parcel看成是一個流,通過writeToParcel把對象寫到流裡面,在通過createFromParcel從流裡讀取對象,隻不過這個過程需要你來實作,是以寫的順序和讀的順序必須一緻。
下面給出例子
mainAct.java
import java.util.ArrayList;
import com.harlan.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
/**
* Activity之間的傳值
* @author Harlan Song
* @email [email protected]
*/
public class MainAct extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent=new Intent(MainAct.this,ShowAct.class);
/**
* 1 常見資料類型都可以通過下面方式。
*/
//
intent.putExtra("year", 2012);
intent.putExtra("isValue", true);
intent.putExtra("data", "this is a test data");
intent.putExtra("IntArray",new int[]{1,2});
intent.putExtra("StringArray", new String[]{"shanghai","ganzhou","wuhan"});
intent.putExtra("BooleanArray", new boolean[]{true,false,true,false});
//String集合
ArrayList<String> arraylist=new ArrayList<String>();
arraylist.add("list1");
arraylist.add("list2");
intent.putStringArrayListExtra("arraylist", arraylist);
//傳遞對象
intent.putExtra("student", new Student("wang",20 , "male"));
ArrayList<BooK> list=new ArrayList<BooK>();
BooK book;
for (int i = 1; i < 5; i++) {
book=new BooK("BookName"+i, 100+i, "BookAuthor"+i);
list.add(book);
}
intent.putParcelableArrayListExtra("bookList", list);
startActivity(intent);
}
}
傳遞的兩個實體類下面解釋一下
使用者接收資料的并顯示的另一個actvity
ShowAct.java
?
package com.harlan.act;
import java.util.ArrayList;
import com.harlan.R;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class ShowAct extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
TextView tv=(TextView) findViewById(R.id.textView1);
StringBuilder stringb=new StringBuilder();
stringb.append("Int:"+getIntent().getIntExtra("year", 0)+"\n");
stringb.append("Boolean:"+getIntent().getBooleanExtra("isValue", false)+"\n");
stringb.append("String:"+getIntent().getStringExtra("data")+"\n");
int[] intArray=getIntent().getIntArrayExtra("IntArray");
stringb.append("IntArray:"+intArray[0]+","+intArray[1]+"\n");
String[] stringArray=getIntent().getStringArrayExtra("StringArray");
stringb.append("StringArray:"+stringArray[0]+","+stringArray[1]+"\n");
boolean[] booleanArray=getIntent().getBooleanArrayExtra("BooleanArray");
stringb.append("StringArray:"+booleanArray[0]+","+booleanArray[1]+"\n");
Student student=(Student) getIntent().getSerializableExtra("student");
stringb.append("Object:"+student.getName()+","+student.getAge()+","+student.getSex()+"\n");
ArrayList<String> arraylist=getIntent().getStringArrayListExtra("arraylist");
stringb.append("ArrayList:"+arraylist.get(0)+","+arraylist.get(1)+"\n");
//對象集合
ArrayList<BooK> bookList=getIntent().getParcelableArrayListExtra("bookList");
stringb.append("\n"+"下面是對象集合資料"+"\n");
BooK book;
if(bookList!=null&&bookList.size()>0){
for (int j = 0; j < bookList.size(); j++) {
book=bookList.get(j);
stringb.append("bookName"+book.getName()+"\n");
stringb.append("bookPrice"+book.getPrice()+"\n");
stringb.append("bookAuthor"+book.getAuthor()+"\n");
stringb.append("--------------------------------"+"\n");
}
}
tv.setText(stringb.toString());
}
}
布局檔案就沒什麼好說的,就是一個TextView
Student.java
package com.harlan.act;
import java.io.Serializable;
/**
* 學習實體類
* @author Harlan Song
* @email [email protected]
*/
public class Student implements Serializable {
private static final long serialVersionUID = -6752893368481996015L;
private String name;
private int age;
private String sex;
public Student(){}
public Student(String name,int age,String sex){
this.name=name;
this.age=age;
this.sex=sex;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
要實作Serializable接口,關于Serializable看後面
BooK.java
?
package com.harlan.act;
import android.os.Parcel;
import android.os.Parcelable;
public class BooK implements Parcelable{
private String name;
private int price;
private String author;
public BooK(){}
public BooK(String name,int price,String author){
this.name=name;
this.price=price;
this.author=author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(this.name);
parcel.writeInt(this.price);
parcel.writeString(this.author);
}
public static final Parcelable.Creator<BooK> CREATOR=new Creator<BooK>() {
@Override
public BooK[] newArray(int i) {
return new BooK;
}
@Override
public BooK createFromParcel(Parcel parcel) {
// TODO Auto-generated method stub
return new BooK(parcel.readString(), parcel.readInt(), parcel.readString());
}
};
}