Android中Intent中传递对象的方法有两种
1、实现Parcelable接口
2、实现Serializable接口
其中Serializable有完整的序列机制,而Parcelable需要我们手动完成相关功能函数的编写 ,implements Serializable接口的的作用就是给对象打了一个标记,系统会自动将其序列化。
1、Parcelable接口的实现:
MainActivity
package com.example.mac.sendargs;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.startAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i =new Intent(MainActivity.this,TheAty.class);
i.putExtra("user",new User("luka",3,"female"));
startActivity(i);
}
});
}
}
User对象
package com.example.mac.sendargs;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
/**
* Created by mac on 2017/4/1.
*/
public class User implements Parcelable{
private String name;
private int age;
private String sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User(String name, int age, String sex){
this.name=name;
this.age=age;
this.sex=sex;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(getName());
parcel.writeInt(getAge());
parcel.writeString(getSex());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel parcel) {
return new User(parcel.readString(),parcel.readInt(),parcel.readString());
}
@Override
public User[] newArray(int i) {
return new User[i];
}
};
}
SecondActivity
package com.example.mac.sendargs;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class TheAty extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_aty);
tv=(TextView)findViewById(R.id.tv);//用TextView显示值
Intent i =getIntent();
i.getParcelableExtra("user");
tv.setText(String.format("User info(name=%s,age=%d,sex=%s)",user.getName(),user.getAge(),user.getSex()));
}
}
2、Serializable接口的实现:
User对象:
package com.example.mac.sendargs;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
/**
* Created by mac on 2017/4/1.
*/
public class User implements Serializable{
private String name;
private int age;
private String sex;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User(String name, int age, String sex){
this.name=name;
this.age=age;
this.sex=sex;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(getName());
parcel.writeInt(getAge());
parcel.writeString(getSex());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel parcel) {
return new User(parcel.readString(),parcel.readInt(),parcel.readString());
}
@Override
public User[] newArray(int i) {
return new User[i];
}
};
}
SecondActivity
package com.example.mac.sendargs;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class TheAty extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_aty);
tv=(TextView)findViewById(R.id.tv);//用TextView显示值
Intent i =getIntent();
User user = (User) i.getSerializableExtra("user");
tv.setText(String.format("User info(name=%s,age=%d,sex=%s)",user.getName(),user.getAge(),user.getSex()));
}
}
通过两种不同的接口实现acticity之间传递值对象的效果是一样的,程序运行效果如下: