一、簡介
開發過程中,Activity之間傳遞數據是必不可少的,Android中使用Intent和Bundle作爲數據載體,在Activity之間傳遞,對於基礎數據類型,Bundle已經提供了相關的put、set方法,而作爲自定義的類型則需要有特別的要求。
自定義類型,想要使用Bundle傳遞時,需要滿足特定的條件,即該類型需要實現Serializable接口或Parcelable接口。
注:如果目標對象中包含其他對象,則被包含的對象也需要實現Serializable接口或Parcelable接口。
二、代碼實現
我們以Serializable接口爲例:
1、傳遞對象
1)自定義對象,實現Serializable接口
package com.davis.drawtrangle;
import java.io.Serializable;
public class Person implements Serializable{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
}
2)使用Intent傳遞對象
private void clearDrawView(){
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Person person = new Person("admin", 1);
Bundle bundle = new Bundle();
bundle.putSerializable("person", person);
intent.putExtras(bundle);
startActivity(intent);
}
3)獲取傳遞的數據
private void init(){
Person person = (Person)getIntent().getSerializableExtra("person");
Log.i("TAG", "Person name : " + person.getName() + " ---- age : " + person.getAge());
}
2、傳遞對象集合
1)同上。
2)同上。
注:使用putSerializable()方法時,需要把List<>強轉成爲Serializable,並且集合中的成員都需要實現Serializable接口。
private void clearDrawView(){
Intent intent = new Intent(MainActivity.this, MainActivity.class);
List<Person> lists = new ArrayList<Person>();
Person person = new Person("admin", 1);
lists.add(person);
Bundle bundle = new Bundle();
bundle.putSerializable("person", (Serializable) lists);
intent.putExtras(bundle);
startActivity(intent);
}
3)同上。
注:不足之處在於,由於獲取數據時候,需要把Serializable強轉成爲對應的List<>,此處會有警告。
private void init(){
List<Person> lists = (List<Person>)getIntent().getSerializableExtra("person");
for(int i=0;i<lists.size();i++) {
Person person = lists.get(i);
Log.i("TAG", "Person name : " + person.getName() + " ---- age : " + person.getAge());
}
}
三、注意
使用以上方法傳遞對象時,都是創建了新的實例,而非傳遞對象的引用,如果是傳遞引用,也就無需序列化了。