本文最后更新于 2015年8月27日 下午
####使用Intent传递对象
Intent可以用来启动活动、发送广播、启动服务等,也可以在Intent中添加一个附加数据。
在FirtActivity中添加如下代码:
1 2 3 4
| Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("string_data", "hello"); intent.putExtra("int_data", 100); startActivity(intent);
|
这里调用了Intent的putExtra()方法添加要传递的数据,之后再SecondActivity中就可以得到这些值
1 2
| getIntent.getStringExtra("string_data); getIntent.getStringExtra("int_data", 0);
|
#####传递的类型是有限的,可以用两种来实现,Serializable和Parcelable
1、Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。之于序列化的方法也很简单,只需让一个类是实现Serializable这个接口就可以了.
一个Person类,包含name和age两个字段,要将其序列化,可以这么写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Person implements Serializable { private String name; private int age;
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; } }
|
接下来在FirstActivity中的写法很简单:
1 2 3 4 5 6
| Person person = new Person(); person.setName("Tom"); person.setAge(20); Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("person_data", person); startActivity(intent);
|
创建一个Person的实例,然后就直接把它传入到putExtra()方法中。接下来获取这个对象也很简单:
1
| Person person = (Person)getIntent().getSerializable("person_data")
|
2、Parcelable方式,不同上面的方法,Parcelable实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
修改Person中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class Person implements Parcelable { private String name; private int age;
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; }
@Override public int describeContents() { return 0; }
@Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); }
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){ @Override public Person createFromParcel(Parcel source) { Person person = new Person(); person.name = source.readString(); person.age = source.readInt(); return person; }
@Override public Person[] newArray(int size) { return new Person[size]; } }; }
|
接下来在FirstActivity中我们仍然可以使用相同的代码来传递Person对象,在SecondActivity中获取对象的时候需要修改:
1
| Person person = (Person)getIntent().getParcelableExtra("person_data")
|
以上
#####Serializable因为要把整个对象序列化,效率方面会比Parcelable方式低一点。