是的,您可以通过 AIDL 传递枚举,但您必须在枚举类型上实现 Parcelable。
1:Parcelable 实现。
public enum RepeatMode implements Parcelable {
NoRepeat,
RepeatAll,
RepeatTrack,
;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(toInteger());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<RepeatMode> CREATOR = new Creator<RepeatMode>() {
@Override
public RepeatMode createFromParcel(Parcel in) {
return RepeatMode.fromInteger(in.readInt());
}
@Override
public RepeatMode[] newArray(int size) {
return new RepeatMode[size];
}
};
public int toInteger() { return this.ordinal(); }
public static RepeatMode fromInteger(int value)
{
return values()[value];
}
}
-
导入:
重复模式.aidl:
包 com.cyberdyne.media;
可打包的RepeatMode;
记得将枚举参数标记为参数。
想想就明白了。但我打赌谷歌不会在 IBinder 接口中使用大量枚举。我虽然这样做。 (感谢 Android 工作室提供“Implement Parcelable”,它并不完全适用于枚举,但让事情变得相对容易)。
关于 Android 枚举的讨论:
针对 Android 中的枚举的最佳实践建议已在很多个月前被撤回。您正在用大约 200 字节的可执行文件来换取可怕的可怕代码。自 Android 1.0 以来,手机已经走过了漫长的道路。这是不费吹灰之力的。使用枚举。 (或者使用 Google 使用的疯狂的 Kotlin 驱动的属性系统。祝你好运。)
可追溯到原始 Java 语言规范的官方 Java Lore 不鼓励使用裸序号()。推理:在遥远的未来,维护者可能会不知不觉地重新排序序数并破坏东西。坦率地说,我认为这是自大的 Java 愚蠢行为。我为此挣扎了很长时间,经过深思熟虑,我屈服了。
public enum Badges {
GOLD,SILVER, BRONZE; // Must match @array/badge_states
public int toInteger() { return this.ordinal(); }
public static Badges fromInteger(int value) { return values()[value]);
}
如果没有别的,它会将类标记为可能保留整数的类。并且评论永远不会受到伤害,它使编组枚举的接收端更漂亮(而且更安全一点)。