Да, вы можете передавать перечисления через 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];
}
}
Импорт:
RepeatMode.aidl:
пакет com.cyberdyne.media;
Parcelable RepeatMode;
И не забудьте пометить аргументы перечисления как аргументы.
Вид очевидного, когда вы думаете об этом. Но держу пари, что Google не использует много перечислений в интерфейсах IBinder. Я делаю это все же. (Спасибо студии Android за предоставление "Implement Parcelable", который не работает полностью для перечислений, но делает вещи относительно простыми).
Дискурс по Android перечислениям:
Рекомендации по лучшей практике для перечислений в Android были сняты много месяцев назад. Вы торгуете около 200 байтов исполняемого файла для ужасного ужасного кода. Телефоны прошли долгий путь со времен Android 1.0. Это легко. Используйте перечисления. (Или используйте безумную управляемую Kotlin систему атрибутов, которую использует Google. Удачи в этом.)
Официальные знания Java, восходящие к оригинальной спецификации языка Java, не поощряют использование обнаженного ординала (). Рассуждение: сопровождающие в глубоком будущем могут невольно переупорядочить порядковые номера и разбить вещи. Честно говоря, я думаю, что это напыщенное явление 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]);
}
Если ничего другого, он помечает класс как класс, который, вероятно, содержит целые числа. И комментарий никогда не ранит, и это делает получаемый конец маршаллированных перечислений немного красивее (и чуть чуть безопаснее).