# Android?GWES之Android消息系統
Looper,Handler,View
我們要理解Android的消息系統,Looper,Handle,View等概念還是需要從消息系統的基本原理及其構造這個源頭開始。從這個源頭,我們才能很清楚的看到Android設計者設計消息系統之意圖及其設計的技術路線。
### 消息系統的基本原理
從一般的系統設計來講,一個消息循環系統的建立需要有以下幾個要素:
- ?消息隊列
- ?發送消息
- ?消息讀取
- 消息分發
- ?消息循環線程
首先來研究一下消息驅動的基本模型,我使用如下的圖形來表示一個消息系統最基本構成:

上面的模型代表應用程序一直查詢自己的消息隊列,如果有有消息進來,應用消息處理函數中根據消息類型及其參數來作相應的處理。
消息系統要運作起來,必定有消息的產生和消費。我們可以從下圖看到消息生產和消費的一個基本的鏈條,這是一個最基本的,最簡單的消息系統。

生產線程將消息發送到消息隊列,消息消費者線程從消息隊列取出消息進行相應的處理。但是這樣簡單的模型對實際運行的系統來說是不夠的,例如對系統資源的消耗等不能很好的處理,我們就需要一個有旗語的消息系統模型,在上面的消息系統模型中加入了一個旗語,讓消息消費者線程在沒有消息隊列為空時,等待旗語,進入到掛起狀態,而有消息到達時,才被喚醒繼續運行。當然生產者同時也可以是消費者。

### 2?Android的消息模型
Android要建立一個消息系統使用了Looper,MessageQueue,Handler等概念,從上節的原理我們可以知道這些都是概念包裝,本質的東西就是消息隊列中消息的分發路徑的和消息分發處理方式的設計。Android巧妙的利用了對象抽象技術抽象出了Looper和Handler的概念。在Looper和Handler兩個概念的基礎上,通過View的處理函數框架,Android十分完美的達到消息分發的目的。
參照基本消息系統描述模型,我給出了Android消息系統整體框架,表示如下:

Android消息系統消息分發框架

### 3?Looper,Handler詳解
Looper只是產生一個消息循環框架,首先Looper創建了消息隊列并把它掛接在Linux的線程上下文中,進入到取消息,并分發消息的循環當中。Handler對象在同一個線程上下文中取得消息隊列,對消息隊列進行封裝操作,最主要的就是SendMessage和擔當起dispatchMessage這個實際工作。外部系統需要向某個Android線程發送消息,必須通過屬于該AndroidThread的Handler這個對象進行。

Handler屬于某個線程,取決Handlerd對象在哪個線程中建立。Handler在構建時做了如下的默認動作:
- l?從線程上下文取得Looper。
- l?通過Looper獲取到消息隊列并記錄在自己的成員mQueue變量中
Handler使用消息隊列進行對象封裝,提供如下的成員函數:
- l?通過??post(Runnable?r)發送。Runnable是消息處理的回調函數,通過該消息的發送,引起Runable?的回調運行,Post消息放置消息隊列的前面。Message.callback=Runable.
- l?通過?sendMessage發送。放置在所有的Post消息之后,sendMessage發送消息.
- l?dispatchMessage分發消息。消息帶有回調函數,則執行消息回調函數,如何沒有則使用默認處理函數:handleMessage。而handleMessage往往被重載成某個繼承Handler對象的新的特定的handleMessage。
幾乎所有的Message發送時,都指定了target。Message.target=(this).
Looper運行在Activity何處?我們現在可以從代碼堆棧中縱觀一下Looper的位置。
NaiveStart.main()
ZygoteInit.main
ZygoteInit$MethodAndArgsCall.run
Method.Invoke
method.invokeNative
ActivityThread.main()
Looper.loop()
ViewRoot$RootHandler().dispatch()
handleMessage
....
這樣我們就更清楚的了解到Looper的運行位置。
- 前言
- (一)分析方法論探討之設計意圖
- (二)方法論探討之概念空間篇
- (三)手機之硬件形態
- (四)手機的軟件形態
- (五)基本空間劃分
- (六)IPC框架分析 Binder,Service,Service manager
- (七)Service深入分析
- (八)Android 啟動過程詳解
- (九)Zygote Service
- (十)Android GWES之基本原理篇
- (十一)Android GWES之消息系統
- (十二)Android GEWS窗口管理之基本架構原理
- (十三)Android GWES之Android窗口管理
- (十四)Android GWES之輸入系統
- (十五)Android輸入系統之輸入路徑詳解
- (十六)Android電話系統-概述篇
- (十七)電話系統之rilD
- (十八)Android電話系統之RIL-Java
- (十九)電話系統之GSMCallTacker
- (二十)Android應用程序框架之無邊界設計意圖
- (二十一)Android應用框架之AndroidApplication
- (二十二)Android應用框架之Activity
- (二十三)Andoird GDI之基本原理及其總體框架
- (二十四)Android GDI之顯示緩沖管理
- (二十五)Android GDI之共享緩沖區機制
- (二十六)Android GDI之SurfaceFlinger
- (二十七)Android GDI 之SurfaceFlinger之動態結構示意圖
- (二十八)Android GDI之Surface&Canvas