在 Api 级别 30 Android 11 版本中传递对象

Passing An Object In Api level 30 android 11 version

提问人:coppersmith 提问时间:11/7/2023 最后编辑:Marcin Orlowskicoppersmith 更新时间:11/7/2023 访问量:89

问:

我正在尝试使用 Parcelable 将数据对象从一个活动传递到另一个活动。它不适用于 API 30 和 Android 11 版本。我想知道如何在 Android 11 中传递大尺寸对象。我尝试了以下代码。它抛出错误,如

致命异常:main 进程:com.example.exoone,PID:3989 java.lang.NoSuchMethodError:无虚拟方法 getParcelableExtra(Ljava/lang/String;Ljava/lang/类;Ljava/lang/对象; 在类 Landroid/content/Intent 中;或其超类(声明 “android.content.Intent”显示在 /system/framework/framework.jar 中) 在 com.example.exoone.PlayerActivity.onCreate(PlayerActivity.kt:20) 在 android.app.Activity.performCreate(Activity.java:7994) 在 android.app.Activity.performCreate(Activity.java:7978) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

在我的主活动文件中

class MainActivity : AppCompatActivity() {
    val TAG = "MyTag"
    lateinit var binding: ActivityMainBinding
    var myArray:ArrayList<MyTestDatas> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        for (i in 1..20){
            myArray.add(MyTestDatas("title $i","Some Description $i"))
        }
        Log.i(TAG,myArray.toString())
        binding.btnSend.setOnClickListener {
            val intent = Intent(this,PlayerActivity::class.java)
            intent.putExtra("myData",myArray)
            startActivity(intent)
        }

    }
}

在我的接收器活动中

class PlayerActivity : AppCompatActivity(){
    val TAG = "secondTag"
    private val viewBinding by lazy(LazyThreadSafetyMode.NONE) {
        ActivityPlayerBinding.inflate(layoutInflater)
    }

    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(viewBinding.root)
        val getValue = intent.getParcelableExtra("myData",MyTestDatas::class.java)

        Log.i(TAG,getValue.toString())
    }
}

在我的数据类中

import android.os.Parcel
import android.os.Parcelable

data class MyTestDatas(
    val title:String,
    val description:String
):Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString().toString(),
        parcel.readString().toString()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(title)
        parcel.writeString(description)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<MyTestDatas> {
        override fun createFromParcel(parcel: Parcel): MyTestDatas {
            return MyTestDatas(parcel)
        }

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

谁能帮我在 Android 11 中将对象从 Activity 传递到另一个 Activity?

Android Parcelable Kotlin-Multiplatform

评论

0赞 blackapps 11/7/2023
请将 logcat 行也发布在代码块中,以保留这些行并使其可读。
0赞 Michael 11/7/2023
首先,您尝试使用的版本仅适用于 Android 13 或更高版本。在早期版本中,该函数仅采用单个参数 ()。但我不相信你真的有一个 Parcelable 额外。我怀疑这可能会保存为 .也许你应该用它来存储意图,并读回它。getParcelableExtraString nameintent.putExtra("myData",myArray)myArraySerializableputParcelableArrayListExtramyArraygetParcelableArrayListExtra(String name)
0赞 coppersmith 11/7/2023
我正在使用 API 30 和 Android 11 版本。似乎 parcelable 在 Android 11 中不起作用。在 Android 11 中,还有哪些方法可以将对象从一个 Activity 传递到另一个 ACTIVITY。
0赞 coppersmith 11/7/2023
我用intent.putParcelableArrayListExtra(“myData”,myArray)和getParcelableArrayListExtra(“myData”,MyTestDatas::class.java)进行了测试。它仍然抛出相同的错误。
1赞 David Wasser 11/7/2023
这个物体有多大?您不能将超过 1MB 作为“额外内容”传递。Intent

答:

0赞 Kamal Nayan 11/7/2023 #1

在项目中添加此扩展函数:

    inline fun <reified T : Parcelable> Intent.parcelable(key: String): T? = when {
  SDK_INT >= 33 -> getParcelableExtra(key, T::class.java)
  else -> @Suppress("DEPRECATION") getParcelableExtra(key) as? T
}

inline fun <reified T : Parcelable> Bundle.parcelable(key: String): T? = when {
  SDK_INT >= 33 -> getParcelable(key, T::class.java)
  else -> @Suppress("DEPRECATION") getParcelable(key) as? T
}

评论

0赞 coppersmith 11/7/2023
嗨,您的代码不会抛出错误,但它显示 null 值。
0赞 Kamal Nayan 11/7/2023
嗨,@coppersmith将很快更新答案。
0赞 Kamal Nayan 11/7/2023
我已经更新了答案。您确定您的 Parcelable 实施工作正常吗?
0赞 coppersmith 11/7/2023
我试过这样的val getValue =intent.extras?。parcelable<MyTestDatas>(“myData”)。它仍然显示 null 值。
0赞 Kamal Nayan 11/7/2023
我明白了,你确定你的可包裹实现是正确的吗?您可以使用然后注释该类,而无需自己实现。kotlin-parcelize@parcelize