Android Binder建模问题——MusicStore、IMusicStore.aidl、Music、IMusic.aidl
Posted
技术标签:
【中文标题】Android Binder建模问题——MusicStore、IMusicStore.aidl、Music、IMusic.aidl【英文标题】:Android Binder modeling question - MusicStore, IMusicStore.aidl, Music, IMusic.aidl 【发布时间】:2010-11-13 01:19:21 【问题描述】: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)”,但我被困在这里:
一般如何对项目 B 上的 Music 类、IMusic 接口和 IMusic.stub 建模?
getMusic() 方法是否应该或可以在以下代码中返回 IMusic.Stub 实例或 Music 实例?
如何理解IMusic.Stub?
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】:好吧,我可以告诉你一个有效的方法:对于通过 AIDL 定义的接口,始终创建 .Stub
类的实例。不要在其他类上随意应用接口。
例如,项目 A 拥有 MusicStoreManager,项目 B 拥有 MusicStore 和 Music
项目 B 应该创建 IMusicStore.Stub
和 IMusic.Stub
的子类。 MusicStoreService
会从onBind()
返回一个IMusicStore.Stub
类的实例,所以项目A 可以通过bindService()
获得IMusicStore
代理。在IMusicStore.Stub
类上实现getMusic()
将返回IMusic.Stub
类的实例。
【讨论】:
感谢您的快速回复。 IMusic.Stub() 构造函数没有参数,如何将存根对象与真实的音乐对象相关联,因为 MusicStore 包含所有音乐对象的 HashMap。 getMusic() 方法应该返回 Music 对象类型还是 IMusic 接口类型?谢谢。 @user506376:没有“真正的音乐对象”,AFAICT。将您的“真正的音乐对象”智能放在您的 IMusic.Stub 子类上。 “getMusic() 方法应该返回 Music 对象类型还是 IMusic 接口类型?”——它必须返回一个IMusic.Stub
AFAIK。
如果将 IMusic.aidl 的名称更改为 IMusicAccessor.aidl,则可以创建一个 api 将音乐 id 与内部音乐对象关联(打开、创建、获取等)。但这并不是我真正想要的。我的问题是我是否可以同时使用Binder IPC仍然符合接口定义?换句话说,是否可以在面向对象的 API 风格中对面向服务的 IPC 机制进行建模?谢谢。
@user506376:你对我来说不再有意义,所以我不能再帮你了。
终于让它工作了——存根对象就是音乐对象。感谢您的帮助。以上是关于Android Binder建模问题——MusicStore、IMusicStore.aidl、Music、IMusic.aidl的主要内容,如果未能解决你的问题,请参考以下文章
Binder 机制分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )