Android Binder建模问题 - MusicStore,IMusicStore.aidl,音乐,IMusic.aidl

时间:2010-11-13 01:19:22

标签: android api ipc modeling aidl

Android Binder文档有一个关于如何通过Binder接口传递对象Rect的简单示例,如果对象本身有一些也由AIDL接口定义的方法,我想知道如何进行建模?

例如,项目A拥有MusicStoreManager,项目B拥有MusicStore和Music,交互是通过Binder IPC。我正在使用IMusicStore.aidl定义了一个方法“IMusic getMusic(int musicId)”,而IMusic.aidl定义了一个方法“byte [] getMusicData(int from,int to)”,但我被困在这里:

  1. 如何对项目B上的Music类,IMusic接口和IMusic.stub进行建模?

  2. getMusic()方法是否应该在以下代码中返回IMusic.Stub实例或Music实例?

  3. 如何理解IMusic.Stub?

  4. Music类必须实现IMusic接口以及Parcelable吗?

  5. 非常感谢 - 我真的很困惑。

    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 :(得分:0)

好吧,我可以告诉你一个有用的配方:对于通过AIDL定义的接口,总是创建.Stub类的实例。不要在其他类上随机应用接口。

  

例如,项目A拥有MusicStoreManager,项目B拥有MusicStore和音乐

项目B应该创建IMusicStore.StubIMusic.Stub的子类。 MusicStoreService会从IMusicStore.Stub返回onBind()类的实例,因此项目A可以通过IMusicStore获取bindService()代理。 getMusic()类上IMusicStore.Stub的实现将返回IMusic.Stub类的实例。