代码改变世界

[Android学习]Activity之间传递对象和对象集合

2014-04-15 14:41  hellenism  阅读(5005)  评论(0编辑  收藏  举报

开发过程中,Activity之间传递数据是必不可少的,android中使用Intent和Bundle作为数据载体,在Activity之间传递,对于基础数据类型,Bundle已经提供相关的put,get方法,而作为自定义的类型则需要有特别的要求.

 

自定义类型,想要使用Bundle传递时,需要满足特定条件。即该类型需要实现Serializable接口或者Parcelable接口

(注意:如果目标对象中包含其他对象,则被包含的对象也需要实现Serializable接口或者Parcelable接口)

(关于Serializable接口和Parcelable接口就不在此做记录了)

 


 

 

步骤:

1.定义类,实现相关接口

2.使用Intent和Bundle对应的方法set数据

3.startActivity传递Intent对象

 


 

 

使用Serializable

一.传递对象

a).定义类,实现Serializable接口

public class Student implements Serializable
{
    // members
    private String name;
    
    private String age;
    
    private int id;
    
    // getter setter
    public int getId()
    {
        return id;
    }
    public void setId(int id)
    {
        this.id = id;
    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getAge()
    {
        return age;
    }
    public void setAge(String age)
    {
        this.age = age;
    }
    
    /**
     * Serializable
     */
    private static final long serialVersionUID = 1L;
}
Student

 

b).使用Intent传递对象

// 使用Serializable
        Button btnSerializable = (Button)findViewById(R.id.btnSerializable);
        btnSerializable.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                
                // create data
                Student student = new Student();
                student.setName("stephen lee");
                student.setAge("12");
                student.setId(1);
                
                // bundle
                Bundle bundle = new Bundle();  
                bundle.putSerializable(MainActivity.StudentKey,student);
                
                // intent
                Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
                intent.putExtras(bundle);
                
                // navigate
                startActivity(intent);
            }
        });
使用Serializable

 

c).获取传递的数据

Bundle bundle = this.getIntent().getExtras();
        Student student = (Student)bundle.getSerializable(MainActivity.StudentKey);
        if(student!=null)
            textView.setText("name:" + student.getName() + "age:" + student.getAge() + "id:" + student.getId());
SecondActivity

 

 

二.传递对象集合

a).同上

b).同上(注意使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口)

        Button btnSerializableList = (Button)findViewById(R.id.btnSerializableList);
        btnSerializableList.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                
                // create data
                List<Student> students = new ArrayList<Student>();
                
                Student student1 = new Student();
                student1.setName("hellenism");
                student1.setAge("12");
                student1.setId(1);
                
                Student student2 = new Student();
                student2.setName("stephen lee");
                student2.setAge("12");
                student2.setId(2);
                
                students.add(student1);
                students.add(student2);
                
                // bundle , 注意:使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口
                Bundle bundle = new Bundle();  
                bundle.putSerializable(MainActivity.StudentsKey,(Serializable)students);
                
                // intent
                Intent intent = new Intent(v.getContext(),SecondActivity.class);
                intent.putExtras(bundle);
                
                // navigate
                startActivity(intent);
            }
        });
使用Serializable

 

c).同上(不足之处在于,由于获取数据时候,需要把Serializable强转成为对应的List<>,此处会有警告)

Bundle bundle = this.getIntent().getExtras();
        List<Student> students = (List<Student>)bundle.getSerializable(MainActivity.StudentsKey);
        if(students!=null)
            textView.setText("name:" + students.get(1).getName() + "age:" + students.get(1).getAge() + "id:" + students.get(1).getId());
SecondActivity

 

使用Parcelable


一.传递对象

a).定义类,实现Parcelable接口

public class Person implements Parcelable
{
    // members
    private String name;
    private String age;
    private int id;
    
    // getter setter
    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getAge()
    {
        return age;
    }

    public void setAge(String age)
    {
        this.age = age;
    }

    // Parcelable
    @Override
    public int describeContents()
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags)
    {
        // TODO Auto-generated method stub
        dest.writeString(name);
        dest.writeString(age);
        dest.writeInt(id);
    }
    
    public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {  
        public Person createFromParcel(Parcel source) {  
            Person person = new Person();  
            person.age = source.readString();  
            person.name = source.readString();  
            person.id = source.readInt();  
            return person;  
        }  
        
        public Person[] newArray(int size) {  
            return new Person[size];  
        }  
    };  
}
Parcelable接口

 

b).使用Intent传递参数

// 使用Parcelable
        Button btnParcelable = (Button)findViewById(R.id.btnParcelable);
        btnParcelable.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View arg0)
            {
                // TODO Auto-generated method stub
                
                // create data
                Person person = new Person();
                person.setName("i am person");
                person.setAge("12");
                person.setId(1);
                
                // bundle
                Bundle bundle = new Bundle();  
                bundle.putParcelable(MainActivity.PersonKey,person);
                
                // intent
                Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
                intent.putExtras(bundle);
                
                // navigate
                startActivity(intent);
            }
        });
使用Intent

 

c).获取传递的参数

Bundle bundle = this.getIntent().getExtras();
        Person person = (Person)bundle.getParcelable(MainActivity.PersonKey);
        if(person!=null)
            textView.setText("name:" + person.getName() + "age:" + person.getAge() + "id:" + person.getId());
获取传递的参数

 

二.传递数据类型

a).同上

b).同上

        Button btnParcelableList = (Button)findViewById(R.id.btnParcelableList);
        btnParcelableList.setOnClickListener(new View.OnClickListener()
        {
            
            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                
                // create data
                List<Person> persons = new ArrayList<Person>();
                
                Person person1 = new Person();
                person1.setAge("12");
                person1.setName("stephen lee");
                person1.setId(1);
                
                Person person2 = new Person();
                person2.setAge("12");
                person2.setName("hellenism");
                person2.setId(2);
                
                persons.add(person1);
                persons.add(person2);
                
                // bundle
                Bundle bundle = new Bundle();  
                bundle.putParcelableArrayList(MainActivity.PersonsKey, (ArrayList<? extends Parcelable>) persons);
                
                // intent
                Intent intent = new Intent(v.getContext(),SecondActivity.class);
                intent.putExtras(bundle);
                
                // navigate
                startActivity(intent);
            }
        });
使用Intent传递参数

 

c).同上

Bundle bundle = this.getIntent().getExtras();
        List<Person> persons = bundle.getParcelableArrayList(MainActivity.PersonsKey);
        if(persons!=null)
            textView.setText("name:" + persons.get(1).getName() + "age:" + persons.get(1).getAge() + "id:" + persons.get(1).getId());
获取参数

 

注意:

使用以上方法传递对象时,都是创建了新的实例,而非传递对象的引用,如果是传递引用,也就无需序列化了。

 

完整例子:

http://pan.baidu.com/s/1dDf5p8d