android IPC通信機(jī)制梳理

相信寫過android程序的朋友都遇到過希望android組件之間能夠交換信息的情況吧。大家是如何做的呢刻像?這種情況又會分為兩種不同的場景

  • 通信的組件在同一種進(jìn)程中
  • 通信的組件在不同的進(jìn)程中
    對于第一種情況锹安,似乎并不復(fù)雜短荐,只需要想辦法讓其中一個組件獲得另一個組件的引用,然后進(jìn)行方法調(diào)用就可以了叹哭。不過需要注意的是忍宋,android框架的關(guān)鍵組件比如activity, Service, Broadcast Receiver, Content Provider對象都不是開發(fā)者在代碼里面通過new方法生成的,而是由Activity Manager Service(AMS)根據(jù)Manifest文件里面的配置信息在需要該組件的時候創(chuàng)建對象话速。這樣的話讶踪,要想取得其他組件的引用可能需要稍稍動點腦筋,比如說設(shè)置一個靜態(tài)變量來取得對另一個組件的引用泊交。

而在第二種情況乳讥,由于互相通信的組件不在同一個進(jìn)程,也就是說廓俭,它們是處在不同的虛擬機(jī)上面運(yùn)行的云石,所以它們之間是無法直接通信的。相信這點不難理解研乒,就好比兩個異地的戀人無法直接面對面交流了汹忠,就需要通過一些介質(zhì)以及渠道來進(jìn)行通信。而對于android ipc通信來說雹熬,這個介質(zhì)就是Binder了宽菜。android 框架為應(yīng)用層提供了一個IBinder接口。這個接口就是供請求IPC通信的組件使用來和另一個進(jìn)程的組件進(jìn)行通信的竿报。我們在這里以Activity和Service的通信作為例子铅乡。

1. 在Activity里調(diào)用startService()方法
AMS根據(jù)該方法里面的Intent參數(shù)以及Manifest里面的配置,創(chuàng)建對應(yīng)的Service對象烈菌,并調(diào)用相應(yīng)的生命周期方法阵幸。如果在自己定義的Service里需要和Activity進(jìn)行通信花履,就需要在該service內(nèi)部創(chuàng)建一個繼承Binder這個類的自定義Binder對象。而在這個Binder對象的構(gòu)造函數(shù)里會調(diào)用init()這個方法挚赊。這個方法內(nèi)部實際上是通過JNI調(diào)用C/C++層的init()方法生成了一個JavaBBinderHolder對象诡壁,并把該對象的指針放到自定義的Binder對象里。

2.在Activity里調(diào)用bindService()方法
在Activity里可以通過調(diào)用下面的方法來創(chuàng)建并綁定一個自定義的Service組件
<code> bindService(Intent intent,ServiceConnection conn,int flags) </code>
AMS根據(jù)方法里面的Intent參數(shù)找到對應(yīng)的Service對象荠割。而在Service類里面有個對應(yīng)的方法如下
<code>onBind(Intent intent)</code>
這個方法的返回值是一個Binder對象妹卿,而這個Binder對象也是實現(xiàn)了IBinder接口的對象,也就是說Service要想和Activity進(jìn)行通信涨共,就需要在自己這端定義一個Binder對象纽帖,然后通過onBind方法把這個對象交給AMS宠漩,然后就通過AMS來和另一個進(jìn)程的Activity進(jìn)行交流举反。AMS得到了這個Binder對象實際上就是得到了C/C++層的JavaBBinderHolder對象。當(dāng)AMS得到這個Binder對象后如何處理呢扒吁?還記得之前bindService()方法的第二個參數(shù)ServiceConnection類嗎火鼻?AMS會請求調(diào)用該對象里面onServiceConnected()方法,并根據(jù)Binder對象創(chuàng)建一個該對象的代言人對象BinderProxy對象雕崩,作為參數(shù)傳給該方法魁索。這樣在Activity里就會在自己定義的ServiceConnection對象的方法onServiceConnected()里面獲得該Binder對象,而此Binder對象就成了該Activity和Service進(jìn)行通信的一個橋梁盼铁。

3.調(diào)用IBinder.transact()方法
該方法實際上是通過底層的Binder驅(qū)動調(diào)用到C/C++層的JavaBBinder對象的tansact方法粗蔚,而該方法通過JNI來調(diào)用JAVA 層上Binder對象的execTransact()方法,并進(jìn)而調(diào)用開發(fā)者自己可以覆蓋的onTransact()方法從而達(dá)到了通信的目標(biāo)

IPC通信.png

以上就是我對android ipc通信的機(jī)制的一些梳理饶火,可能有不正確或者是不嚴(yán)謹(jǐn)?shù)牡胤脚艨兀M懈嗟娜四芙涣鳌_@也是我在簡書上的處子作肤寝,希望能通過寫文章不斷碰撞自己的思維当辐,也能夠認(rèn)識更多的朋友。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲤看,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子义桂,更是在濱河造成了極大的恐慌找筝,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袖裕,死亡現(xiàn)場離奇詭異陆赋,居然都是意外死亡攒岛,警方通過查閱死者的電腦和手機(jī)灾锯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門顺饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吵聪,“玉大人,你說我怎么就攤上這事兼雄∫魇牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵赦肋,是天一觀的道長块攒。 經(jīng)常有香客問我,道長佃乘,這世上最難降的妖魔是什么囱井? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趣避,結(jié)果婚禮上庞呕,老公的妹妹穿的比我還像新娘。我一直安慰自己程帕,他們只是感情好住练,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骆捧,像睡著了一般澎羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敛苇,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天妆绞,我揣著相機(jī)與錄音,去河邊找鬼枫攀。 笑死括饶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的来涨。 我是一名探鬼主播图焰,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹦掐!你這毒婦竟也來了技羔?” 一聲冷哼從身側(cè)響起僵闯,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藤滥,沒想到半個月后鳖粟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拙绊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年向图,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片标沪。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡榄攀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出金句,到底是詐尸還是另有隱情檩赢,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布趴梢,位于F島的核電站漠畜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坞靶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一蝴悉、第九天 我趴在偏房一處隱蔽的房頂上張望彰阴。 院中可真熱鬧,春花似錦拍冠、人聲如沸尿这。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽射众。三九已至,卻和暖如春晃财,著一層夾襖步出監(jiān)牢的瞬間叨橱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工断盛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留罗洗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓钢猛,卻偏偏與公主長得像伙菜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子命迈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,104評論 25 707
  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1贩绕、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2火的、Andro...
    隔壁老李頭閱讀 11,885評論 11 56
  • 依依,我今天從朋友那里回來淑倾,又繞到五一大道上去了卫玖,看看那里有沒有MQQ。上次也特意開車到東塘的友誼商店里去看了踊淳,售...
    笑曰閱讀 172評論 0 0
  • (1)天假瞬、地、人缺一不可迂尝。天之大脱茉,能容人和萬物;地之廣垄开,能讓人和萬物生存琴许;人之智,能讓天地為世間所用溉躲; (2)螞蟻...
    驚鴻獨舞閱讀 393評論 20 8
  • 最初關(guān)注貓叔是因為晚情的公眾號推薦榜田,晚情每次都要從評論里“捉貓”,還號召大家一起捉锻梳,所以當(dāng)時就認(rèn)為貓叔為人處事和個...
    領(lǐng)銜的蜜蜂閱讀 287評論 9 9