Android Framework學(xué)習(xí)之Looper的FileDescriptor

來(lái)說(shuō)說(shuō)Looper的副業(yè)

epoll_wait返回后茵汰,下面處理事件廊勃,總共eventCount個(gè)事件,每個(gè)事件都有一個(gè)fd经窖,

fd == mWakeEventFd: 表示有新消息坡垫,另外的一個(gè)線程往這個(gè)線程的queue里發(fā)送消息時(shí)會(huì)往eventFd里寫(xiě)東西

fd != mWaveEventFd: Looper的副業(yè), 別的FD有事件

別的FD是上面時(shí)候添加到epoll的呢画侣?

Looper的 addFd允許添加別的fd冰悠,Looper的epoll統(tǒng)一監(jiān)聽(tīng)他們的事件,這就是Looper的副業(yè)

參數(shù) fd: Fd本身

參數(shù) events: 監(jiān)聽(tīng)這個(gè)fd的什么事件

參數(shù) callback: 事件觸發(fā)了的話回調(diào)這個(gè)callback

addOnFileDescriptorEventListener: java層的方法配乱,MessageQueue里

framework里有哪些地方用到了這個(gè)副業(yè)

這個(gè)fd是SurfaceFlinger創(chuàng)建的溉卓,將讀的fd跨進(jìn)程傳到應(yīng)用,在Choreographer所在的線程里將fd添加到Looper的epoll里搬泥,SurfaceFlinger通過(guò)這個(gè)Fd通知(往fd里寫(xiě)東西)應(yīng)用VSync信號(hào)來(lái) 了

系統(tǒng)服務(wù)通知應(yīng)用進(jìn)程的兩種方案:

epoll_wait+fd方案:

應(yīng)用端通過(guò)epoll_wait桑寨,系統(tǒng)服務(wù)發(fā)消息通知,消息發(fā)出去后忿檩,應(yīng)用端什么時(shí)候處理尉尾,在什么線程處理完全有應(yīng)用端自己決定,這樣就很靈活燥透,整個(gè)過(guò)程對(duì)兩方來(lái)說(shuō)都是異步的沙咏,

binder調(diào)用:

????openConnection連到系統(tǒng)服務(wù)并將binder對(duì)象(bpBinder)傳到SurfaceFlinger, surfaceFlinger有什么需要通知應(yīng)用端就通過(guò)bpBinder發(fā)起binder調(diào)用,在應(yīng)用端的班套,整個(gè)過(guò)程的處理都是在binder線程里肢藐,如果這個(gè)binder調(diào)用不是oneway的話,會(huì)阻塞系統(tǒng)服務(wù)吱韭,是oneway的話系統(tǒng)服務(wù)就不會(huì)阻塞吆豹,對(duì)系統(tǒng)服務(wù)來(lái)說(shuō)是異步的過(guò)程,但是對(duì)應(yīng)用端來(lái)說(shuō)就是一個(gè)同步的過(guò)程,因?yàn)樵趹?yīng)用端痘煤,一個(gè)binder請(qǐng)求完成后binder驅(qū)動(dòng)才會(huì)將下一個(gè)binder請(qǐng)求給到應(yīng)用端鸳吸。

結(jié)論:

對(duì)于簡(jiǎn)單的通知,epoll_wait+fd方案比較好速勇,對(duì)于跨進(jìn)程函數(shù)調(diào)用還是binder調(diào)用比較好。

demo工程坎拐,TestPipeFd烦磁,測(cè)試Looper的副業(yè)

MainActivity和MyService運(yùn)行在不同進(jìn)程

MainActivity bindService -> MyService onServiceConnected 將binder返回給MainActivity -> MainActiviy 創(chuàng)建一個(gè) 管道, 這個(gè)管道有一對(duì)描述符(讀寫(xiě))哼勇, MainActivity通過(guò) binder調(diào)用 pushlishReadFd將 讀描述符 傳到 MyService進(jìn)程 -> MyService 通過(guò)epoll_wait? 監(jiān)聽(tīng)這個(gè) 讀 FD -> MainActivity往這個(gè)FD里寫(xiě)了個(gè)消息 -> MyService epoll_wait 就監(jiān)聽(tīng)到了 讀Fd事件都伪,將消息讀出來(lái) 通過(guò) binder調(diào)用 sendReply 返回給MainActivity ->? MainActivity將其顯示出來(lái)

