如何检查两个Android绑定代理对象是否相等?

时间:2012-07-13 09:05:37

标签: android android-binder

我对Android的活页夹有疑问。如果我理解正确,可以在进程之间传递Binder。在服务端,有一个Binder对象(原始对象)。在客户端(在单独的过程中),有一个处理AIDL数据编组的BinderProxy对象。

我的问题是 - 如何检查两个BinderProxy对象是否相等?我的意思是,它们在服务过程中引用相同的Binder对象。 我们可以使用equals()方法吗? BinderProxy对象与原始Binder对象具有相同的内存地址吗?

谢谢!

编辑:

回应David Wasser的评论:

我需要这样做的原因并不复杂,但让我看看能否清楚解释一下 -

远程服务提供AIDL API(客户端通过在onServiceConnected中接收IBinder获得)。除其他外,AIDL API包含两种方法 -

IBinder getInterface(String interfaceName);

void releaseInterface(IBinder binder);

这个想法是客户端应用程序可以为不同接口的绑定器请求远程服务。接口实现的dex代码及其绑定器动态加载到服务中,并且事先不知道。该服务为客户端应用程序提供这两种AIDL方法,以根据接口名称访问这些动态加载的接口绑定器。

所以说有App1和App2。每个都做'binder1 = getInterface(“SomeInterface1”);'并获取动态加载的接口'SomeInterface1'的绑定器。使用它之后,应用程序通过说'releaseInterface(binder1);'来释放界面活页夹。这样服务就可以卸载接口的dex代码并进行一些清理。

但是,除非两者 App1和App2都已发布接口绑定器,否则无法卸载接口dex代码。因此,在服务中,我为每个动态加载的绑定器维护引用计数。 (说一个Map键{Binder} ==> value {reference count})。当App执行getInterface()时,我会增加引用计数。当它确实是releaseInterface(binder1)时,我应该减少引用计数。但是,为此,我需要检查binder1是否等于Map中的binder键。

请注意,绑定程序已从服务(原始绑定程序对象)传递到客户端应用程序(由getInterface()返回的绑定程序代理)并再次返回到服务(作为releaseInterface()的参数 - 它是否仍然是代理,或原始??)。

App1和App2可以为同一个接口名称获取不同的绑定器对象(接口的不同实现)。这就是为什么我用粘合剂释放。

希望这不是太混乱!谢谢你的帮助。

卡尔蒂克

2 个答案:

答案 0 :(得分:8)

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

我不熟悉这种机制,但我发现在Android源代码中的LocationManagerService.java文件中使用此方法来注册/取消注册ILocationListener个对象。

答案 1 :(得分:0)

据我所知,这并不容易解决。 BinderProxy是android.os.Binder中的最后一个类。您可以找到来源here。一种解决方案可能是创建自己的类,扩展Binder并创建自己的实现,以便在BinderProxy中存储Binder的实例,或者反过来。很难,因为两个班都没有直接引用另一个。对不起,如果我误解了你的问题,或者就在这里。