Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析

Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析

ID:41008726

大小:155.99 KB

頁數(shù):29頁

時間:2019-08-13

Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析_第1頁
Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析_第2頁
Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析_第3頁
Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析_第4頁
Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析_第5頁
資源描述:

《Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、Android應(yīng)用程序是通過消息來驅(qū)動的,系統(tǒng)為每一個應(yīng)用程序維護(hù)一個消息隊例,應(yīng)用程序的主線程不斷地從這個消息隊例中獲取消息(Looper),然后對這些消息進(jìn)行處理(Handler),這樣就實現(xiàn)了通過消息來驅(qū)動應(yīng)用程序的執(zhí)行,本文將詳細(xì)分析Android應(yīng)用程序的消息處理機(jī)制。?????前面我們學(xué)習(xí)Android應(yīng)用程序中的Activity啟動(Android應(yīng)用程序啟動過程源代碼分析和Android應(yīng)用程序內(nèi)部啟動Activity過程(startActivity)的源代碼分析)、Service啟動

2、(Android系統(tǒng)在新進(jìn)程中啟動自定義服務(wù)過程(startService)的原理分析和Android應(yīng)用程序綁定服務(wù)(bindService)的過程源代碼分析)以及廣播發(fā)送(Android應(yīng)用程序發(fā)送廣播(sendBroadcast)的過程分析)時,它們都有一個共同的特點(diǎn),當(dāng)ActivityManagerService需要與應(yīng)用程序進(jìn)行并互時,如加載Activity和Service、處理廣播待,會通過Binder進(jìn)程間通信機(jī)制來知會應(yīng)用程序,應(yīng)用程序接收到這個請求時,它不是馬上就處理這個請求,而是將

3、這個請求封裝成一個消息,然后把這個消息放在應(yīng)用程序的消息隊列中去,然后再通過消息循環(huán)來處理這個消息。這樣做的好處就是消息的發(fā)送方只要把消息發(fā)送到應(yīng)用程序的消息隊列中去就行了,它可以馬上返回去處理別的事情,而不需要等待消息的接收方去處理完這個消息才返回,這樣就可以提高系統(tǒng)的并發(fā)性。實質(zhì)上,這就是一種異步處理機(jī)制。?????這樣說可能還是比較籠統(tǒng),我們以Android應(yīng)用程序啟動過程源代碼分析一文中所介紹的應(yīng)用程序啟動過程的一個片斷來具體看看是如何這種消息處理機(jī)制的。在這篇文章中,要啟動的應(yīng)用程序稱為Ac

4、tivity,它的默認(rèn)Activity是MainActivity,它是由Launcher來負(fù)責(zé)啟動的,而Launcher又是通過ActivityManagerService來啟動的,當(dāng)ActivityManagerService為這個即將要啟的應(yīng)用程序準(zhǔn)備好新的進(jìn)程后,便通過一個Binder進(jìn)程間通信過程來通知這個新的進(jìn)程來加載MainActivity,如下圖所示:?????它對應(yīng)Android應(yīng)用程序啟動過程中的Step30到Step35,有興趣的讀者可以回過頭去參考Android應(yīng)用程序啟動過程源

5、代碼分析一文。這里的Step30中的scheduleLaunchActivity是ActivityManagerService通過Binder進(jìn)程間通信機(jī)制發(fā)送過來的請求,它請求應(yīng)用程序中的ActivityThread執(zhí)行Step34中的performLaunchActivity操作,即啟動MainActivity的操作。這里我們就可以看到,Step30的這個請求并沒有等待Step34這個操作完成就返回了,它只是把這個請求封裝成一個消息,然后通過Step31中的queueOrSendMessage操作

6、把這個消息放到應(yīng)用程序的消息隊列中,然后就返回了。應(yīng)用程序發(fā)現(xiàn)消息隊列中有消息時,就會通過Step32中的handleMessage操作來處理這個消息,即調(diào)用Step33中的handleLaunchActivity來執(zhí)行實際的加載MainAcitivy類的操作。?????了解Android應(yīng)用程序的消息處理過程之后,我們就開始分樣它的實現(xiàn)原理了。與Windows應(yīng)用程序的消息處理過程一樣,Android應(yīng)用程序的消息處理機(jī)制也是由消息循環(huán)、消息發(fā)送和消息處理這三個部分組成的,接下來,我們就詳細(xì)描述這三

7、個過程。?????1.消息循環(huán)?????在消息處理機(jī)制中,消息都是存放在一個消息隊列中去,而應(yīng)用程序的主線程就是圍繞這個消息隊列進(jìn)入一個無限循環(huán)的,直到應(yīng)用程序退出。如果隊列中有消息,應(yīng)用程序的主線程就會把它取出來,并分發(fā)給相應(yīng)的Handler進(jìn)行處理;如果隊列中沒有消息,應(yīng)用程序的主線程就會進(jìn)入空閑等待狀態(tài),等待下一個消息的到來。在Android應(yīng)用程序中,這個消息循環(huán)過程是由Looper類來實現(xiàn)的,它定義在frameworks/base/core/java/android/os/Looper.ja

8、va文件中,在分析這個類之前,我們先看一下Android應(yīng)用程序主線程是如何進(jìn)入到這個消息循環(huán)中去的。?????在Android應(yīng)用程序進(jìn)程啟動過程的源代碼分析一文中,我們分析了Android應(yīng)用程序進(jìn)程的啟動過程,Android應(yīng)用程序進(jìn)程在啟動的時候,會在進(jìn)程中加載ActivityThread類,并且執(zhí)行這個類的main函數(shù),應(yīng)用程序的消息循環(huán)過程就是在這個main函數(shù)里面實現(xiàn)的,我們來看看這個函數(shù)的實現(xiàn),它定義在frameworks/base/co

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

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

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