Intent通信方式(一):携带基础数据类型:
Intent对象可以使用putExtras()方法传递基本类型数据,因为方式差不多,所以我就简单地撸了几行,用法参数都差不多,第一个参数是名字(即Key),第二个参数是值(即Value),可以联想Map的映射去记忆。
下面开始撸码:这里也可以使用链式调用,不用讲究顺序
第一个activity中传递数据时:
intent.putExtra("name","秃头小郑")
.putExtra("age",20);
跳转到的activity接受到数据时:
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0);
Log.e("MainActivity2", "我是 "+ name + ", " + age + " 岁了。" );
上面获取age时传入的第二个参数是个当获取不到”age“时传回来的默认值,这里随便写个0就行
然后我们跑一下程序:
这样我们就接收到从该activity传回来的数据了
二. Intent传递Bundle类型:
Bundle类只是一个对数据进行包装的类,有很多的putXXXX方法,这里不详细讲解
第一个activity中的代码:
Bundle bundle = new Bundle();
bundle.putString("name","秃头小郑");
bundle.putInt("age",20);
intent.putExtras(bundle);
第二个activity的代码:
声明:在activity接收到的Bundle时会自动进行拆装
因此代码与第一个获取数据时是一模一样的
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",0);
Log.e("MainActivity2", "我是 "+ name + ", " + age + " 岁了。" );
上面的用法只能传递基本数据类型,不能传递对象,那么再来讲下Intent的高阶用法,传递对象参数。
三.高阶用法之----传递Serialzable对象
intent里面有个方法去传递Serialzable对象:
操作如下:只需要传递的对象去实现Serialzable接口就可以传递了
代码如下:
public class Worker 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;
}
}
行了,现在可以开始传递了,
第一个activity:
Worker worker = new Worker();
worker.setName("秃头小郑");
worker.setAge(20);
intent.putExtra("worker",worker);
第二个activity:
Worker worker = (Worker) intent.getSerializableExtra("worker");
String name = worker.getName();
int age = worker.getAge();
Log.e("MainActivity2", "我是 "+ name + ", " + age + " 岁了。" );
声明一点,这里一定要强制转换类型,因为源码接收的不是泛型,不会自动转成相应的对象
跳转后运行结果:
三.Intent高阶用法之:传递Parcelable对象
这个用法相对比较复杂,底层有涉及到C语言指针问题,是个坑
用法:依旧是使用的对象类去实现Parcelable接口,但略有不同,因为重新了几个Parcelable需要用到的抽象方法,话不多说直接开撸:
public class Student implements Parcelable {
public Student(){}
public String name;
public int age;
//TODO 注意: 读的顺序要和写的顺序一直,否则会报错,因为写的操作的API是由C语言的指针写的,所以可能读取到的长度不一致
//从Parcel对象中获取相关的数据,该方法是在跳转到的活动里被调用,即跳转后的页面获取数据时调用
public Student(Parcel in) {
name = in.readString();
age = in.readInt();
}
//系统为了扩展一些功能用的,这里不理它
@Override
public int describeContents() {
return 0;
}
//从跳转前的活动写数据到Parcel的对象中,方便读的时候获取,读写顺序要一致,强调!!否则报错
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
//CREATOR一定要有,系统自动生成,不需要我们改写
public static final Creator<Student> CREATOR = new Creator<Student>() {
//创建Student对象 并且在Parcel构建好后传递给Student对象,这样成员数据就可以从Parcel中获取了
@Override
public Student createFromParcel(Parcel in) {
return new Student(in);
}
//辅助方法用不到,直接这么写就好
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
}
各种方法的用法我都写在注释里了,各位直接看代码就行。
现在终于可以开始使用了.
第一个活动:
Student student = new Student();
student.name = "秃头小郑";
student.age = 20;
第二个活动:
Student student = intent.getParcelableExtra("student");
String name = student.name;
int age = student.age;
Log.e("MainActivity2", "我是 "+ name + ", " + age + " 岁了。" );
这里与Serialzble对象的区别就是不用强制转成Student类,因为源码接收的是泛型。
跳转后运行结果: