ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-25 16:33:25  阅读:266  来源: 互联网

标签:val Kotlin musictitle Bundle intent music Android 序列化 class


一:序列化原因

  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接口

标签:val,Kotlin,musictitle,Bundle,intent,music,Android,序列化,class
来源: https://blog.csdn.net/qq_38304672/article/details/113059453

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有