IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Activity间传类对象数据

    lincyang发表于 2011-12-17 22:42:43
    love 0

            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");


    源码在这里。



沪ICP备19023445号-2号
友情链接