Parcelable 可以包含 AIDL 接口吗?

Can a Parcelable contain an AIDL Interface?

我有一个通过 AIDL 进行通信的服务。我已经成功创建了一个回调接口并使用了一个实现了 Parcelable 的 class。

我想让 Parcelable 包含对 AIDL 文件中定义的接口的引用,但我收到错误消息,我的回调 class 无法转换为 Parcelable。 "incompatible types: ICallback cannot be converted to Parcelable"

我的 Parcelable 看起来像这样

class Foo implements Parcelable {
   String someString;
   ICallback callback;
....
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(someString);
        dest.writeParcelable(callback, flags); //doesn't work
    }

}

该服务的 AIDL 方法如下:

void register(Foo[] someFoos);

我的理解是你的 ICallback 是一个 Binder 接口,所以你在一些 AIDL 文件中有一个 interface ICallback { ... } 形式的声明。

在这种情况下,您可以使用 parcel.writeStrongBinder(callback.asBinder()) 或使用便捷方法 parcel.writeStrongInterface(callback); 将其写入 Parcel。在接收端,可以通过以下方式检索:

callback = ICallback.Stub.asInterface(parcel.readStrongBinder());

API参考:

来自 Android 框架的示例: