传递单个简单类型的情况:
Main.activity
Pass value:
Intent intent = newIntent(MainActivity.this,SecondActivity.class);
intent.putExtra("Main","123");
startActivityForResult(intent, 0);
Get value from other activity
@Override
protectedvoid onActivityResult(int requestCode,int resultCode, Intent data) {
if (resultCode ==RESULT_OK)
{
Log.d("debug","result=" + data.getStringExtra("second"));
}
super.onActivityResult(requestCode, resultCode, data);
}
Get value:
Intent intent = getIntent();
final String num = intent.getStringExtra("Main");
Then pass value to main activity
Intent intent = newIntent();
intent.putExtra("second","This is Second Activity's value!");
setResult(RESULT_OK, intent);
finish();
传递多个简单类型的情况:
使用 Bundle打包的方式:
Pass value:
Home Activity:
Bundle bundle = new Bundle();
*字符、字符串、布尔、字节数组、浮点数等等,都可以传*/
bundle.putString("Name", "feng88724");
bundle.putBoolean("Ismale", true);
/*把bundle对象assign给Intent*/
intent.putExtras(bundle);
Get value:
Away Activity:
/*获取Intent中的Bundle对象*/
Bundle bundle = this.getIntent().getExtras();
*获取Bundle中的数据,注意类型和key*/
String name = bundle.getString("Name");
boolean ismale = bundle.getBoolean("Ismale");
传对象
有三种常用方法:
Serializable 方式
这是最简单的一种方法,因为我们要做的就是让我们自定义的对象实现 Serializable
这个空接口。
public class Person implements Serializable{
private String mName;
private String mAddress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAddress() {
return mAddress;
}
public void setAddress(String address) {
mAddress = address;
}
}
构造了实现Serializable接口的对象模型之后,就借助Intent的putExtra方法将创建的Person对象传递出去
Person person = new Person();
person.setName("Hwaphon");
person.setAddress("Anhui");
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",person);
startActivity(intent);
finish();
接收数据的方法与上面使用Bundle类的类似:
Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");
使用Serializable
方法虽然十分简单,但是效率却不容乐观,因为它会把整个对象序列化,开销十分大,为了追求效率,我们不得不使用另一种方法,也就是Parcelable
方法。
Parcelable 方式
自定义类实现Parcelable
接口,必须重写两个方法
1.describeContents()
: 用于描述内容接口,一般直接 return 0
即可
2.writeToParcel()
: 用于将想要传递的数据写入到Parcel
容器中。
除了这两个方法以外,我们还需要创建一个 Parcelable.Creator
接口的实现,这个接口中也需要我们实现两个方法
1.createFromParcel()
: 用于将写入Parcel
容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。
2.newArray()
:创建一个长度为 size
的数组并且返回,一般而言,直接返回return T[size]
即可。
public class Person implements Parcelable{
private String mName;
private String mAddress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAddress() {
return mAddress;
}
public void setAddress(String address) {
mAddress = address;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mName);
parcel.writeString(mAddress);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
@Override
public Person createFromParcel(Parcel parcel) {
Person person = new Person();
person.mName = parcel.readString();
person.mAddess = parcel.readString();
return person;
}
@Override
public Person[] newArray(int i) {
return new Person[i];
}
};
}
接收数据对象的方法稍有不同
Intent intent = getIntent();
Person person = (Person) intent.getParcelableExtra("person");
writeToParcel()
方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是
Parcelabel
方法比
Serializable
方法高效的原因所在。
Serializable
接口实现代码多,可以使用插件一键生成这些代码,比如说
Android Parcelable code generator
插件,可以直接在
Android Studio Plugins
去下载该插件,下载完之后 点击
Alt+Insert
就可以看到
Parcelable
选项
JSON 方式
public class Person{
private String mName;
private String mAdress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAdress() {
return mAdress;
}
public void setAdress(String adress) {
mAdress = adress;
}
}
传递数据的方式:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",new Gson().toJson(person));
接收数据的方式:
Intent intent = getIntent();
String JsonData = intent.getStringExtra("person");
Person person = new Gson().fromJson(JsonData,Person.class);