1.3 IPC(進(jìn)程間通信)

Q:Android中進(jìn)程和線程的關(guān)系?區(qū)別毛秘?

進(jìn)程是操作系統(tǒng)分配和管理資源的單位饭寺,線程是CPU調(diào)度和管理的單位,是CPU調(diào)度的最小單元
進(jìn)程擁有獨(dú)立的地址空間叫挟,一個(gè)進(jìn)程崩潰后艰匙,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,而線程間共享地址空間抹恳,線程有自己的堆棧和局部變量员凝,一個(gè)線程崩潰會(huì)導(dǎo)致整個(gè)進(jìn)程崩潰掉。
一個(gè)進(jìn)程可包含多個(gè)線程奋献,即一個(gè)應(yīng)用程序上可以同時(shí)執(zhí)行多個(gè)任務(wù)健霹。

Q:為何需要進(jìn)行IPC?多進(jìn)程通信可能會(huì)出現(xiàn)什么問(wèn)題秽荞?

所有運(yùn)行在不同進(jìn)程的四大組件骤公,只要它們之間需要通過(guò)內(nèi)存共享數(shù)據(jù),都會(huì)共享失敗扬跋。由于Android為每個(gè)應(yīng)用分配了獨(dú)立的虛擬機(jī)阶捆,不同的虛擬機(jī)在內(nèi)存分配上有不同的地址空間
靜態(tài)變量和單例模式失效:由獨(dú)立的虛擬機(jī)造成。
線程同步機(jī)制失效:由獨(dú)立的虛擬機(jī)造成
SharedPreference的不可靠下降: SharedPreferences不支持兩個(gè)進(jìn)程同時(shí)進(jìn)行讀寫操作,即不支持并發(fā)讀寫洒试,有一定幾率導(dǎo)致數(shù)據(jù)丟失倍奢。
Application多次創(chuàng)建:Android系統(tǒng)會(huì)為新的進(jìn)程分配獨(dú)立虛擬機(jī),相當(dāng)于系統(tǒng)又把這個(gè)應(yīng)用重新啟動(dòng)了一次

Q:什么是序列化垒棋?Serializable接口和Parcelable接口的區(qū)別卒煞?為何推薦使用后者?

序列化表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)叼架。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸畔裕,也可以存儲(chǔ)到本地。
Serializable:Java序列化接口乖订,將一個(gè)對(duì)象轉(zhuǎn)化成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)扮饶,操作簡(jiǎn)單、效率低乍构、開(kāi)銷大甜无,ObjectOutputStream和ObjectInputStream過(guò)程都需要大量的I/O操作。適合將對(duì)象序列化到存儲(chǔ)設(shè)備或?qū)?duì)象序列化后通過(guò)網(wǎng)絡(luò)設(shè)備傳輸哥遮。
Parcelable:Android序列化接口岂丘,將一個(gè)對(duì)象進(jìn)行分解,且分解后的每一個(gè)部分都是傳遞可支持的類型眠饮。操作比較麻煩奥帘、效率高。主要用在內(nèi)存的序列化君仆。

Q:Android中為何新增Binder來(lái)作為主要的IPC方式翩概?

傳輸效率高、可操作性強(qiáng):傳輸效率主要影響因素是內(nèi)存拷貝的次數(shù)返咱,拷貝次數(shù)越少钥庇,傳輸速率越高。
實(shí)現(xiàn)C/S架構(gòu)方便:Linux的眾IPC方式除了Socket以外都不是基于C/S架構(gòu)咖摹,而Socket主要用于網(wǎng)絡(luò)間的通信且傳輸效率較低评姨。Binder基于C/S 架構(gòu) ,Server端與Client端相對(duì)獨(dú)立萤晴,穩(wěn)定性較好吐句。
安全性高:傳統(tǒng)Linux IPC的接收方無(wú)法獲得對(duì)方進(jìn)程可靠的UID/PID,從而無(wú)法鑒別對(duì)方身份店读;而B(niǎo)inder機(jī)制為每個(gè)進(jìn)程分配了UID/PID且在Binder通信時(shí)會(huì)根據(jù)UID/PID進(jìn)行有效性檢測(cè)嗦枢。

Q:使用Binder進(jìn)行數(shù)據(jù)傳輸?shù)木唧w過(guò)程?

通過(guò)AIDL實(shí)現(xiàn)方式解釋Binder數(shù)據(jù)傳輸?shù)木唧w過(guò)程

