Android NDK开发详解后台任务之Parcelable 实现生成器
kotlin-parcelize 插件提供了一个 Parcelable 实现生成器。
如需添加对 Parcelable 的支持,请将 Gradle 插件添加到应用的 build.gradle 文件中:
Groovy
plugins {
id 'kotlin-parcelize'
}
Kotlin
plugins {
id("kotlin-parcelize")
}
当您使用 @Parcelize 为类添加注解时,系统会自动生成一个 Parcelable 实现,如以下示例所示:
import kotlinx.parcelize.Parcelize
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable
@Parcelize 要求在主要构造函数中声明所有序列化属性。该插件会针对每个属性发出警告,并在类正文中声明一个后备字段。此外,如果主要构造函数的某些参数不是属性,则不能应用 @Parcelize。
如果您的类需要更高级的序列化逻辑,请将其写在某个伴随类中:
@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
private companion object : Parceler<User> {
override fun User.write(parcel: Parcel, flags: Int) {
// Custom write implementation
}
override fun create(parcel: Parcel): User {
// Custom read implementation
}
}
}
支持的类型
@Parcelize 支持多种类型:
基元类型(及其 boxed 版本)
对象和枚举
String、CharSequence
Exception
Size、SizeF、Bundle、IBinder、IInterface、FileDescriptor
SparseArray、SparseIntArray、SparseLongArray、SparseBooleanArray
所有 Serializable(包括 Date)和 Parcelable 实现
所有受支持类型的集合:List(映射到 ArrayList)、Set(映射到 LinkedHashSet)、Map(映射到 LinkedHashMap)
此外,还有一些具体实现:ArrayList、LinkedList、SortedSet、NavigableSet、HashSet、LinkedHashSet、TreeSet、SortedMap、NavigableMap、HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap
所有受支持类型的数组
所有受支持类型的可为 null 版本
自定义 Parceler
如果系统不能直接支持您的类型,您可以为其写一个 Parceler 映射对象。
class ExternalClass(val value: Int)
object ExternalClassParceler : Parceler<ExternalClass> {
override fun create(parcel: Parcel) = ExternalClass(parcel.readInt())
override fun ExternalClass.write(parcel: Parcel, flags: Int) {
parcel.writeInt(value)
}
}
您可以使用 @TypeParceler 或 @WriteWith 注解来应用外部 Parceler:
// Class-local parceler
@Parcelize
@TypeParceler<ExternalClass, ExternalClassParceler>()
class MyClass(val external: ExternalClass) : Parcelable
// Property-local parceler
@Parcelize
class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) : Parcelable
// Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass) : Parcelable
反馈
如果您在使用 kotlin-parcelize Gradle 插件时遇到任何问题,可以提交 bug。