这是我唯一没有得到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
答案 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
文件并排放置,它将会正常工作。