Intent是Activity与Activity之间,Activity与Service之间传递参数的介质,使用Intent和Bundle在组件之间传递数据,而这两种通常实现的是Java基本对象类型和String的传递。
在实际项目中,页面之间传值,除了以上几种,经常还有传递Object对象、List类型、List类型和全局变量等等的需求。
由于Activity跳转有两种方式,为此进行数据传递一共有两种方式:隐式跳转传递数据,显示跳转传递数据。
隐式跳转传递数据
由于隐式跳转的时候,是可以通过data进行传递数据的。为此,通过案例来说明隐式跳转如何传递数据。
案例1:
由于我们实现Activity从A跳转B的时候,在A中使用data进行传递数据的,那么我们在B中通过getData就可以得到里面传递过来的数据了。
AActivity
public void click(View v){
Intent intent = new Intent();
//指定要跳转到TwoActivity
intent.setClass(this, TwoActivity.class);
//设置要跳转匹配的Action
intent.setAction("a.b.c");
//设置要跳转匹配的Data 和 mimeType
intent.setDataAndType(Uri.parse("exaple:123"), "text/name");
//启动Activity
startActivity(intent);
}
BActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
//获取由上一个Activity传递过来的Intent对象
Intent intent = getIntent();
//获取这个Intent对象的Data数据
Uri data = intent.getData();
//将数据转换为字符串 并通过Log进行输出
Log.i("TwoActivity", data.toString());
}
显式跳转传递数据
Activity跳转时,可以把数据封装在intent对象中。
intent中可以封装的数据类型:八大基本数据类型和字符串及它们的数组,还有实现了序列化接口的对象,还有bundle对象
数据也可以先封装至Bundle,再把Bundle封装至intent
案例1: 八大基本数据类型和字符串及它们的数组
传递数据
//跳转到SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
//把数据封装至intent中
intent.putExtra("maleName", maleName);
intent.putExtra("femaleName", femaleName);
//启动Activity
startActivity(intent);
获取数据
//获取由上一个Activity传递过来的Intent对象
Intent intent = getIntent();
// 获取这个Intent对象的Extra中对应键的值
String maleName = intent.getStringExtra("maleName");
String femaleName = intent.getStringExtra("femaleName");
案例2:传递对象
Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象。要求被传递的对象必须实现上述2种接口中的一种才能通过Intent直接传递。
Intent中传递这2种对象的方法:
Bundle.putSerializable(Key,Object); //实现Serializable接口的对象
Bundle.putParcelable(Key, Object); //实现Parcelable接口的对象
以下以最常用的Serializable方式为例 :
传递的对象为注册的用户信息 Person类
定义一个Person类 并实现Serializable即可即可
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; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person(){ } }
2 传递Person对象
public void one(View v){
Intent intent = new Intent(MainActivity.this, TwoActivity.class);
intent.putExtra("Person", new Person("zhangsan", 18));
startActivity(intent);
}
3.获取Person对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
Intent intent = getIntent();
Person person = (Person)intent.getSerializableExtra("Person");
Log.i("TwoActivity", person.getName());
Log.i("TwoActivity", person.getAge()+"");
}
以下以最常用的Parcelable方式为例 :
传递的对象为动物信息 Animal类
1. 定义一个Animal类 并实现Parcelable即可 并重写方法
public class Animal implements Parcelable{
private String color;
private int weight;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Animal(String color, int weight) {
super();
this.color = color;
this.weight = weight;
}
public Animal(){
}
@Override
public int describeContents() {
//这里使用默认即可
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//这里 方法名称为参数的类型 方法参数是 属性
dest.writeString(color);
dest.writeInt(weight);
}
//定义一个Parcelable.Creator<T> 类型的变量 并使用匿名内部类实现其对象
public static final Parcelable.Creator<Animal> CREATOR = new Parcelable.Creator<Animal>() {
@Override
public Animal createFromParcel(Parcel source) {
//定义Animal类对象 并给其赋值
Animal anim = new Animal();
//从Parcel中获取值并赋给属性
anim.color = source.readString();
anim.weight = source.readInt();
//将对象返回
return anim;
}
@Override
public Animal[] newArray(int size) {
//将参数size作为数组的大小 并返回
return new Animal[size];
}
};
}
2.传递Animal对象
public void two(View v){
Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
intent.putExtra("Animal", new Animal("hongse", 20));
startActivity(intent);
}
3 获取Animal对象
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_three);
Intent intent = getIntent();
Animal anim = (Animal)intent.getParcelableExtra("Animal");
Log.i("ThreeActivity", anim.getColor());
Log.i("ThreeActivity", anim.getWeight()+"");
}
案例3:传递Bundle
先封装至Bundle,再把Bundle封装至intent
传递Bundle
//跳转到SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
//Bundle中也可以用键值对封装数据,封装类型与intent一致
Bundle extras = new Bundle();
extras.putString("maleName", maleName);
extras.putString("femaleName", femaleName);
//将Bundle封装至intent中
intent.putExtras(extras);
//启动Activity
startActivity(intent);
获取Bundle
Intent intent = getIntent();
String maleName = intent.getStringExtra("maleName");
String femaleName = intent.getStringExtra("femaleName");