包裹与包裹的区别

时间:2019-12-27 17:03:35

标签: java android

因此,我一直在研究有关活动之间传递数据的方法,发现有以下三种方法:

1)直接来自Intent

2)Parcelable

3)Bundle

ParcelableBundle有什么区别?我们什么时候应该使用它们?

2 个答案:

答案 0 :(得分:0)

bundle是一种特殊的字典,旨在通过意图传递数据。它可以接受原语,字符串,可模仿对象和可序列化对象。 https://developer.android.com/reference/android/os/Bundle

Parceable是android的Java Serializable实现,但速度更快。但是,它需要一些样板代码才能起作用。 https://developer.android.com/reference/android/os/Parcelable

通常,当您需要通过意图传递键值映射时,可以使用bundle。但是,如果您的值不是原语或字符串,则需要传递一个Parceable对象(或效率较低的Serializable对象)。

答案 1 :(得分:0)

  1. Parcelable是要由某些模型类实现的接口。如果类实现Parcelable,则可以从Parcel中序列化和反序列化此类的实例。 Parcelable是Java Serializable接口的有效android类似物。

实现Parcelable的示例:

data class User(val id: Long, val email: String?) : Parcelable {

    constructor(parcel: Parcel) : this(
            parcel.readLong(),
            parcel.readString()) {
    }

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeLong(id)
        dest.writeString(email)
    }

    override fun describeContents(): Int = 0

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

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

在Kotlin中也有@Parcelize注释,在大多数情况下可简化该过程:

@Parcelize
data class User(val id: Long, val email: String?) : Parcelable
  1. Bundle是一个容器,用于存放android(包括Parcelable)标准类型的命名值,用于在活动,片段和其他android应用程序实体之间传递数据。

    val user = User(1L, "email@email.email")
    val bundle = Bundle().apply {
        putLong("userId", user.id)
        putString("userEmail", user.email)
        putParcelable("user", user)
    }
    
    val userId = bundle.getLong("userId")
    val userEmail = bundle.getString("userEmail")
    val user1: User? = bundle.getParcelable("user")