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 mark_dev@163.com 
*/
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 mark_dev@163.com 
*/
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()); 
        } 
    };  
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值