目錄
一、binder的通訊機制是怎麼樣的?
1.1、binder通訊模型:
1.2、binder通訊步驟:
1.3、binder機制跨程序原理
二、intent傳遞物件時為什麼要序列化?
三、怎麼新建乙個程序?
四、mvp中的presenter的生命週期怎麼管理?
面試題五:binder詳解
可以模擬一下打**場景:a想要和b通話(a是client,b是server),需要乙個通訊錄和基站的支援。
而在binder通訊模型中:binder驅動就是基站的功能,servicemanager就是通訊錄的功能。
sm建立(建立通訊錄);首先有乙個程序向驅動提出申請為sm;驅動同意之後,sm程序負責管理service(注意這裡是service而不是server,因為如果通訊過程反過來的話,那麼原來的客戶端client也會成為服務端server)不過這時候通訊錄還是空的,乙個號碼都沒有。
各個server向sm註冊(完善通訊錄);每個server端程序啟動之後,向sm報告,我是zhangsan, 要找我請返回0x1234(這個位址沒有實際意義,模擬);其他server程序依次如此;這樣sm就建立了一張表,對應著各個server的名字和位址;就好比b與a見面了,說存個我的號碼吧,以後找我撥打10086;
首先,server程序要向sm註冊;告訴自己是誰,自己有什麼能力;在這個場景就是server告訴sm,它叫zhangsan,它有乙個object物件,可以執行add 操作;於是sm建立了一張表:zhangsan這個名字對應程序server;
然後client向sm查詢:我需要聯絡乙個名字叫做zhangsan的程序裡面的object物件;這時候關鍵來了:程序之間通訊的資料都會經過執行在核心空間裡面的驅動,驅動在資料流過的時候做了一點手腳,它並不會給client程序返回乙個真正的object物件,而是返回乙個看起來跟object一模一樣的**物件objectproxy,這個objectproxy也有乙個add方法,但是這個add方法沒有server程序裡面object物件的add方法那個能力;objectproxy的add只是乙個傀儡,它唯一做的事情就是把引數包裝然後交給驅動。(這裡我們簡化了sm的流程,見下文)
但是client程序並不知道驅動返回給它的物件動過手腳,畢竟偽裝的太像了,如假包換。client開開心心地拿著objectproxy物件然後呼叫add方法;我們說過,這個add什麼也不做,直接把引數做一些包裝然後直接**給binder驅動。
驅動收到這個訊息,發現是這個objectproxy;一查表就明白了:我之前用objectproxy替換了object傳送給client了,它真正應該要訪問的是object物件的add方法;於是binder驅動通知server程序,呼叫你的object物件的add方法,然後把結果發給我,sever程序收到這個訊息,照做之後將結果返回驅動,驅動然後把結果返回給client程序;於是整個過程就完成了。
由於驅動返回的objectproxy與server程序裡面原始的object是如此相似,給人感覺好像是直接把server程序裡面的物件object傳遞到了client程序;因此,我們可以說binder物件是可以進行跨程序傳遞的物件
但事實上我們知道,binder跨程序傳輸並不是真的把乙個物件傳輸到了另外乙個程序;傳輸過程好像是binder跨程序穿越的時候,它在乙個程序留下了乙個真身,在另外乙個程序幻化出乙個影子(這個影子可以很多個);client程序的操作其實是對於影子的操作,影子利用binder驅動最終讓真身完成操作。
理解這一點非常重要;務必仔細體會。另外,android系統實現這種機制使用的是**模式, 對於binder的訪問,如果是在同乙個程序(不需要跨程序),那麼直接返回原始的binder實體;如果在不同程序,那麼就給他乙個**物件(影子);我們在系統原始碼以及aidl的生成**裡面可以看到很多這種實現。
intent傳遞物件時為什麼要序列化
簡單來講,序列化的目的就是兩點:便於儲存,便於傳輸。
之所以需要將乙個物件序列化儲存到磁碟目錄中的乙個原因就是,有些物件可能很重要但卻占用不小的空間,往往一時半會還用不到,那麼將它們放置記憶體中顯然是一種浪費,而丟棄又將導致額外的操作來建立這些物件。
所以,一種折中解決辦法就是,先將這些物件序列化儲存進檔案,用的時候再從磁碟讀取,而這就是『序列化』。
序列化之後,便於儲存,便於傳輸。
面試題學習與複習二
目錄 1 glide 快取原理,如何設計乙個大圖載入框架。2 lrucache 原理 3 專案開發中遇到的最大的乙個難題和挑戰 4 說說你開發最大的優勢點 5 mvc mcp mvvp 的區別和各種使用場景,如何選擇適合自己的開發架構?6 事件分發機制。7 單例模式雙重加鎖,為什麼要這樣做。8 ha...
複習c語言 面試題
簡單直接排序 include intmain int n sizeof a sizeof a 0 int i,j,temp printf 原陣列為 for i 0 i i printf d a i printf n n for i 1 i n i a j temp printf 排序後陣列 for ...
大資料面試題 四 YARN面試題
無意中發現了乙個巨牛的人工智慧教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看 一樣!覺得太牛了,所以分享給大家。點這裡可以跳轉到教程。大資料面試寶典目錄,簡述hadoop1 與hadoop2 的架構異同 加入了yarn 解決了資源排程的問題。加入了對zookeeper...