最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android通過Intent傳遞自定義對象的兩種方式

 更新時間:2025年07月21日 08:30:33   作者:雨白  
我們經(jīng)常會使用Intent來啟動Activity、發(fā)送廣播等,在進行上述操作的過程中,我們還可以往Intent對象中添加額外的數(shù)據(jù),但問題在于putExtra可傳遞的數(shù)據(jù)類型是有限的,如果你想傳遞自定義對象,就行不通了,所以接下來就來學(xué)習(xí)如何通過Intent傳遞自定義對象

前言

我們經(jīng)常會使用 Intent 來啟動 Activity、發(fā)送廣播等。在進行上述操作的過程中,我們還可以往 Intent 對象中添加額外的數(shù)據(jù),比如:

// MainActivity.kt
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra("name", "Martin")
intent.putExtra("age", 21)
startActivity(intent)

以此來完成數(shù)據(jù)的傳遞:

// AnotherActivity.kt
val name = intent.getStringExtra("name") ?: "Unknown Name"
val age = intent.getIntExtra("age", -1)

但問題在于 putExtra 可傳遞的數(shù)據(jù)類型是有限的,如果你想傳遞自定義對象,就行不通了。但請別擔(dān)心,我們接下來就來學(xué)習(xí)如何通過 Intent 傳遞自定義對象。

方式一:Serializable

Serializable 翻譯過來是序列化的意思,表示將一個對象轉(zhuǎn)換為可存儲或可傳輸?shù)臓顟B(tài),序列化后的對象可被存儲到本地,也可在網(wǎng)絡(luò)上進行傳輸。

序列化一個類,其實非常簡單,只需讓這個類實現(xiàn) Serializable 接口即可。例如:

class Person : Serializable {
    var name = ""
    var age = 0
}

這樣,所有的 Person 對象都是可序列化的了?,F(xiàn)在,我們想要傳遞一個 Person 對象,只需這樣:

val person = Person()
person.name = "Jack"
person.age = 21
val intent = Intent(this, AnotherActivity::class.java)
intent.putExtra("person", person)
startActivity(intent)

那么,該怎么從 Intent 中取出這個 Person 對象呢?

答案是使用 getSerializableExtra() 方法獲取序列化對象,再向下轉(zhuǎn)型為 Person 對象即可。

// val person_from_intent: Person = intent.getSerializableExtra("person") as Person

不過,這個方法已經(jīng)被廢棄了。原因在于它不能保證類型安全,如果獲取到的不是 Person 類型的對象,又或是鍵名拼寫錯誤導(dǎo)致返回 null,那么在運行時,as 強制類型轉(zhuǎn)換可能會失敗并導(dǎo)致程序崩潰。

所以,現(xiàn)在我們會使用更安全的重載方法 getSerializableExtra(String, Class<T>)。這個方法是在 Android 13 (API 33) 引入的,為了兼容所有版本,我們需要這樣寫:

val person: Person? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    intent.getSerializableExtra("person", Person::class.java)
} else {
    // 使用 as? 安全轉(zhuǎn)型來避免崩潰
    @Suppress("DEPRECATION")
    intent.getSerializableExtra("person") as? Person
}

這樣,我們就成功實現(xiàn)了通過 Intent 來傳遞自定義對象。

最后注意一點:在這個過程中,會將對象序列化為可存儲或可傳輸?shù)臓顟B(tài),再將其反序列化為一個新的對象。雖然這兩個對象存儲的數(shù)據(jù)一致,但其實是兩個不相同的對象。

方式二:Parcelable

我們也可以通過 Parcelable 來完成。只不過它的實現(xiàn)原理是將完整的對象進行分解,使得分解后的每一個部分都是 Intent 所支持的數(shù)據(jù)類型,這樣也能實現(xiàn)通過 Intent 來傳遞自定義對象的功能。

如果使用 Parcelable 的實現(xiàn)方式,Person 類的代碼將會是這樣的:

class Person(var name: String?, var age: Int) : Parcelable {

    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readInt()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        // 將當(dāng)前類中的字段寫出
        parcel.writeString(name)
        parcel.writeInt(age)
    }

    override fun describeContents(): Int {
        return 0
    }
    
    // 注意:讀取字段的順序需要和寫出字段的順序保持一致。
    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}

可以看到,手動編寫這些模版代碼非常繁瑣。為此,Kotlin 提供了一種更加簡便的用法。

我們先在 app/build.gradle.kts 文件中添加插件依賴:

plugins { 
    id("kotlin-parcelize")
}

然后,修改 Person 類:

import kotlinx.parcelize.Parcelize

@Parcelize
data class Person(var name: String, var age: Int) : Parcelable

只需加上一個 @Parcelize 注解,就可以省去了一大堆模板代碼的麻煩。

注意:使用 @Parcelize 時,所有要傳遞的數(shù)據(jù)都必須在類的主構(gòu)造函數(shù)中聲明。

接下來,在獲取 Intent 中的數(shù)據(jù)時,只需使用 getParcelableExtra() 方法即可。同樣地,需要處理版本兼容問題:

val person: Person? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    intent.getParcelableExtra("person", Person::class.java)
} else {
    @Suppress("DEPRECATION")
    intent.getParcelableExtra<Person>("person")
}

對比

對比 SerializableParcelable 這兩種方式,Serializable 的實現(xiàn)非常簡單,但它序列化時會用到反射,導(dǎo)致性能開銷大。Parcelable 則通過顯式的讀寫操作來分解對象,沒有反射的開銷,效率要高得多。

因此,在安卓開發(fā)中,通常情況下,我們都會選擇使用 Parcelable 的方式。

以上就是Android通過Intent傳遞自定義對象的兩種方式的詳細(xì)內(nèi)容,更多關(guān)于Android Intent傳遞自定義對象的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

娱乐| 光泽县| 绥中县| 平果县| 肇源县| 措美县| 米林县| 清丰县| 南木林县| 泾源县| 思茅市| 中方县| 江永县| 永兴县| 九龙县| 堆龙德庆县| 云阳县| 高青县| 晴隆县| 哈巴河县| 文山县| 石棉县| 贵阳市| 湖北省| 阿拉善左旗| 铜山县| 咸阳市| 宜君县| 安达市| 盐津县| 陕西省| 安义县| 台南县| 台江县| 博兴县| 淮阳县| 鞍山市| 东莞市| 资源县| 西和县| 鄂州市|