編輯:Android開發實例
我們要理解Android的消息系統,Looper,Handle,View等概念還是需要從消息系統的基本原理及其構造這個源頭開始。從這個源頭,我們才能很清楚的看到Android設計者設計消息系統之意圖及其設計的技術路線。
從一般的系統設計來講,一個消息循環系統的建立需要有以下幾個要素:
首先來研究一下消息驅動的基本模型,我使用如下的圖形來表示一個消息系統最基本構成:
上面的模型代表應用程序一直查詢自己的消息隊列,如果有有消息進來,應用消息處理函數中根據消息類型及其參數來作相應的處理。
消息系統要運作起來,必定有消息的產生和消費。我們可以從下圖看到消息生產和消費的一個基本的鏈條,這是一個最基本的,最簡單的消息系統。
生產線程將消息發送到消息隊列,消息消費者線程從消息隊列取出消息進行相應的處理。但是這樣簡單的模型對實際運行的系統來說是不夠的,例如對系統資源的消耗等不能很好的處理,我們就需要一個有旗語的消息系統模型,在上面的消息系統模型中加入了一個旗語,讓消息消費者線程在沒有消息隊列為空時,等待旗語,進入到掛起狀態,而有消息到達時,才被喚醒繼續運行。當然生產者同時也可以是消費者。
Android要建立一個消息系統使用了Looper,MessageQueue,Handler等概念,從上節的原理我們可以知道這些都是概念包裝,本質的東西就是消息隊列中消息的分發路徑的和消息分發處理方式的設計。Android巧妙的利用了對象抽象技術抽象出了Looper和Handler的概念。在Looper和Handler兩個概念的基礎上,通過View的處理函數框架,Android十分完美的達到消息分發的目的。
參照基本消息系統描述模型,我給出了Android消息系統整體框架,表示如下:
Android消息系統消息分發框架
Looper只是產生一個消息循環框架,首先Looper創建了消息隊列並把它掛接在Linux的線程上下文中,進入到取消息,並分發消息的循環當中。Handler對象在同一個線程上下文中取得消息隊列,對消息隊列進行封裝操作,最主要的就是SendMessage和擔當起dispatchMessage這個實際工作。外部系統需要向某個Android線程發送消息,必須通過屬於該AndroidThread的Handler這個對象進行。
Handler屬於某個線程,取決Handlerd對象在哪個線程中建立。Handler在構建時做了如下的默認動作:
Handler使用消息隊列進行對象封裝,提供如下的成員函數:
幾乎所有的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的運行位置。
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
酷酷的外表已經具備了,那就開始讓我們真正把它的功能給實現起來吧,外強中干,花拳繡腿可不行哦,我們需要真正的本領,需要一顆自強不息的心哦,常常想想自己的夢想什麼,這
在Android上開發一些小應用既可以積累知識又可以增加樂趣,與任務式開發不同
在Android Demo實例App->Activity->Cus