Android - 在不同apk上的服务之间传递可序列化或可打包的捆绑包

Posted

技术标签:

【中文标题】Android - 在不同apk上的服务之间传递可序列化或可打包的捆绑包【英文标题】:Android - Passing serializable or parcelable in bundle between services on different apk 【发布时间】:2016-03-25 09:17:20 【问题描述】:

我正在开发属于不同 android apk 的服务之间的消息接口。

发送方服务可以向接收方服务发送一条消息,实现为Bundle。 String 或 boolean 等原始类型已正确交换。

接下来的步骤是交换更复杂的对象,这些对象在库中定义,在不同的服务之间共享。 这些对象实现了ParcelableSerializable 接口,因此可以使用putParcelableputSerializable 方法将它们封装在Bundle 中。

很遗憾,此解决方案不起作用。在服务接收到的 bundle 对象中,可打包(或可序列化)对象被替换为String。似乎Android在将Bundle发送到接收器服务之前调用了对象的toString方法。

如果不实现可以将每个对象序列化为仅由原始类型形成的Bundle 的方法,是否有解决此问题的方法?

【问题讨论】:

当您从 Bundle 中调用 getParcelable() 时会发生什么?你是空的吗? 您的代码有问题:您可以轻松地在 Binder 事务中传递任何 Parcelable @NoChinDeluxe 当我调用 getParcelable() 执行对预期类型的​​转换时,会抛出类转换异常,因为 Bundle 中的元素被视为 String 对象。 所以例如this 对你不起作用? 我觉得你实现Parcelable 接口的方式有问题。您能否发布一些您的 Parcelables 的代码以显示其中一个失败的示例? 【参考方案1】:

您始终可以将Base64ed 对象交换为字符串,并且可以从ByteArrays 生成字符串,因此您可以尝试一个想法。

当你考虑它时,你实际上可以通过字符串传递很多东西:)

【讨论】:

你是对的。目前,我将对象序列化为 JSON,以便可以将其作为 String 传递,但如果可能的话,我正在寻找更好的解决方案。

以上是关于Android - 在不同apk上的服务之间传递可序列化或可打包的捆绑包的主要内容,如果未能解决你的问题,请参考以下文章

Android : 添加apk私有权限

Android:两个独立 APK 的两个服务之间的通信

如何在 Android 上的活动之间传递值?

在 Android 中的两个 Fragment 之间传递数据都有哪些不同的方式? [复制]

在不同进程之间传递文件描述符的可移植方式

构建使用协议缓冲区的Android可执行gRPC服务器(不使用APK)