一:序列化原因
- Intent传递的数据类型有限,除一般的数据类型外,例如对象,队列都是无法传输的。所以需要序列化(Serializable和Parcelable)
二:Serializable(方式一)序列化整个对象,代码短但效率较低
- 建立一个类,实现Serializable接口
class Music(var musicid:Int?=null,var musictitle: String? = null) : Serializable{
}
- MainAC
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var music=Music(1, "回梦游仙")
val intent = Intent(this@MainActivity, JumpActivity::class.java)
intent.putExtra("musicbean", music)
startActivity(intent)
}
}
- JumpAC
class JumpActivity : AppCompatActivity() {
val TAG="JumpActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_jump)
var music=intent.getSerializableExtra("musicbean") as Music?
if (music != null) {
music.musictitle?.let {
Log.e(TAG, it)
}
}
}
}
三:Parcelable方式(方式二)代码量大但效率高
1.建立列继承Parcelable接口
- 实现两个方法,提供一个CREATOR 常量
- 实际上把原Serializable接口给去掉改为Parcelable接口,然后导入就行
- 字符串型数据就调用writeString() 方法, 整型数据就调用writeInt() 方法, 以此类推
class MusicParce(var musicid:Int?=null,var musictitle: String? = null) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readValue(Int::class.java.classLoader) as? Int,
parcel.readString()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeValue(musicid)
parcel.writeString(musictitle)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<MusicParce> {
override fun createFromParcel(parcel: Parcel): MusicParce {
return MusicParce(parcel)
}
override fun newArray(size: Int): Array<MusicParce?> {
return arrayOfNulls(size)
}
}
}
2.实例化并传递参数
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var musicpl=MusicParce(1, "桃花岛 ")
val intent = Intent(this@MainActivity, JumpActivity::class.java)
intent.putExtra("musicbean", musicpl)
startActivity(intent)
}
}
3. get方式变化
class JumpActivity : AppCompatActivity() {
val TAG="JumpActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_jump)
var music=intent.getParcelableExtra("musicbean") as MusicParce?
if (music != null) {
music.musictitle?.let {
Log.e(TAG, it)
}
}
}
}
四:使用Bundle
- 原理就将多个东西打包,先封在Bundle,再将其用intent传递
val bundle = Bundle()
val intent = Intent(this@MainActivity, JumpActivity::class.java)
val id = 3
val musictitle = "夏鱼"
bundle.putInt("musicid", id)
bundle.putString("musictitle", musictitle)
intent.putExtra("Message", bundle)
startActivity(intent)
- 取出来
val bundle = intent.getBundleExtra("Message")
val id = bundle!!.getInt("musicid")
val musictitle = bundle!!.getString("musictitle")
Log.e(TAG, "${
id}+${
musictitle}")
- 若put时未加 标识且只有一个Bundle,get时也可以不加。