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 框架的示例:
InputBindResult
: writeStrongInterface / readStrongBinder
ParcelableCall
: writeStrongBinder /
readStrongBinder
我有一个通过 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 框架的示例:
InputBindResult
: writeStrongInterface / readStrongBinderParcelableCall
: writeStrongBinder / readStrongBinder