概述
对于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());
}
};
}
最后
以上就是发嗲酒窝为你收集整理的Activity之间传递对象数组的全部内容,希望文章能够帮你解决Activity之间传递对象数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复