android - 如何检查两个Android Binder 代理对象是否相等?

标签 android android-binder

我有一个关于 Android Binder 的问题。如果我没理解错的话,一个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 );

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

假设有 App1 和 App2。每个人都做'binder1 = getInterface(“SomeInterface1”);'并为动态加载的接口(interface)“SomeInterface1”获取 Binder 。使用后,应用程序通过说“releaseInterface(binder1);”来释放接口(interface)绑定(bind)器。以便服务可以卸载接口(interface)的 dex 代码并进行一些清理。

但是,除非App1 和App2 都释放了interface binder,否则无法卸载界面dex 代码。因此,在服务中,我为每个动态加载的 Binder 维护一个引用计数。 (比如一个 Map key{Binder} ==> value{reference count})。当应用执行 getInterface() 时,我会增加引用计数。当它执行 releaseInterface(binder1) 时,我应该减少引用计数。但是,为此,我需要检查 binder1 是否等于 Map 中的 Binder 键。

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

有可能App1和App2对于同一个接口(interface)名得到不同的binder对象(一个接口(interface)的不同实现)。这就是为什么,我使用 Binder 来释放。

希望这不会太困惑!感谢您的帮助。

卡提克

最佳答案

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

我不熟悉这个机制,但是我看到Android源代码中的LocationManagerService.java文件中使用了这个方法来注册/注销ILocationListener对象。

关于android - 如何检查两个Android Binder 代理对象是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11467367/

相关文章:

android - AppCompatActivity 相对于 ActionBarActivity 的增强是什么?

java - Android 中的 Binder 事务失败

Android binder - 将binder调用限制在一个进程

android - 更改源后更新 apk 文件 - Android Eclipse

android - 在 Android 上获取动态壁纸的图像/屏幕截图?

c - 什么是强指针和弱指针

android - Intents中binder driver的参与(IPC的一种形式)

java - 字符串替换方法在 android studio 中不起作用

android.support.design.widget.TextInputLayout 给出 InflateException