Android中Binder的「對象」與「引用」

    Binder不只是Android系統中的一個完善的IPC機制,它也能夠被看成Android系統的一種RPC(遠程過程調用)機制,由於Binder的功能就是在本地執行其餘進程的功能。所以,進程在經過Binder獲取將要調用的進程服務時,能夠是一個本地對象,也能夠是一個遠程服務的引用

  這一點可能比較難以理解,里仁教育講師稍候就會爲你們分析,這裏就先記住Binder不只能夠與本地進程通訊,還能夠與遠程進程通訊;這裏的本地進程就是咱們所說的本地對象,而遠程進程則是咱們所說的遠程服務的一個引用」 php

    Binder的實質就是要把對象從一個進程映射到另外一個進程中,而無論這個對象是本地的仍是遠程的。若是是本地對象,更好理解;若是是遠程對象,就按照咱們上面所講的來理解,即將遠程對象的引用從一個進程映射到另外一個進程中,因而當使用這個遠程對象時,實際上就是使用遠程對象在本地的一個引用,相似於把這個遠程對象看成一個本地對象在使用。這也就是Binder與其餘IPC機制不一樣的地方。spa

  這個本地對象與遠程對象的引用有什麼不一樣呢?本地對象表示本地進程的地址空間的一個地址,而遠程對象的引用則是一個抽象的32位句柄。它們之間是互斥的:全部的進程本地對象都是本地進程的一個地址(addressptrbinder),全部的遠程進程的對象的引用都是一個句柄。對於發送者進程來講,無論是對象仍是引用,它都會認爲被髮送的Binder對象是一個遠程對象的句柄(即遠程對象的引用」)對象

 

  可是,當Binder對象的數據被髮送到遠端接收進程時,遠端接收進程則會認爲該Binder對象是一個本地對象地址(即本地對象)。正如咱們以前說的,當Binder對象被接收進程接收後,無論該Binder對象是本地的仍是遠程的,它都會被看成一個本地進程來處理。所以,從第三方的角度來講,儘管名稱不一樣,對於一次完整的Binder調用,都將指向同一個對象,Binder驅動則負責兩種不一樣名稱的對象的正確映射,這樣才能把數據發送給正確的進程進行通訊。這個映射關係也是進程間引用對象的基礎,對一個對象的引用,在遠程是句柄,在本地則是地址(即本地對象的地址)進程

相關文章
相關標籤/搜索