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.StubIMusic.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.StubAFAIK。 如果将 IMusic.aidl 的名称更改为 IMusicAccessor.aidl,则可以创建一个 api 将音乐 id 与内部音乐对象关联(打开、创建、获取等)。但这并不是我真正想要的。我的问题是我是否可以同时使用Binder IPC仍然符合接口定义?换句话说,是否可以在面向对象的 API 风格中对面向服务的 IPC 机制进行建模?谢谢。 @user506376:你对我来说不再有意义,所以我不能再帮你了。 终于让它工作了——存根对象就是音乐对象。感谢您的帮助。

以上是关于Android Binder建模问题——MusicStore、IMusicStore.aidl、Music、IMusic.aidl的主要内容,如果未能解决你的问题,请参考以下文章

Android Binder 跟踪

android Binder机制

Binder 机制分析 Android 内核源码中的 Binder 驱动源码 binder.c ( googlesource 中的 Android 内核源码 | 内核源码下载 )

广播接收器是不是依赖binder或intent,Android

Android Binder 的内存开销

Android面试Android跨进程通信之Binder