Parcelable:Class 在从不同应用程序调用时解组时未找到
Parcelable: Class not found when unmarshalling when calling from different App
我试图从 App1 传递一个包,其中包含一些数据,其数据 class 是 Auxiliar 到也定义了 Auxiliar 数据 class 的 App2,但我收到以下错误:
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
App1
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")
}
You cannot pass parcelable class from one app to another?
是的,你可以。但是,它们必须 相同 class。换句话说,他们需要:
- 相同的基名 (
Auxiliar
)
- 相同的包名(
com.opp.App1.ui.main
)
- 相同的字段
在你的情况下,我猜测包名称不同。如果您在两个应用程序中使用相同的包名称——例如让两个应用程序共享一个定义 class 的通用库模块——那么您的状态会好一些。
但是请记住,用户不需要同时更新 App1 和 App2。 Parcelable
设计供框架 classes 使用,它们是固件的一部分,其中 App1 和 App2 保证具有相同的实现。如果 App1 有一个旧的 Auxiliar
而 App2 有一个新的 Auxiliar
,你可能 运行 会遇到问题。
You can only pass primitive classes?
将 Android SDK 中定义的任何内容作为 Parcelable
传递是安全的,因为 App1 和 App2 对于那些 class 将具有相同的 class 定义。因此,例如,Bundle
是 Parcelable
。您仍然需要一个版本控制系统来处理数据更改,但至少您可以控制如何处理它。
我试图从 App1 传递一个包,其中包含一些数据,其数据 class 是 Auxiliar 到也定义了 Auxiliar 数据 class 的 App2,但我收到以下错误:
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
App1
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")
}
You cannot pass parcelable class from one app to another?
是的,你可以。但是,它们必须 相同 class。换句话说,他们需要:
- 相同的基名 (
Auxiliar
) - 相同的包名(
com.opp.App1.ui.main
) - 相同的字段
在你的情况下,我猜测包名称不同。如果您在两个应用程序中使用相同的包名称——例如让两个应用程序共享一个定义 class 的通用库模块——那么您的状态会好一些。
但是请记住,用户不需要同时更新 App1 和 App2。 Parcelable
设计供框架 classes 使用,它们是固件的一部分,其中 App1 和 App2 保证具有相同的实现。如果 App1 有一个旧的 Auxiliar
而 App2 有一个新的 Auxiliar
,你可能 运行 会遇到问题。
You can only pass primitive classes?
将 Android SDK 中定义的任何内容作为 Parcelable
传递是安全的,因为 App1 和 App2 对于那些 class 将具有相同的 class 定义。因此,例如,Bundle
是 Parcelable
。您仍然需要一个版本控制系统来处理数据更改,但至少您可以控制如何处理它。