如何在 Java 代码中使用 Parcelable

How to use Parcelable in Java Code

我在 Android Studio 中有一个多模块项目,并在纯 java 模块中定义我的业务对象(我想在 ui 中使用的 POJO 对象) (称为 "application")。最终产品将是一个连接到服务器的 Android 应用程序。

我的应用程序结构如下(我有一个多层架构,而每一层代表一个模块):

 Project
 - presentation (android ui)
 - application (logic / mapping DTO <--> Business Objects (POJOs))
 - data (mapping JSON <--> Data Transfer Object (DTO))
 - transport (network communication)

下面的 3 个模块是纯 java / 只有第一个是 Android 模块。

现在我的问题是: 我如何仍然对提到的 POJO 使用 Android 的 Parcelable(在纯 java 模块中)。是否存在 gradle 依赖项?直到现在我才找到任何东西,所以它会很感激一些有用的提示。

我不想使用 Serializable 并且不想将模块更改为 Android 模块。

更新:我试图在 java 模块中实现 Parcelable(它确实可以正常工作,但是当 building 时它无法识别 android.os.Parcelable。所以我回到问题的开头。

更新 II:尝试 Parceler 之类的答案不起作用,因为 android.os.Parcelable 在模块中无法识别。我不是在寻找如何实现 Parcelable 的答案,而是在寻找如何能够在纯 Java 中使用 Parcelable 的答案。谢谢

解决方案:见下文...

我强烈建议不要使用 Parcelable。我用了很多。如果您不打算在 Android 中使用 IPC,请避免使用它。如果您不打算在 Android 进程之间传递这些对象,则不需要实现 Parcelable.

如果要在Android个进程之间传递对象,那么Parcelable是必须的。你应该看看 AIDL。请注意,类 仍然必须实现 Parcelable,即使您使用 AIDL。

你不需要任何特殊的依赖,Android SDK 就足够了。

编辑:

我知道链接文档说 "If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger"。根据我的经验,我不同意这个建议。使用绑定服务和 Messenger 是一条充满隐藏陷阱的痛苦之路。 AIDL 更容易实施。

我不太明白您要归档的内容,但是您可以使用 gson 轻松地在 android 进程甚至 ws 之间进行通信。

只需转换您的对象json 使用 gson(它根据你的 pojo 自动执行)并从 json 转换为另一侧的对象。

如果您正在寻找一种将 POJO 包装为 Parcelable 的简单方法,请尝试 Parceler。 Parceler 是一个注释处理器,它根据您的 POJO 模型的字段生成 Parcelables classes.

要让 Parceler 为您的纯 java 库生成 Parcelables,请在您的 Android 特定源代码(演示文稿?)中使用 @ParcelClass 注释来指示将 POJO 用作模型的 Parceler。

从 Parceler 生成的 Parcelable 输出中,您可以直接使用生成的 classes,或者通过 Parcels.wrap()Parcels.unwrap() 实用程序 class并将数据序列化为 Bundle.

O.K.,它现在正在工作。我终于意识到在 Android 应用程序中 运行 纯 java 模块是不可能的,你总是必须应用 android 库插件而不是 java插件:

apply plugin: 'com.android.library'

我还必须添加一个 Manifest.xml 并将以下内容添加到 java 模块的 build.gradle 中:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 21
    }
}