服務(wù)端中的Service給與其綁定的客戶端提供Binder對(duì)象屯断,客戶端通過(guò)AIDL接口中的asInterface()將這個(gè)Binder對(duì)象轉(zhuǎn)換為代理Proxy文虏,并通過(guò)它發(fā)起RPC請(qǐng)求侣诺。客戶端發(fā)起請(qǐng)求時(shí)會(huì)掛起當(dāng)前線程氧秘,并將參數(shù)寫入data然后調(diào)用transact()年鸳,RPC請(qǐng)求會(huì)通過(guò)系統(tǒng)底層封裝后由服務(wù)端的onTransact()處理,并將結(jié)果寫入reply丸相,最后返回調(diào)用結(jié)果并喚醒客戶端線程搔确。

image.png
Q:Binder框架中ServiceManager的作用?

在Binder框架定義了四個(gè)角色:Server灭忠,Client膳算,ServiceManager和Binder驅(qū)動(dòng)。其中Server更舞、Client畦幢、ServiceManager運(yùn)行于用戶空間,Binder驅(qū)動(dòng)運(yùn)行于內(nèi)核空間缆蝉。
ServiceManager:服務(wù)的管理者,將Binder名字轉(zhuǎn)換為Client中對(duì)該Binder的引用瘦真,使得Client可以通過(guò)Binder名字獲得Server中Binder實(shí)體的引用刊头。
Server&Client:服務(wù)器&客戶端。在Binder驅(qū)動(dòng)和ServiceManager提供的基礎(chǔ)設(shè)施上诸尽,進(jìn)行Client-Server之間的通信原杂。

Q:Android中有哪些基于Binder的IPC方式?簡(jiǎn)單對(duì)比下您机?

Bundle:Bundle實(shí)現(xiàn)了Parcelable接口穿肄,方便在不同的進(jìn)程中傳輸數(shù)據(jù)。支持在activity际看、service咸产、receiver之間通過(guò)intent.putExtra()傳遞Bundle數(shù)據(jù)。Bundle內(nèi)部是通過(guò)ArrayMap來(lái)存取數(shù)據(jù)仲闽。Bundle不支持的數(shù)據(jù)類型無(wú)法在進(jìn)程中被傳遞
Messager:底層實(shí)現(xiàn)是AIDL脑溢,即對(duì)AIDL進(jìn)行了封裝,更便于進(jìn)行進(jìn)程間通信赖欣。支持一對(duì)多串行通信屑彻,支持實(shí)時(shí)通信。
文件共享:兩個(gè)進(jìn)程通過(guò)讀/寫同一個(gè)文件來(lái)交換數(shù)據(jù)顶吮。比如A進(jìn)程把數(shù)據(jù)寫入文件社牲,B進(jìn)程通過(guò)讀取這個(gè)文件來(lái)獲取數(shù)據(jù)。對(duì)數(shù)據(jù)同步要求不高的進(jìn)程之間進(jìn)行通信悴了,并且要妥善處理并發(fā)讀/寫的問(wèn)題搏恤。
ContentProvider:專門用來(lái)進(jìn)行不同應(yīng)用間數(shù)據(jù)共享的方式汗菜。
AIDL:支持一對(duì)多并發(fā)通信,支持實(shí)時(shí)通信挑社。
Socket:不僅可跨進(jìn)程陨界,還可以跨設(shè)備通信。網(wǎng)絡(luò)數(shù)據(jù)交換


image.png
Q:是否了解AIDL痛阻?原理是什么菌瘪?如何優(yōu)化多模塊都使用AIDL的情況?

