java - 使用 AIDL 在两个进程之间传输 Parcelable

标签 java android ipc parcelable aidl

这是我唯一不了解 AIDL 并且在 Google 或 Stackoverflow 上找不到任何内容的信息:

我有一个 Activity 和一个服务,每个都位于不同的进程中,并且它们使用 AIDL 通过 IPC 紧密通信。 AIDL通信接口(interface)中的方法之一需要从服务中获取my-custom-parcelable-class对象列表并将它们返回给activity。

我对 AIDL 接口(interface)中以及 Activity 和服务两端的导入语句感到困惑。在 AIDL 界面中,我导入 .aidl Parcelable 声明。然而,如果在 Activity 和服务中我导入真实的 (.java) Parcelable 类,并且这些声明会发生冲突,因为 AIDL 接口(interface)实现希望我返回 .aidl Parcelable,但我返回真正的 Parcelable。

我会尝试用代码让它更清楚:

在我的服务中,我发送 MyParcelable 列表:

import package-with-java-files.MyParcelable; // IMPORTING REAL MyParcelable
...
protected final InterprocessCommunicator.Stub binder = new InterprocessCommunicator.Stub() {
    @Override
    public List<MyParcelable> getMyParcelables() throws RemoteException { // CONFLICT
        return MyService.this.getMyParcelables();
    }
}

在我的 AIDL 接口(interface)中,我声明返回列表的方法:

package package-with-aidl-files;

import package-with-aidl-files.MyParcelable; // IMPORTING AIDL MyParcelable

interface InterprocessCommunicator {
    List<MyParcelable> getMyParcelables();
}

在我的 AIDL Parcelable 声明中(这就是我所说的 AIDL MyParcelable):

package package-with-aidl-files;

parcelable MyParcelable;

在我的 java Parcelable 声明中(这就是我所说的真正的 MyParcelable):

package package-with-java-files;

public class MyParcelable implements Parcelable {
    ...
}

最后,在我的 Activity 中,我收到了 MyParcelable 列表:

import package-with-java-files.MyParcelable; // IMPORTING REAL MyParcelable
...
void someMethod() {
     List<MyParcelable> responses = interprocessCommunicator.getMyParcelables(); // CONFLICT
     ....
}

我希望现在更清楚冲突在哪里: 在服务中,我返回 package-with-java-files.MyParcelable 列表,但 AIDL 接口(interface)需要 package-with-aidl-files.MyParcelable 和 Activity 中的内容相同

如何解决这些冲突?我无法在AIDL接口(interface)中导入真正的MyParcelable,也无法在Activity/Service中导入AIDL MyParcelable...

AIDL专家,我需要您的帮助! 提前致谢!

请不要给我链接官方 API 指南,因为那里没有任何内容 http://developer.android.com/guide/components/aidl.html#PassingObjects

最佳答案

AIDL 只是一个工具,可以帮助您生成 IPC 所需的代理和 stub 的真正实现。它需要一个 .aidl 文件,并根据规则从它生成 .java 文件。这些 .java 文件是执行工作的实际代码。因此,.aidl 文件可以被想象为帮助指定接口(interface)的内部方式。

因此,在您的情况下,“package-with-aidl-files”将生成也用于存储生成的 .java 文件。因此,“package-with-aidl-files”应该对应于“package-with-java-files”。希望这个解释能对您有所帮助!

关于java - 使用 AIDL 在两个进程之间传输 Parcelable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22349001/

相关文章:

android - 如何在Android中播放mp4文件中的声音?

c++ - 通过消息队列发送缓冲区

javascript - 强制~同步 Node.js IPC

java - 如何将数组作为参数传递给 Java 图形函数?

java - postman 原始 body react 400

java - 处理 XML 时发生错误“无法加载类 [org.springframework.transaction.annotation.AnnotationTransactionAttributeSource]

android fragment - 数据传递 - 最佳实践

java - 如何使用 spring 数据在 elasticsearch 中创建动态模板。

android - Facebook android SDK 3 从用户那里获取电子邮件

c++ - 阻塞 unix 域套接字的问题