方式一:通过实现Serializable接口传递对象
用一个小的Demo去理解,通过实现Serializable接口传递对象。
效果图:
具体讲解在代码注释中已经写出
先创建一个对象:
package com.example.daydemo.bean;
import java.io.Serializable;
//必须实现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;
}
}
第一个界面MainActivity代码如下:
package com.example.daydemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.daydemo.bean.Person;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this,MainActivity2.class);
Person person = new Person();
person.setName("Android");
person.setAge(30);
intent.putExtra("person",person);
startActivity(intent);
}
}
第二个界面MainActivity2,接收MainActivity传递过来的对象,代码如下:
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//接收MainActivity传过来的对象
Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");
Toast.makeText(this, "姓名:"+person.getName()
+" 年龄:"+person.getAge()
, Toast.LENGTH_SHORT).show();
}
}
方式二:通过实现Parcelable接口传递对象
第一步依然是创建一个对象:
package com.example.daydemo.bean;
import android.os.Parcel;
import android.os.Parcelable;
//此对象实现Parcelable接口,就具备传递的资格
public class Student implements Parcelable {
//自定义成员变量
private String name;
private int age;
public Student() {
}
//TODO 注意:读取,和写入的顺序,必须一致,否则会报错
//从Parcel对象中读取出来,赋值给name,age
public Student(Parcel in) {
name = in.readString();
age = in.readInt();
}
//把属性写入到Parcel对象里面去
//将当前对象的属性数据打成包:写到包对象
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
//系统扩展用的,忽略
@Override
public int describeContents() {
return 0;
}
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];
}
};
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;
}
}
接下来的步骤跟方式一是一样的
FirstActivity代码如下:
public class FirstActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
btn=findViewById(R.id.btn);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(this,SecondActivity.class);
Student student = new Student();
student.setName("程序员");
student.setAge(18);
intent.putExtra("student",student);
startActivity(intent);
}
}
第二个页面SeconActivity代码如下:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = getIntent();
Student student = intent.getParcelableExtra("student");
Toast.makeText(this, "姓名:"+student.getName()
+" 年龄:"+student.getAge(), Toast.LENGTH_SHORT).show();
}
}
效果跟方式一是一样的,就不再放图了。
这两种方式推荐使用Parcelable接口,传递对象。
因为这个是支持,兼容安卓虚拟机的,比Serializable性能高很多。
如果是JVM平台,做Java开发,可以选择使用这个方式Serializable。