【问题标题】:Transferring parcelables between two processes using AIDL使用 AIDL 在两个进程之间传输 Parcelables
【发布时间】:2014-04-16 10:31:53
【问题描述】:

这是我唯一没有得到关于 AIDL 并且在 Google 或 Stackoverflow 上找不到任何内容的信息:

我有一个活动和一个服务,每个都在不同的进程中,它们使用 AIDL 通过 IPC 紧密通信。 AIDL 通信接口中的一种方法需要从服务中获取 my-custom-parcelable-class 对象列表并将它们返回给活动。

我对 AIDL 界面中的导入语句以及活动和服务的两端感到困惑。在 AIDL 界面中,我导入了我的 .aidl parcelable 声明。而如果在活动和服务中我导入了我的真实(.java)parcelable 类,并且这些声明冲突,因为 AIDL 接口实现希望我返回 .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 接口中,我声明了返回列表的方法:

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 {
    ...
}

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

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

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

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

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

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

【问题讨论】:

    标签: java android ipc parcelable aidl


    【解决方案1】:

    您不能将 AIDL 定义存储在与实现不同的包中。如果您将 .java.aidl 文件并排放置,它将起作用。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多