Android消息機(jī)制源碼解析

Android消息機(jī)制源碼解析

ID:41122041

大小:126.50 KB

頁數(shù):6頁

時(shí)間:2019-08-16

Android消息機(jī)制源碼解析_第1頁
Android消息機(jī)制源碼解析_第2頁
Android消息機(jī)制源碼解析_第3頁
Android消息機(jī)制源碼解析_第4頁
Android消息機(jī)制源碼解析_第5頁
資源描述:

《Android消息機(jī)制源碼解析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、我寫這篇日志的初衷,是想讓每個(gè)初學(xué)Android應(yīng)用開發(fā)的同學(xué)們(高手就飄過吧~~)弄明白Android消息機(jī)制的原理和底層實(shí)現(xiàn)方式,至于大家能否對(duì)Android消息機(jī)制徹底弄明白,純粹是對(duì)我個(gè)人表達(dá)能力的一次巨大挑戰(zhàn)。因?yàn)锳ndroid事件機(jī)制和代碼實(shí)現(xiàn),對(duì)已經(jīng)具備Java或C++語言語法基礎(chǔ)的人來講,其實(shí)是并不難理解的。在我看來,消息機(jī)制有2大應(yīng)用場合,一是GUI程序設(shè)計(jì),比如我們用鼠標(biāo)在一個(gè)程序界面上實(shí)施鼠標(biāo)點(diǎn)擊,拖拽,鍵盤輸入等動(dòng)作,程序一般便會(huì)執(zhí)行預(yù)期的效果。二是后臺(tái)服務(wù)程序,沒有程序界面的那種。比如說

2、一些銀行金融產(chǎn)品軟件,電信設(shè)備的操作維護(hù)平臺(tái)軟件等。我們一次網(wǎng)上銀行匯款,一次撥打電話行為,都會(huì)激發(fā)大量的系統(tǒng)內(nèi)部消息和消息處理動(dòng)作,這類系統(tǒng)往往還會(huì)添加分布式組件模塊,屏蔽消息跨平臺(tái)的發(fā)送和接收機(jī)制,但其核心設(shè)計(jì)思想仍基于GUI程序的消息處理模型。既然如此,我們從GUI程序說起吧。在界面上,一個(gè)看似簡單的操作背后,其實(shí)隱藏了GUI程序設(shè)計(jì)核心的三要素:線程,消息隊(duì)列和消息響應(yīng)函數(shù)。當(dāng)然了,還有些具體的細(xì)節(jié)過程,比如如何發(fā)送消息,取得消息,執(zhí)行消息響應(yīng)函數(shù),消息循環(huán)的停止等。為便于更好的說明這三要素,我把線程,消

3、息隊(duì)列和消息響應(yīng)函數(shù),變通成一個(gè)郵局的工作流,可以把郵遞員看成是線程,郵件看成是消息,那么郵筒就是一個(gè)消息隊(duì)列了,郵遞員把郵件投遞到郵件接收者的過程看成消息的響應(yīng)函數(shù)。郵局的工作流程大概如下圖:簡單說明:頭天路人甲,乙,丙分別向郵局的郵筒里投遞了3封郵件:mail1,mail2,mail3,拼命三郎今早上班時(shí)和往常一樣從郵筒中取郵件時(shí)發(fā)現(xiàn)了這3封郵件,然后騎上自備的電爐樂呵樂呵的按照mail1,mail2,mail3上的地址送到接收人手里,然后再返回郵件取新的郵件,運(yùn)氣不錯(cuò),拼命三郎沒取到新的郵件,可以好好歇歇了

4、^_^。但我們還不能歇息,繼續(xù)探究拼命三郎取送郵件的過程,和Android消息機(jī)制的關(guān)聯(lián)性,探究完了我們也就明白Android消息機(jī)制的來龍去脈了。下面掌聲有請(qǐng)Android消息機(jī)制的三大部件隆重登場(鼓掌~~~)Thread:大家好,我是線程,關(guān)于我的身世我在這里沒什么好講的,有興趣的同學(xué)可以參閱操作系統(tǒng)的原理方面的書籍和資料,里面會(huì)有我前世今生的詳細(xì)介紹。平常,大家沒少跟我打交道。諸位最愿意干的事情就是在我的Run方法里寫一個(gè)帶while循環(huán)的函數(shù),讓我不停地在這個(gè)函數(shù)里面兜圈。老實(shí)講,雖然這樣讓我很累,和感

5、覺些許的無聊,但這是我的職責(zé)所在——毫無怨言的執(zhí)行Run方法的代碼指令,我的這個(gè)特點(diǎn)和上圖中的整天不停取,送郵件的拼命三郎很像吧。Looper:各位同學(xué)好,我的名字大伙都認(rèn)識(shí)的,大家猜猜我是什么循環(huán)者?xx:等等,這個(gè)聽上去很熟啊,Thread不是經(jīng)常在Run方法里做循環(huán)的嘛?!你能說講你和Thread是什么關(guān)系?Looper繼續(xù)道:xx同學(xué)將來一定是塊寫程序的料,思維很有想象力嘛。在我內(nèi)部,確實(shí)有一個(gè)叫l(wèi)oop的消息循環(huán)函數(shù)和一個(gè)消息隊(duì)列。我再透露一點(diǎn),在我的一個(gè)實(shí)例產(chǎn)生時(shí),它就被上天安排和一個(gè)Thread男綁

6、定在一起的時(shí)候,可以說是真正意義上的執(zhí)子之手白頭到老了。從那刻起,我便擁有了Thread一生,Thread對(duì)我也是不離不棄。為什么?一個(gè)線程永遠(yuǎn)只能擁有一個(gè)Looper對(duì)象,同時(shí)Thread在run方法中會(huì)進(jìn)入我的loop消息循環(huán)。不管白天和黑夜,Thread做的事情只有一件:永不停歇地從我的消息隊(duì)列里獲取消息,然后執(zhí)行消息的target定義的行為——這就是傳說中的消息循環(huán),直到程序主動(dòng)退出循環(huán)。執(zhí)行消息的target定義的行為,這點(diǎn)和拼命三郎,根據(jù)郵件的收信人的地址送信一樣啊,不同的接收人地址,決定了送郵件的

7、路徑和路程是不一樣的。同樣的,不同的消息其處理方式也是不一樣的。Handler:大家辛苦了,久等了,我接著剛才Looper說到的—消息的target說起,消息的target實(shí)際的扮演者就是我啦。從我的名字也顯現(xiàn)了我的身份——處理者,即消息響應(yīng)處理者。還有一點(diǎn):大家知道Looper中消息隊(duì)列中是怎么來的嗎?嗯,對(duì),答案是通過我投遞的。那我是怎么拿到Looper的消息隊(duì)列的呢?其實(shí),在new一個(gè)我的實(shí)例的時(shí)候,會(huì)有個(gè)Looper實(shí)例也跟我綁定一下,這樣通過我發(fā)送的消息就自動(dòng)添加到對(duì)應(yīng)Looper的消息隊(duì)列了,通過

8、上面Looper的自我介紹,也就決定了這條消息是發(fā)個(gè)那個(gè)線程的,是吧^_^。通過上面三大部件的一段真情對(duì)白,相信大家對(duì)Android事件機(jī)制已經(jīng)有了清晰的感性認(rèn)識(shí)吧。下面我們再從代碼實(shí)現(xiàn)的角度來剖析:首先,看看一個(gè)Looper對(duì)象如何跟一個(gè)Thread對(duì)象綁定的,這里我拿HandlerThread作為解剖標(biāo)本,它的類是AndroidSDK中自帶Looper的線程子類,重點(diǎn)

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。