Demo代碼部分

mFds[0]: 讀描述符, mFds[1]: 寫(xiě)描述符积担, 往寫(xiě)描述符里寫(xiě)一個(gè)消息陨晶,讀描述符就能收到事件,并將消息讀出來(lái)

這里通過(guò)bindService回調(diào)binder調(diào)用publish將mFds[0]發(fā)送到MyService帝璧,而不是startService通過(guò)Intent 將 mFds[0]傳給MyService先誉,是因?yàn)镮ntent不能傳遞Fd

點(diǎn)擊MainActivity的一個(gè)按鈕觸發(fā)writePipe,

MyService 端的代碼

queue.addOnFileDescriptorEventListener(fd, EVENT_INPUT, this):? 監(jiān)聽(tīng)fd的可讀事件的烁,當(dāng)這個(gè)描述符有可讀事件時(shí)褐耳,就會(huì)回調(diào)

this(onFileDescriptorEvents方法, MessageQueue類(lèi)里)

mCallback.onRecv: binder調(diào)用將消息返回給MainActivity

總結(jié):

????1. Looper里可以監(jiān)聽(tīng)其他描述符

????????Looper不僅可以監(jiān)聽(tīng)MessageQueue里的描述符,還可以監(jiān)聽(tīng)?wèi)?yīng)用端傳給他的描述符渴庆,這個(gè)描述符可以是文件铃芦,管道,Socket襟雷, 監(jiān)聽(tīng)方法: MessageQueue.addOnFileDescriptorEventListener

2. 創(chuàng)建管道刃滓,跨進(jìn)程傳數(shù)據(jù),用looper監(jiān)聽(tīng)描述符事件

????????可以在應(yīng)用層創(chuàng)建管道耸弄,?ParcelFileDescriptor.createPipe 返回 描述符數(shù)組fd[0]:讀咧虎,fd[1]:寫(xiě), 將其中一個(gè)描述符傳到另外一個(gè)進(jìn)程(通過(guò)binder調(diào)用)计呈,在另外一個(gè)進(jìn)程監(jiān)聽(tīng)這個(gè)描述符的事件老客,在一個(gè)進(jìn)程往fd寫(xiě)消息,另外一個(gè)進(jìn)程就能讀到這個(gè)消息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末震叮,一起剝皮案震驚了整個(gè)濱河市胧砰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苇瓣,老刑警劉巖尉间,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哲嘲,警方通過(guò)查閱死者的電腦和手機(jī)贪薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)眠副,“玉大人画切,你說(shuō)我怎么就攤上這事〈雅拢” “怎么了霍弹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娃弓。 經(jīng)常有香客問(wèn)我典格,道長(zhǎng),這世上最難降的妖魔是什么台丛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任耍缴,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己轨域,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布本鸣。 她就那樣靜靜地躺著,像睡著了一般硅蹦。 火紅的嫁衣襯著肌膚如雪荣德。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天童芹,我揣著相機(jī)與錄音涮瞻,去河邊找鬼。 笑死假褪,一個(gè)胖子當(dāng)著我的面吹牛署咽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播生音,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宁否,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缀遍?” 一聲冷哼從身側(cè)響起慕匠,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎域醇,沒(méi)想到半個(gè)月后台谊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蓉媳,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年锅铅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酪呻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盐须,死狀恐怖玩荠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贼邓,我是刑警寧澤阶冈,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站立帖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悠砚。R本人自食惡果不足惜晓勇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灌旧。 院中可真熱鬧绑咱,春花似錦、人聲如沸枢泰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衡蚂。三九已至窿克,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毛甲,已是汗流浹背年叮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玻募,地道東北人只损。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像七咧,于是被迫代替她去往敵國(guó)和親跃惫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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