使用AIDL在两个进程之间传输parcelables

时间:2014-03-12 10:44:23

标签: java android ipc parcelable aidl

这是我唯一没有得到AIDL并且无法在Google或Stackoverflow上找到任何内容的内容:

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

我对AIDL界面中的import语句以及活动和服务的两端都感到困惑。在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
     ....
}

我希望现在更明确的是冲突在哪里: 在Service中我返回package-with-java-files.MyParcelable的列表,但是AIDL接口需要package-with-aidl-files.MyParcelable 和活动中的相同事情

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您无法将AIDL定义存储在与实现不同的包中。如果您将.java.aidl文件并排放置,它将会正常工作。