如果在一個(gè)進(jìn)程中要調(diào)用另一個(gè)進(jìn)程中對(duì)象的方法阱当,可使用AIDL生成可序列化的參數(shù)俏扩,AIDL會(huì)生成一個(gè)服務(wù)端對(duì)象的代理類,通過(guò)它客戶端實(shí)現(xiàn)間接調(diào)用服務(wù)端對(duì)象的方法弊添。
當(dāng)有多個(gè)業(yè)務(wù)模塊都需要AIDL來(lái)進(jìn)行IPC录淡,此時(shí)需要為每個(gè)模塊創(chuàng)建特定的aidl文件,那么相應(yīng)的Service就會(huì)很多油坝。必然會(huì)出現(xiàn)系統(tǒng)資源耗費(fèi)嚴(yán)重嫉戚、應(yīng)用過(guò)度重量級(jí)的問(wèn)題。解決辦法是建立Binder連接池澈圈,即將每個(gè)業(yè)務(wù)模塊的Binder請(qǐng)求統(tǒng)一轉(zhuǎn)發(fā)到一個(gè)遠(yuǎn)程Service中去執(zhí)行彬檀,從而避免重復(fù)創(chuàng)建Service。
每個(gè)業(yè)務(wù)模塊創(chuàng)建自己的AIDL接口并實(shí)現(xiàn)此接口瞬女,然后向服務(wù)端提供自己的唯一標(biāo)識(shí)和其對(duì)應(yīng)的Binder對(duì)象窍帝。服務(wù)端只需要一個(gè)Service,服務(wù)器提供一個(gè)queryBinder接口诽偷,它會(huì)根據(jù)業(yè)務(wù)模塊的特征來(lái)返回相應(yīng)的Binder對(duì)像坤学,不同的業(yè)務(wù)模塊拿到所需的Binder對(duì)象后就可進(jìn)行遠(yuǎn)程方法的調(diào)用了

Q.Binder到底是什么?

通常意義下报慕,Binder指的是一種通信機(jī)制深浮;我們說(shuō)AIDL使用Binder進(jìn)行通信,指的就是Binder這種IPC機(jī)制卖子。
1略号、對(duì)于Server進(jìn)程來(lái)說(shuō),Binder指的是Binder本地對(duì)象
2洋闽、對(duì)于Client來(lái)說(shuō)玄柠,Binder指的是Binder代理對(duì)象,它只是Binder本地對(duì)象的一個(gè)遠(yuǎn)程代理诫舅;對(duì)這個(gè)Binder代理對(duì)象的操作羽利,會(huì)通過(guò)驅(qū)動(dòng)最終轉(zhuǎn)發(fā)到Binder本地對(duì)象上去完成;對(duì)于一個(gè)擁有Binder對(duì)象的使用者而言刊懈,它無(wú)須關(guān)心這是一個(gè)Binder代理對(duì)象還
3这弧、Binder本地對(duì)象娃闲;對(duì)于代理對(duì)象的操作和對(duì)本地對(duì)象的操作對(duì)它來(lái)說(shuō)沒(méi)有區(qū)別。
4匾浪、對(duì)于傳輸過(guò)程而言皇帮,Binder是可以進(jìn)行跨進(jìn)程傳遞的對(duì)象;Binder驅(qū)動(dòng)會(huì)對(duì)具有跨進(jìn)程傳遞能力的對(duì)象做特殊處理:自動(dòng)完成代理對(duì)象和本地對(duì)象的轉(zhuǎn)換蛋辈。

詳細(xì)解讀IPC通信

http://www.reibang.com/p/88fd0dcd0528

image.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轻专,一起剝皮案震驚了整個(gè)濱河市亭枷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌色瘩,老刑警劉巖采驻,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撑螺,死亡現(xiàn)場(chǎng)離奇詭異进泼,居然都是意外死亡任岸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門苗胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)襟诸,“玉大人,你說(shuō)我怎么就攤上這事柒巫±ぃ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵堡掏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我刨疼,道長(zhǎng)泉唁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任揩慕,我火速辦了婚禮亭畜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迎卤。我一直安慰自己拴鸵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蜗搔。 她就那樣靜靜地躺著劲藐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樟凄。 梳的紋絲不亂的頭發(fā)上聘芜,一...
    開(kāi)封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音缝龄,去河邊找鬼汰现。 笑死挂谍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞎饲。 我是一名探鬼主播口叙,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗅战!你這毒婦竟也來(lái)了妄田?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仗哨,失蹤者是張志新(化名)和其女友劉穎形庭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厌漂,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萨醒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苇倡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片富纸。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旨椒,靈堂內(nèi)的尸體忽然破棺而出晓褪,到底是詐尸還是另有隱情,我是刑警寧澤综慎,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布涣仿,位于F島的核電站,受9級(jí)特大地震影響示惊,放射性物質(zhì)發(fā)生泄漏好港。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一米罚、第九天 我趴在偏房一處隱蔽的房頂上張望钧汹。 院中可真熱鬧,春花似錦录择、人聲如沸拔莱。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塘秦。三九已至,卻和暖如春货裹,著一層夾襖步出監(jiān)牢的瞬間嗤形,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工弧圆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赋兵,地道東北人笔咽。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像霹期,于是被迫代替她去往敵國(guó)和親叶组。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容