记录使用Parcelable进行类序列化的方式(还可以使用Serialize 接口,本文不作介绍),以及如何使用intent传递自定义对象类的数组(ArrayList<Object> )
本文的前提是,使用Kotlin语言进行安卓开发
1.使用@Parcelize 注解自动生成Parcelize 实现
需要添加对Parcelable 的支持,需要将以下的Gradle 插件添加到应用的build.gradle 文件中:
plugins {
id 'kotlin-parcelize'
}
当使用@Parcelize 为类添加注解时,系统就会自动生成一个Parcelable 实现,如下所示
@Parcelize
class PersonInfo(val name:String,val age:Int,val height:Double) : Parcelable {
var name = ""
var age = 0
var height = 0.0
}
使用上述方式,就会自动生成Parcelable 实现,从而完成对PersonInfo 类的序列化。但是使用@parcelize 注解,只会序列化主要构造函数中的所有参数(!!!此处有坑)。如果没有构造函数或者不希望构造函数中的所有参数都被序列化,可以通过实现伴随类来自定义更高级的序列化和反序列化逻辑。如下所示:
@Parcelize
class PersonInfo : Parcelable {
var name = ""
var age = 0
var height = 0.0
override fun toString(): String {
return "姓名:$name 年龄:$age 身高:$height"
}
companion object : Parceler<PersonInfo> {
override fun PersonInfo.write(p0: Parcel, p1: Int) {
p0.writeDouble(height)
p0.writeInt(age)
p0.writeString(name)
}
override fun create(parcel: Parcel): PersonInfo {
var personInfo = PersonInfo()
personInfo.height = parcel.readDouble()
personInfo.age = parcel.readInt()
personInfo.name = parcel.readString().toString()
return personInfo
}
}
}
2.实现Parcelable接口
第二种办法就是不使用注解自动生成Parcelable实现,而是直接实现Parcelable接口,示例代码如下:
class PersonInfo() : Parcelable {
var name = ""
var age = 0
var height = 0.0
constructor(parcel: Parcel) : this() {
name = parcel.readString().toString()
age = parcel.readInt()
height = parcel.readDouble()
}
override fun toString(): String {
return "姓名:$name 年龄:$age 身高:$height"
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(name)
parcel.writeInt(age)
parcel.writeDouble(height)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<PersonInfo> {
override fun createFromParcel(parcel: Parcel): PersonInfo {
return PersonInfo(parcel)
}
override fun newArray(size: Int): Array<PersonInfo?> {
return arrayOfNulls(size)
}
}
}
相对而言,使用注解的方式会更加简介,只需要实现序列化和反序列化的核心逻辑即可。
3. 传递ArrayList<Object>
最后是,在两个Activity 之间传递PersonInfo 列表,即ArrayList<PersonInfo> 。记作从FirstActivity 跳转到SecondActivity 并且传入ArrayList<PersonInfo> 对象。
FirstActivity 相关代码(写数据)如下:
var infoList = ArrayList<PersonInfo>()
var intent = Intent()
intent.setClass(this,SecondActivity::class.java)
intent.putParcelableArrayListExtra("infoList",infoList)
startActivity(intent)
SecondActivity 相关代码(读取数据)如下:
var infoList = intent.getParcelableArrayListExtra<PersonInfo>("infoList") as ArrayList<PersonInfo>
|