Java 使用AIDL在两个进程之间传输包裹

Java 使用AIDL在两个进程之间传输包裹,java,android,ipc,parcelable,aidl,Java,Android,Ipc,Parcelable,Aidl,以下是我唯一没有了解到的关于AIDL的信息,在Google或Stackoverflow上找不到任何信息: 我有一个活动和一个服务,每一个都在不同的过程中,它们通过IPC使用AIDL进行紧密通信。 AIDL通信接口中的一个方法需要从服务中获取自定义包裹类对象的列表,并将它们返回到活动 我对AIDL接口中的导入语句以及活动和服务中两端的导入语句感到困惑。在AIDL接口中,我导入我的.AIDL包裹声明。然而,如果在活动和服务中,我导入了我的real(.java)parcelable类,并且这些声明冲突

以下是我唯一没有了解到的关于AIDL的信息,在Google或Stackoverflow上找不到任何信息:

我有一个活动和一个服务,每一个都在不同的过程中,它们通过IPC使用AIDL进行紧密通信。 AIDL通信接口中的一个方法需要从服务中获取自定义包裹类对象的列表,并将它们返回到活动

我对AIDL接口中的导入语句以及活动和服务中两端的导入语句感到困惑。在AIDL接口中,我导入我的.AIDL包裹声明。然而,如果在活动和服务中,我导入了我的real(.java)parcelable类,并且这些声明冲突,因为AIDL接口实现希望我返回.AIDL parcelable,但我返回real parcelable

我将尝试用代码更清楚地说明:

在我的服务中,我将发送我的包裹列表:

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();
    }
}
package package-with-aidl-files;

parcelable MyParcelable;
package package-with-java-files;

public class MyParcelable implements Parcelable {
    ...
}
import package-with-java-files.MyParcelable; // IMPORTING REAL MyParcelable
...
void someMethod() {
     List<MyParcelable> responses = interprocessCommunicator.getMyParcelables(); // CONFLICT
     ....
}
在我的java parcelable声明中(我称之为real 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();
    }
}
package package-with-aidl-files;

parcelable MyParcelable;
package package-with-java-files;

public class MyParcelable implements Parcelable {
    ...
}
import package-with-java-files.MyParcelable; // IMPORTING REAL MyParcelable
...
void someMethod() {
     List<MyParcelable> responses = interprocessCommunicator.getMyParcelables(); // CONFLICT
     ....
}
import-package-with-java-files.MyParcelable;//导入真正的MyParcelable
...
void方法(){
List responses=interprocessCommunicator.getMyParcelables();//冲突
....
}
我希望现在能更清楚地知道冲突在哪里: 在服务中,我返回package-with-java-files.MyParcelable列表,但AIDL接口要求package-with-AIDL-files.MyParcelable 在活动中也是如此

如何解决这些冲突?我无法在AIDL接口中导入真实的MyParcelable,也无法在活动/服务中导入AIDL MyParcelable

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

请不要将官方API指南链接到我这里,因为那里没有任何内容

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


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

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