這一點可能比較難以理解,里仁教育講師稍候就會爲你們分析,這裏就先記住Binder不只能夠與本地進程通訊,還能夠與遠程進程通訊;這裏的本地進程就是咱們所說的本地對象,而遠程進程則是咱們所說的遠程服務的一個「引用」 。php
Binder的實質就是要把對象從一個進程映射到另外一個進程中,而無論這個對象是本地的仍是遠程的。若是是本地對象,更好理解;若是是遠程對象,就按照咱們上面所講的來理解,即將遠程對象的「引用」從一個進程映射到另外一個進程中,因而當使用這個遠程對象時,實際上就是使用遠程對象在本地的一個「引用」,相似於把這個遠程對象看成一個本地對象在使用。這也就是Binder與其餘IPC機制不一樣的地方。spa
這個本地「對象」與遠程對象的「引用」有什麼不一樣呢?本地「對象」表示本地進程的地址空間的一個地址,而遠程對象的「引用」則是一個抽象的32位句柄。它們之間是互斥的:全部的進程本地對象都是本地進程的一個地址(address、ptr、binder),全部的遠程進程的對象的「引用」都是一個句柄。對於發送者進程來講,無論是「對象」仍是「引用」,它都會認爲被髮送的Binder對象是一個遠程對象的句柄(即遠程對象的「引用」)。對象
可是,當Binder對象的數據被髮送到遠端接收進程時,遠端接收進程則會認爲該Binder對象是一個本地對象地址(即本地對象)。正如咱們以前說的,當Binder對象被接收進程接收後,無論該Binder對象是本地的仍是遠程的,它都會被看成一個本地進程來處理。所以,從第三方的角度來講,儘管名稱不一樣,對於一次完整的Binder調用,都將指向同一個對象,Binder驅動則負責兩種不一樣名稱的對象的正確映射,這樣才能把數據發送給正確的進程進行通訊。這個映射關係也是進程間引用對象的基礎,對一個對象的引用,在遠程是句柄,在本地則是地址(即本地對象的地址)。進程