Вопрос моделирования Android Binder - MusicStore, IMusicStore.aidl, Music, IMusic.aidl - PullRequest
0 голосов
/ 13 ноября 2010

Документ Android Binder содержит простой пример того, как передать объект Rect через интерфейс Binder. Мне интересно, как выполнить моделирование, если у самого объекта есть некоторые методы, которые также определены интерфейсом AIDL?

Например, проект A владеет MusicStoreManager, проект B владеет MusicStore и Music, взаимодействие осуществляется через Binder IPC.Я использую IMusicStore.aidl определяет метод "IMusic getMusic (int musicId)", а IMusic.aidl определяет метод "byte [] getMusicData (int from, int to)", но я застрял здесь:

  1. Как смоделировать класс Music, интерфейс IMusic и IMusic.stub для проекта B в целом?

  2. Следует или МОЖЕТ ли метод getMusic () вернуть экземпляр IMusic.Stub или экземпляр Music в следующем коде?

  3. Как понять IMusic.Stub?

  4. Должен ли класс Music реализовывать интерфейс IMusic, а также Parcelable?

Большое спасибо - я в замешательстве.

public class MusicStoreService extends Service {
    ...
    protected static final IMusicStore.Stub store = new IMusicStore.Stub() {
        ...
        public IMusic getMusic(int id) throws RemoteException {
            return new Music(id); // or return new IMusic.Stub() ???
        }
    }
    ...
    protected static final IMusic.Stub music = new IMusic.Stub() {
        ...
        public byte[] getMusicData(int from, int to) throws RemoteException {
            // open the associated file, read the data within range, return it back.
        }
    }
    ...
}

public class Music extends Object implements Parcelable, IMusic {
    ...
    public byte[] getMusicData(int from, int to) throws RemoteException {
        // open the associated file, read the data within range, return it back.
    }
    ...
}

1 Ответ

0 голосов
/ 13 ноября 2010

Хорошо, я могу рассказать вам рецепт, который работает: для интерфейсов, определенных через AIDL, всегда создавайте экземпляры класса .Stub.Не применяйте интерфейс случайно для других классов.

Например, проект A владеет MusicStoreManager, проект B владеет MusicStore и Music

Проект B должен создавать подклассыIMusicStore.Stub и IMusic.Stub.MusicStoreService вернет экземпляр класса IMusicStore.Stub из onBind(), поэтому Project A может получить прокси IMusicStore через bindService().Реализация getMusic() в классе IMusicStore.Stub вернет экземпляр класса IMusic.Stub.

...