Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android核心分析 之十一-------Android GWES之消息系統

Android核心分析 之十一-------Android GWES之消息系統

編輯:Android開發實例

   我們要理解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的運行位置。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved