这是我唯一不了解 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/