Parcelable:从不同应用程序调用时解组时找不到类

Posted

技术标签:

【中文标题】Parcelable:从不同应用程序调用时解组时找不到类【英文标题】:Parcelable: Class not found when unmarshalling when calling from different App 【发布时间】:2020-04-28 14:03:22 【问题描述】:

我正在尝试从 App1 传递一个包含一些数据的包,该数据类的数据类是 Auxiliar 到 App2,该 App2 也定义了 Auxiliar 数据类,但我收到以下错误:

E/Parcel: Class not found when unmarshalling: com.opp.App1.ui.main.Auxiliar

我认为 App2 在检索捆绑信息时试图找到 Auxiliar 定义,但我不知道如何使用 App2 中定义的 Auxiliar

这是一些代码

@Parcelize
data class Auxiliar(
    var nightId: Long = 0L,

    val startTimeMilli: Long = System.currentTimeMillis(),

    var endTimeMilli: Long = startTimeMilli,

    var quality: Int = -1
): Parcelable

应用程序1

var intent: Intent? = activity?.packageManager?.getLaunchIntentForPackage("com.opp.App2")

val argu1 = Auxiliar(-101, 1,1,-1)
if (intent != null) 
            var bundle = Bundle()
            bundle.putParcelable("una", argu1)
            intent.putExtra("myBundle",bundle)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            startActivity(intent)

在 App2 中检索:


val bundle = activity?.intent?.getBundleExtra("myBundle")
if (bundle != null) 
    var una = bundle.getParcelable<Auxiliar>("una")
    

【问题讨论】:

“我不知道如何使用 App2 中定义的辅助”——你不能。它们必须是相同的类:相同的定义、相同的完全限定的类名。 所以...您不能将 parcelable 类从一个应用程序传递到另一个应用程序?你只能传递原始类? 好吧,如果你有相同的完全限定包名称的相同类,那么它会工作 【参考方案1】:

您不能将 parcelable 类从一个应用程序传递到另一个应用程序?

是的,你可以。但是,它们必须是同一类。换句话说,他们需要:

相同的基本名称 (Auxiliar) 包名相同(com.opp.App1.ui.main) 相同的字段

在你的情况下,我猜包名是不同的。如果您在两个应用程序中使用相同的包名称(例如让两个应用程序共享一个定义类的公共库模块),那么您的状态会更好。

但是,请记住,用户不需要同时更新 App1 和 App2。 Parcelable 设计用于框架类,它们是固件的一部分,其中 App1 和 App2 保证具有相同的实现。如果 App1 有一个旧的Auxiliar 而 App2 有一个新的Auxiliar,您可能会遇到问题。

你只能传递原始类?

android SDK 中定义为 Parcelable 的任何内容传递是安全的,因为 App1 和 App2 对这些类具有相同的类定义。因此,例如,BundleParcelable。您仍然需要一个版本控制系统来处理数据更改,但至少您可以控制如何处理。

【讨论】:

以上是关于Parcelable:从不同应用程序调用时解组时找不到类的主要内容,如果未能解决你的问题,请参考以下文章

在 PreferenceFragment 中解组时找不到类

解组 Android Intent Parcelable 时找不到类

解组时找不到类:com.google.android.gms.location.LocationResult

错误:解组时找不到类:com.facebook.login.Login 客户端请求

ClassNotFoundException 解组时真的不知道为啥

yaml:使用 go 时解组错误