Android 跨进程的时候传递过来的数据,每次都是副本也就是说每次拿到的对象即使是一个进程传来的同一对象对对方来讲也是不同的,那么IBinder 对象为什么能作为key保证每个进程的数据隔离?
IBinder 在跨进程传递时并不是同一个对象
但它们的 hashCode() 和 equals() 方法被特殊处理过,以确保能够正确工作。
让我解释下具体原理:
// 在代理对象中的实现
public int hashCode() {
// 返回底层原始 Binder 对象的 ID
return mRemote.getInterfaceDescriptor().hashCode();
}
关键点在于:
- 不同进程中的代理对象虽然是不同的实例,但它们都指向同一个底层 Binder
- hashCode() 返回的是底层 Binder 的标识符,而不是代理对象本身的内存地址
- equals() 比较的也是底层 Binder 的身份,而不是代理对象本身
这就是为什么用 HashMap 存储跨进程的 IBinder 对象仍然可以正常工作的原因。Android 系统通过重写这些关键方法,确保了跨进程的对象标识符的一致性。