转载:http://blog.csdn.net/lincyang/article/details/7080676
Activity间要传递数据,很多时候简单的int和string满足不了需求,我们在面向对象中已经习惯了类和对象,
那么下面就说一下如何传递类对象。
一、单个对象
Android中有两种办法来完成这件事。一个是Java的序列化(Serializable),另一个是Android的Parcelable序列化方法。
对于第一种办法实现很简单,只需要实现Serializable接口就好了。就像下面是一个person类:
- package com.linc.meta;
- import java.io.Serializable;
- @SuppressWarnings("serial")
- public class Person2 implements Serializable {
- private String Name = null;
- private String Gender = null;
- private int HP = 0;
- private String Summary = null;
- private String Skill = null;
- public Person2(String name,String gender,int HP,String summary,String skill)
- {
- this.Name = name;
- this.Gender = gender;
- this.Summary = summary;
- this.HP = HP;
- this.Skill = skill;
- }
- public String getName() {
- return Name;
- }
- public void setName(String name) {
- Name = name;
- }
- public String getGender() {
- return Gender;
- }
- public void setGender(String gender) {
- Gender = gender;
- }
- public int getHP() {
- return HP;
- }
- public void setHP(int hP) {
- HP = hP;
- }
- public String getSummary() {
- return Summary;
- }
- public void setSummary(String summary) {
- Summary = summary;
- }
- public String getSkill() {
- return Skill;
- }
- public void setSkill(String skill) {
- Skill = skill;
- }
- }
怎么样,很简单的把原来的person类实现Serializable接口就可以了。
对于第二种办法,实现起来还是稍微有点小磕绊。这是Android新提供的序列化类,首先要看看Parcel类 ,它是一个数据的容器,只要你的类实现Parcelable接口,并完成几个步骤就可以放到Parcel中传递了。
有三个步骤要完成:
一、完成writeToParcel(Parcel dest, int flags)方法:该方法将类的数据写入外部提供的Parcel中
二、完成describeContents():这是返回描述性的东西,返回值是整型,通常是0.如果知道marshalled,请看CONTENTS_FILE_DESCRIPTOR
三、Parcelable.Creator 接口
请看下面,还是person类,它实现了Parcelable接口。
- package com.linc.meta;
- import android.os.Parcel;
- import android.os.Parcelable;
- public class Person implements Parcelable {
- private String Name = null;
- private String Gender = null;
- private int HP = 0;
- private String Summary = null;
- private String Skill = null;
- public Person(String name,String gender,int HP,String summary,String skill)
- {
- this.Name = name;
- this.Gender = gender;
- this.Summary = summary;
- this.HP = HP;
- this.Skill = skill;
- }
- public String getName() {
- return Name;
- }
- public void setName(String name) {
- Name = name;
- }
- public String getGender() {
- return Gender;
- }
- public void setGender(String gender) {
- Gender = gender;
- }
- public int getHP() {
- return HP;
- }
- public void setHP(int hP) {
- HP = hP;
- }
- public String getSummary() {
- return Summary;
- }
- public void setSummary(String summary) {
- Summary = summary;
- }
- public String getSkill() {
- return Skill;
- }
- public void setSkill(String skill) {
- Skill = skill;
- }
- //Describe the kinds of special objects contained in this Parcelable's marshalled representation.
- //CONTENTS_FILE_DESCRIPTOR
- @Override
- public int describeContents() {
- // TODO Auto-generated method stub
- return 0;
- }
- //该方法将类的数据写入外部提供的Parcel中
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(Name);
- dest.writeString(Gender);
- dest.writeString(Summary);
- dest.writeInt(HP);
- dest.writeString(Skill);
- }
- public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>()
- {
- @Override
- public Person createFromParcel(Parcel source) {
- return new Person(source);
- }
- @Override
- public Person[] newArray(int size) {
- return new Person[size];
- }
- };
- private Person(Parcel dest)
- {
- this.Name = dest.readString();
- this.Gender = dest.readString();
- this.Summary = dest.readString();
- this.HP = dest.readInt();
- this.Skill = dest.readString();
- }
- }
最后举一个例子,有两个Activity A和B,A中点击button后用Serializable传给B person,然后在B中点击button,把person用parcelable再传回来。
activity A
- package com.linc;
- import com.linc.meta.Person;
- import com.linc.meta.Person2;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- public class ActivityA extends Activity {
- private TextView txt ;
- private Button btn;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- txt = (TextView)findViewById(R.id.txt);
- btn = (Button)findViewById(R.id.btn);
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- transferData();
- }
- });
- Intent intent = getIntent();
- Person person = (Person) intent.getParcelableExtra("person");
- if(person != null)
- txt.setText("person :\n " + person.getName() + " \n "
- + person.getGender() + " \n "
- + person.getSummary() + " \n "
- + person.getHP() + " \n "
- + person.getSkill());
- }
- private void transferData()
- {
- Person2 person = new Person2("张飞", "男", 4, "五虎上将之一。燕山人士,喜欢喝酒,生性豪放重情义。", "咆哮");
- Intent intent = new Intent();
- intent.setClass(this, ActivityB.class);
- intent.putExtra("person2", person);
- startActivity(intent);
- }
- }
ActivityB
- package com.linc;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- import com.linc.meta.Person;
- import com.linc.meta.Person2;
- public class ActivityB extends Activity {
- private TextView txt ;
- private Button btn;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- txt = (TextView)findViewById(R.id.txt);
- btn = (Button)findViewById(R.id.btn);
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- transferData();
- }
- });
- Intent intent = getIntent();
- if(intent != null)
- {
- Person2 person = (Person2) intent.getSerializableExtra("person2");
- txt.setText("person : \n" + person.getName() + " \n "
- + person.getGender() + " \n "
- + person.getSummary() + " \n "
- + person.getHP() + " \n "
- + person.getSkill());
- }
- }
- private void transferData()
- {
- Person person = new Person("黄盖", "男", 4, "东吴老将,配合周瑜使用苦肉计,骗过了将干,舍身无畏。", "苦肉");
- Intent intent = new Intent();
- intent.setClass(this, ActivityA.class);
- intent.putExtra("person", person);
- startActivity(intent);
- }
- }
二、List
也可以用Serialize和parcelable来传递多个类对象,这时要强调的是用ArrayList。就是把多个person放到list中,然后取时用intent.getParcelableArrayListExtra("person_list")取出。就okay了。
序列化也一样,发送正常发,取时类似这样:data = (ArrayList<Person>)getIntent().getSerializableExtra("person_list");