一、使用背景:
Intent的一个重要用处就是“传递数据”,它的putExtra()可以在组件间传递常见的数据类型,但是这些数据类型毕竟是有限的,如果我们想将一些数据封装成一个对象进行传递时(传递对象),仅靠putExtra()就无能为力了,所以我们要学习几种Intent传递对象的方法。
二、Intent的putExtra()传递基本数据类型复习:
场景:FirstActivity携带数据要切换到SecondActivity时;
数据发送方-FirstActivity中代码如下:
/*
* 向下一个活动传递参数,利用Intent的putExtra()把信息暂时存储在缓冲中
* putExtra()参数为键值形式:第一个参数是键,第二个参数是值,
*/
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data1","Hello SecondActivity");//传一个String型
intent.putExtra("extra_data2",100);//再传一个int型
startActivity(intent);
数据接收方-SecondActivity中代码如下:
/* SecondActivity来接收传来的参数:
* getStringExtra()接收传来的String型参数
* getIntExtra()接收传来的Int型参数,如果没值时返回0
*/
Intent intent = getIntent();
String string_data = intent.getStringExtra("extra_data1");
String int_data = intent.getIntExtra("extra_data2", 0);
总之,putExtra()发送什么类型,就用对应的getxxxExtra()去接收。
三、使用Intent传递对象--Serializable方式
Serializable方式是Intent传递对象的第一种方式:
1.Serializable为可序列话的意思,表示将一个对象转化为可存储可传输的状态;序列化后的对象可以在
网络上进行传输,也可以存储到本地。
2.使用方法:
①. 让封装数据的类 implements Serializable
②. 调用时利用getSerializableExtra()获取数据;
3.例:(俩活动间传递person对象):
①. 定义实例类Peron,包含姓名、年龄、是否结婚属性
package cpj.com.IntentObject;
import java.io.Serializable;
/**
* Created by cpj on 2016/4/22.
* 定义一个Person类,包含姓名、年龄、是否结婚属性;并生成相应的get与set方法
*/
public class Person implements Serializable{
private String name;
private int age;
private boolean isMarried;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarried() {
return isMarried;
}
public void setIsMarried(boolean isMarried) {
this.isMarried = isMarried;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
②. 定义初始活动FirstActivity,(它要向SecondActivity传递数据)
//Button点击事件注册-跳转到SecondActivity(Serializable方式)
final Button startActivity_BT = (Button) findViewById(R.id.startSecondActivity);
startActivity_BT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取Person对象并赋值
Person person = new Person();
person.setName("Tom");
person.setAge(10);
person.setIsMarried(false);
//用Intent传递对象,并启动第二个活动
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("object_person", person);
startActivity(intent);
}
});
③. 定义目标活动SecondActivity,(它要接收FirstActivity传来的数据)
package cpj.com.IntentObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import cpj.com.cpjtest.R;
/**
* Created by cpj on 2016/4/22.
*/
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
//TextView注册(用于显示接受的数据)
TextView name_TX = (TextView) findViewById(R.id.name_TX);
TextView age_TX = (TextView) findViewById(R.id.age_TX);
TextView isMarried_TX = (TextView) findViewById(R.id.isMarried_TX);
//接收数据
Person person = (Person) getIntent()
.getSerializableExtra("object_person");
//为TextView赋值
name_TX.setText("姓名:" + person.getName());
age_TX.setText("年龄:" + person.getAge());
isMarried_TX.setText("是否结婚:" + person.isMarried());
}
}
四、使用Intent传递对象--Parcelable方式
Intent通过Parcelable方式来传递对象参数
1. Parcelable是通过对一个完整的对象进行分解,而分解的每一部分都是Intent所支持的数据类型,来实现传递对象参数
2.使用方法:
①.让封装数据的类 implements Parcelable
②.重写describeContents()与writeToParcel()方法
③.定义常量CREATOR,并指定泛型
④.在定义常量的过程中重写createFromParcel()与newArray()方法【特别注意字段的写出与读取过程顺序要完全一致】
⑤.调用时利用getParceableExtra()获取数据。
3.例:(俩活动间传递person对象):
①. 定义实例类Perons,包含姓名、年龄、是否结婚属性
package cpj.com.IntentObject;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by cpj on 2016/4/22.
* 定义一个Person类,包含姓名、年龄、是否结婚属性;并生成相应的get与set方法
*/
public class Persons implements Parcelable{
private String name;
private int age;
private boolean isMarried;
/**
* 方法描述:重写Parcelable的describeContents(),返回0即可
* */
@Override
public int describeContents() {
return 0;
}
/**
* 方法描述:重写writeToParcel(),通过调用Parcel的writeXxx()方法将类中的字段一一写出
* */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);//写出name字段
dest.writeInt(age);//写出age字段
//因为没有直接的writeBoolean,所以用Byte到达效果(isMarried == true,byte == 1)
dest.writeByte((byte) (isMarried ? 1 : 0));
}
/**
* 定义常量CREATOR
* */
public static final Parcelable.Creator<Persons> CREATOR =
new Parcelable.Creator<Persons>(){
/**
* 方法描述:读取上面写入的字段(读取顺序必须与写入顺序完全相同),并返回一个对象
*
* @return {Object} 封装好字段的对象
* */
@Override
public Persons createFromParcel(Parcel source) {
Persons person = new Persons();
person.name = source.readString();//读取name字段
person.age = source.readInt();//读取age字段
person.isMarried = source.readByte() != 0;//如果byte != 0,isMarried==true
return person;
}
@Override
public Persons[] newArray(int size){
return new Persons[size];
}
};
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMarried() {
return isMarried;
}
public void setIsMarried(boolean isMarried) {
this.isMarried = isMarried;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
②. 定义初始活动FirstActivity,(它要向目标活动ThirdActivity,传递数据)
//Button点击事件注册-跳转到ThirdActivity(Parcelable方式)
final Button startActivity2_BT = (Button) findViewById(R.id.startSecondActivity2);
startActivity2_BT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取Person对象并赋值
Persons person = new Persons();
person.setName("Bob");
person.setAge(15);
person.setIsMarried(false);
//用Intent传递对象,并启动第二个活动
Intent intent = new Intent(FirstActivity.this, ThirdActivity.class);
intent.putExtra("object_person2", person);
startActivity(intent);
}
});
③. 定义目标活动ThirdActivity,(它要接收FirstActivity传来的数据)
package cpj.com.IntentObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import cpj.com.cpjtest.R;
/**
* Created by cpj on 2016/4/22.
*/
public class ThirdActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
//TextView注册(用于显示接受的数据)
TextView name_TX = (TextView) findViewById(R.id.name_TX);
TextView age_TX = (TextView) findViewById(R.id.age_TX);
TextView isMarried_TX = (TextView) findViewById(R.id.isMarried_TX);
//接收数据
Persons person = (Persons) getIntent()
.getParcelableExtra("object_person2");
//为TextView赋值
name_TX.setText("姓名:" + person.getName());
age_TX.setText("年龄:" + person.getAge());
isMarried_TX.setText("是否结婚:" + person.isMarried());
}
}
五、Serializable方式与Parcelable方式的比较:
1.Serializable方式比较简单,Parcelable方式比较麻烦;
2.但是由于Serializable方式需要把整个对象都进行序列化,因此效率方面会比Parcelable方式低一些;
3.所以,在通常情况下还是更加推存使用Parcelable的方式来实现Intent传递对象的功能。
六、图:
1.FirstActivity
2.SecondActivity
3.ThirdActivity