Parcelable 在 android Intent中的使用

67 阅读1分钟

在同一个应用内通过 Parcelable 传递自定义类是效率比 Serializable 高。Parcelable 是 Android 专门为在进程间高效传递数据设计的接口。以下是实现步骤:

1. 实现 Parcelable 接口

你需要让你的自定义类实现 Parcelable 接口,并实现其必需的方法。最重要的几个步骤是:

  • 实现 writeToParcel() 方法,将对象数据写入 Parcel
  • 提供一个 CREATOR 静态字段,负责从 Parcel 中恢复对象。

2. 示例代码

假设我们有一个自定义类 Person,包括 nameage 属性。

Step 1: 实现 Parcelable 接口

import android.os.Parcel
import android.os.Parcelable

data class Person(
    val name: String?,
    val age: Int
) : Parcelable {

    // 将对象中的数据写入Parcel中
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
    }

    // 返回一个特殊的标记值
    override fun describeContents(): Int {
        return 0
    }

    // 构造函数,用于从Parcel中读取数据并重建对象
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readInt()
    )

    // CREATOR对象,用于从Parcel中创建对象
    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}

Step 2: 通过 Intent 传递 Person 对象

// 发送端
val person = Person("Alice", 25)
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra("person", person)
startActivity(intent)

Step 3: 在接收端获取 Person 对象

// 接收端
val person = intent.getParcelableExtra<Person>("person")
person?.let {
    // 处理Person对象
    println("Name: ${it.name}, Age: ${it.age}")
}

3. 注意事项

  • 确保在 writeToParcel() 方法中,将所有需要传递的字段正确写入 Parcel
  • 使用 getParcelableExtra() 来获取 Parcelable 对象。

这样,你就可以在同一应用内通过 Intent 传递自定义 Parcelable 类了。