方式一:通过实现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。