天天看點

Activity之間傳遞對象數組

對于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()); 
        } 
    };  
}
           

繼續閱讀