Android中Binder的“对象”与“引用”

    Binder不只是Android系统中的一个完善的IPC机制,它也能够被看成Android系统的一种RPC(远程过程调用)机制,由于Binder的功能就是在本地执行其余进程的功能。所以,进程在经过Binder获取将要调用的进程服务时,能够是一个本地对象,也能够是一个远程服务的引用

  这一点可能比较难以理解,里仁教育讲师稍候就会为你们分析,这里就先记住Binder不只能够与本地进程通讯,还能够与远程进程通讯;这里的本地进程就是咱们所说的本地对象,而远程进程则是咱们所说的远程服务的一个引用” php

    Binder的实质就是要把对象从一个进程映射到另外一个进程中,而无论这个对象是本地的仍是远程的。若是是本地对象,更好理解;若是是远程对象,就按照咱们上面所讲的来理解,即将远程对象的引用从一个进程映射到另外一个进程中,因而当使用这个远程对象时,实际上就是使用远程对象在本地的一个引用,相似于把这个远程对象看成一个本地对象在使用。这也就是Binder与其余IPC机制不一样的地方。spa

  这个本地对象与远程对象的引用有什么不一样呢?本地对象表示本地进程的地址空间的一个地址,而远程对象的引用则是一个抽象的32位句柄。它们之间是互斥的:全部的进程本地对象都是本地进程的一个地址(addressptrbinder),全部的远程进程的对象的引用都是一个句柄。对于发送者进程来讲,无论是对象仍是引用,它都会认为被发送的Binder对象是一个远程对象的句柄(即远程对象的引用”)对象

 

  可是,当Binder对象的数据被发送到远端接收进程时,远端接收进程则会认为该Binder对象是一个本地对象地址(即本地对象)。正如咱们以前说的,当Binder对象被接收进程接收后,无论该Binder对象是本地的仍是远程的,它都会被看成一个本地进程来处理。所以,从第三方的角度来讲,尽管名称不一样,对于一次完整的Binder调用,都将指向同一个对象,Binder驱动则负责两种不一样名称的对象的正确映射,这样才能把数据发送给正确的进程进行通讯。这个映射关系也是进程间引用对象的基础,对一个对象的引用,在远程是句柄,在本地则是地址(即本地对象的地址)进程

相关文章
相关标签/搜索