7

我有一个关于 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 可以为相同的接口名称获取不同的绑定器对象(接口的不同实现)。这就是为什么,我使用活页夹进行释放。

希望这不会太混乱!谢谢您的帮助。

卡提克

4

2 回答 2

10

binder 代理对象有一个asBinder()方法可以返回底层IBinder对象,该对象可用于检查 Binder 代理之间的底层相等性。

我不熟悉该机制,但我看到此方法LocationManagerService.java在 Android 源代码中的文件内部用于注册/取消注册ILocationListener对象。

于 2013-06-04T04:44:36.907 回答
0

据我所知,没有简单的解决方案。BinderProxy 是 android.os.Binder 中的最后一个类。你可以在这里找到源代码。一种解决方案可能是创建自己的扩展 Binder 的类并创建自己的实现以将 Binder 的实例存储在 BinderProxy 中或以其他方式存储。这很难,因为两个类都没有直接引用另一个类。抱歉,如果我误解了您的问题,或者离这里很远。

于 2012-07-13T18:11:30.503 回答