【Android-Kotlin】Intent-序列化-Bundle

一:序列化原因

  1. Intent传递的数据类型有限,除一般的数据类型外,例如对象,队列都是无法传输的。所以需要序列化(Serializable和Parcelable)

二:Serializable(方式一)序列化整个对象,代码短但效率较低

  1. 建立一个类,实现Serializable接口
class Music(var musicid:Int?=null,var musictitle: String? = null) : Serializable{
    
    
}
  1. 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)
    }
}
  1. 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接口

  1. 实现两个方法,提供一个CREATOR 常量
  2. 实际上把原Serializable接口给去掉改为Parcelable接口,然后导入就行
  3. 字符串型数据就调用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 music=Music(1, "回梦游仙")
        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

  1. 原理就将多个东西打包,先封在Bundle,再将其用intent传递
        //使用Bundle
        val bundle = Bundle()
        val intent = Intent(this@MainActivity, JumpActivity::class.java)
        //设置数据
        //设置数据
        val id = 3
        val musictitle = "夏鱼"
        //把数据保存到Bundle里
        //把数据保存到Bundle里
        bundle.putInt("musicid", id)
        bundle.putString("musictitle", musictitle)
        //把bundle放入intent里
        //把bundle放入intent里
        intent.putExtra("Message", bundle)
        startActivity(intent)
  1. 取出来
        val bundle = intent.getBundleExtra("Message")
        //获取数据
        //获取数据
        val id = bundle!!.getInt("musicid")
        val musictitle = bundle!!.getString("musictitle")

        Log.e(TAG, "${
      
      id}+${
      
      musictitle}")

在这里插入图片描述

1. 序列化此处引用

  1. 若put时未加 标识且只有一个Bundle,get时也可以不加。
    在这里插入图片描述
    在这里插入图片描述

2. 这里补充新的方式实现Parcelable接口

猜你喜欢

转载自blog.csdn.net/qq_38304672/article/details/113059453