简介
在 Android 开发中,我们经常需要在不同的组件之间传递数据,比如在 Activity 之间传递数据、在 Service 和 Activity 之间传递数据等。为了实现数据的传递,Android 提供了两种常用的方式,一种是使用 Intent,另一种是使用 Parcelable。在这里,我们将重点介绍 Parcelable 的使用。
Parcelable 是 Android 中用于序列化和反序列化 Java 对象的接口,它比 Java 中的 Serializable 接口更高效,因为它只序列化对象中的关键数据而不包含对象的完整状态。使用 Parcelable 接口可以减少对象序列化和反序列化的时间和开销,提高应用程序的性能。
Parcelable 代码示例
下面是一个使用 Parcelable 接口实现数据传递的示例代码:
首先定义一个 Student 类,实现 Parcelable 接口:
public class Student implements Parcelable {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
protected Student(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@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 int getAge() {
return age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
}
在上面的代码中,我们定义了一个 Student 类,包含 name 和 age 两个属性。然后,我们实现了 Parcelable 接口,重写了 describeContents() 方法和 writeToParcel() 方法。在 writeToParcel() 方法中,我们将 name 和 age 属性写入 Parcel 对象中。在 Student 类中,我们还实现了一个 CREATOR 对象,用于反序列化 Parcelable 对象。
下面是在 Activity 中使用 Parcelable 传递数据的示例代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Student student = new Student("Tom", 18);
Log.d(TAG, "Student: " + student.getName() + ", " + student.getAge());
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("student", student);
startActivity(intent);
}
}
在上面的代码中,我们创建了一个 Student 对象,然后将其作为参数传递给 Intent 对象的 putExtra() 方法。然后,我们启动了一个新的 Activity,将 Intent 对象传递给该 Activity。
下面是接收 Parcelable 数据的代码:
public class SecondActivity extends AppCompatActivity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Student student = getIntent().getParcelableExtra("student");
Log.d(TAG, "Student: " + student.getName() + ", " + student.getAge());
}
}
在上面的代码中,我们使用 getIntent().getParcelableExtra() 方法获取传递过来的 Parcelable 对象,并将其转换为 Student 对象。
总的来说,Parcelable 接口是 Android 中传递数据的一种高效的方式,相比 Serializable 接口具有更好的性能。使用 Parcelable 接口可以减少对象序列化和反序列化的时间和开销,提高应用程序的性能。
Parcelable 为什么比 Serializable 高效
Parcelable 和 Serializable 都是 Java 中的序列化接口。Serializable 是 Java 标准库中的一个接口,而 Parcelable 是 Android 框架中的一个接口。
Parcelable 接口是为了解决在 Android 应用程序中序列化和反序列化对象时的效率问题而设计的。相比之下,Serializable 接口是一种通用的 Java 序列化接口,它不仅可以在 Android 中使用,还可以在其他 Java 应用程序中使用。
下面是 Parcelable 的原理和为什么它比 Serializable 更高效的详细说明:
Parcelable 的原理
Parcelable 接口的原理是将数据打包成一个 Parcel 对象进行传输。然后,将 Parcel 对象传输到另一个进程或组件,该进程或组件可以使用 Parcel 对象中的数据来创建一个新的对象。
Parcel 类是 Android 框架中的一个类,提供了一种快速序列化和反序列化数据的方式。Parcelable 接口的实现需要实现两个方法:writeToParcel() 和 describeContents()。
writeToParcel() 方法将对象的数据写入到一个 Parcel 中,而 describeContents() 方法返回一个标志位,表示该对象的特殊对象类型。
Parcelable 接口的实现需要实现以下步骤:
- 在类的构造函数中读取 Parcelable 的数据;
- 实现 writeToParcel() 方法,将类的数据写入到 Parcel 中;
- 实现 CREATOR 对象,用于反序列化 Parcelable 对象。
实现 Parcelable 接口后,我们可以使用 Intent 或 Bundle 将 Parcelable 对象传递到另一个组件,然后在该组件中使用 getIntent().getParcelableExtra() 方法获取 Parcelable 对象。
Parcelable 比 Serializable 更高效的原因
Parcelable 接口比 Serializable 更高效的原因有以下几点:
- Parcelable 是为 Android 应用程序设计的,因此它在设计上更加优化,可以更好地适应 Android 系统的特殊需求。
- Parcelable 序列化和反序列化的速度更快,因为它只序列化对象中的关键数据而不包含对象的完整状态,而 Serializable 序列化和反序列化的过程需要多次经过 IO 操作,因此速度较慢。
- Parcelable 创建的临时对象较少,因此它占用的内存较少,可以减轻垃圾回收的负担,提高性能。
- Parcelable 可以更好地控制传输的对象,因为它可以选择只传输对象的部分数据而不是全部数据,因此可以更加高效地传输数据。
总之,Parcelable 比 Serializable 更高效,因为它是为 Android 应用程序设计的,速度更快,占用内存更少,并且可以更好地控制传输的数据。因此,在 Android 应用程序中,建议使用 Parcelable 来序列化和反序列化对象,以获得更好的性能和更高的效率。