我有一个关于 Android 的活页夹的问题。如果我理解正确,可以在进程之间传递 Binder。在服务端,有一个Binder对象(原始对象)。在客户端(在单独的进程中),有一个 BinderProxy 对象来处理 AIDL 数据编组。
我的问题是 - 你如何检查两个 BinderProxy 对象是否相等?我的意思是,它们在服务进程中引用相同的 Binder 对象。我们可以使用 equals() 方法吗?BinderProxy 对象是否与原始 Binder 对象具有相同的内存地址?
谢谢!
编辑:
回应大卫·瓦瑟的评论:
我为什么要这样做的原因解释起来有点复杂,但让我看看我能不能解释清楚——
远程服务提供了一个 AIDL API(客户端通过接收 onServiceConnected 中的 IBinder 来获取)。AIDL API,除其他外,包含两种方法——
IBinder getInterface ( String interfaceName );
void releaseInterface ( IBinder binder );
这个想法是客户端应用程序可以为不同接口的绑定器请求远程服务。接口实现的 dex 代码及其绑定器是动态加载到服务中的,并且事先不知道。该服务为客户端应用程序提供这 2 个 AIDL 方法,以根据接口名称访问那些动态加载的接口的绑定器。
所以说有App1和App2。每个都做'binder1 = getInterface(“SomeInterface1”);' 并为该动态加载的接口“SomeInterface1”获取活页夹。使用后,应用程序通过说'releaseInterface(binder1);'释放接口绑定器 以便服务可以卸载接口的 dex 代码并进行一些清理。
但是,除非 App1 和 App2都释放了接口绑定器,否则无法卸载接口 dex 代码。因此,在服务中,我为每个动态加载的活页夹维护一个引用计数。(比如说一个 Map 键{Binder} ==> value{reference count})。当应用程序执行 getInterface() 时,我会增加引用计数。当它确实 releaseInterface(binder1) 时,我应该减少引用计数。但是,为此,我需要检查 binder1 是否等于 Map 中的 binder 键。
请注意,活页夹已从服务(原始活页夹对象)传递到客户端应用程序(由 getInterface() 返回的活页夹代理)并再次返回到服务(作为 releaseInterface() 的参数 - 它仍然是代理,还是原本的??)。
App1 和 App2 可以为相同的接口名称获取不同的绑定器对象(接口的不同实现)。这就是为什么,我使用活页夹进行释放。
希望这不会太混乱!谢谢您的帮助。
卡提克