因此,我一直在研究有关活动之间传递数据的方法,发现有以下三种方法:
1)直接来自Intent
2)Parcelable
3)Bundle
Parcelable
和Bundle
有什么区别?我们什么时候应该使用它们?
答案 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)
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
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")