Android Framework核心之旅

來源:互聯網
上載者:User

Android Framework核心之旅

6.1  Framework架構

Framework定義了用戶端組件和服務端組件功能及介面。以下闡述中,“應用程式”一般是指“.apk”程式。

架構中包含三個主要部分,分別為服務端、用戶端和Linux驅動。

6.1.1 服務端

服務端主要包含兩個重要類,分別是WindowManagerService(WmS)和ActivityManagerService
(AmS)。WmS的作用是為所有的應用程式分配視窗,並管理這些視窗。包括分配視窗的大小,調節各視窗的疊放次序,隱藏或者顯示視窗。AmS的作用是管理所有應用程式中的Activity。

除此之外,在服務端還包括兩個訊息處理類。

KeyQ類:該類為WmS的內部類,繼承於KeyInputQueue類,KeyQ對象一旦建立,就立即啟動一個線程,該線程會不斷地讀取使用者的UI操作訊息,比如按鍵、觸控螢幕、trackball、滑鼠等,並把這些訊息放到一個訊息佇列QueueEvent類中。

InputDispatcherThread類:該類的對象一旦建立,也會立即啟動一個線程,該線程會不斷地從QueueEvent中取出使用者訊息,並進行一定的過濾,過濾後,再將這些訊息發送給當前活動的用戶端程式中。

6.1.2  用戶端                        

用戶端主要包括以下重要類。

ActivityThread類:該類為應用程式的主線程類,所有的APK程式都有且僅有一個ActivityThread類,程式的入口為該類中的static main()函數。

Activity類:該類為APK程式的一個最小運行單元,一個APK程式中可以包含多個Activity對象,ActivityThread主類會根據使用者操作選擇運行哪個Activity對象。

PhoneWindow類:該類繼承於Window類,同時,PhoneWindow類內部包含了一個DecorView對象。簡而言之,PhoneWindow是把一個FrameLayout進行了一定的封裝,並提供了一組通用的視窗操作介面。

Window類:該類提供了一組通用的視窗(Window)操作API,這裡的視窗僅僅是程式層面上的,WmS所管理的視窗並不是Window類,而是一個View或者ViewGroup類,一般就是指DecorView類,即一個DecorView就是WmS所管理的一個視窗。Window是一個abstract類型。

DecorView類:該類是一個FrameLayout的子類,並且是PhoneWindow中的一個內部類。Decor的英文是Decoration,即“修飾”的意思,DecorView就是對普通的FrameLayout進行了一定的修飾,比如添加一個通用的Title bar,並響應特定的按鍵訊息等。

ViewRoot類:WmS管理用戶端視窗時,需要通知用戶端進行某種操作,這些都是通過非同步訊息完成的,實現的方式就是使用Handler,ViewRoot就是繼承於Handler,其作用主要是接收WmS的通知。

W類:該類繼承於Binder,並且是ViewRoot的一個內部類。

WindowManager類:用戶端要申請建立一個視窗,而具體建立視窗的任務是由WmS完成的,WindowManager類就像是一個部門經理,誰有什麼需求就告訴它,由它和WmS進行互動,用戶端不能直接和WmS進行互動。

6.1.3  Linux驅動

Linux驅動和Framework相關的主要包含兩部分,分別是SurfaceFlingger(SF)和Binder。每一個視窗都對應一個Surface,SF驅動的作用是把各個Surface顯示在同一個螢幕上。

Binder驅動的作用是提供跨進程的訊息傳遞。

APK程式的運行過程

首先,ActivityThread從main()函數中開始執行,調用prepareMainLooper()為UI線程建立一個訊息佇列(MessageQueue)。

然後建立一個ActivityThread對象,在ActivityThread的初始化代碼中會建立一個H(Handler)對象和一個ApplicationThread(Binder)對象。其中Binder負責接收遠程AmS的IPC調用,接收到調用後,則通過Handler把訊息發送到訊息佇列,UI主線程會非同步地從訊息佇列中取出訊息並執行相應操作,比如start、stop、pause等。

接著UI主線程調用Looper.loop()方法進入訊息迴圈體,進入後就會不斷地從訊息佇列中讀取並處理訊息。

當ActivityThread接收到AmS發送start某個Activity後,就會建立指定的Activity對象。Activity又會建立PhoneWindow類→DecorView類→建立相應的View或者ViewGroup。建立完成後,Activity需要把建立好的介面顯示到螢幕上,於是調用WindowManager類,後者於是建立一個ViewRoot對象,該對象實際上建立了ViewRoot類和W類,建立ViewRoot對象後,WindowManager再調用WmS提供的遠程介面完成添加一個視窗並顯示到螢幕上。

接下來,使用者開始在程式介面上操作。KeyQ線程不斷把使用者訊息儲存到QueueEvent隊列中,InputDispatcherThread線程逐個取出訊息,然後調用WmS中的相應函數處理該訊息。當WmS發現該訊息屬於用戶端某個視窗時,就會調用相應視窗的W介面。

W類是一個Binder,負責接收WmS的IPC調用,並把調用訊息傳遞給ViewRoot,ViewRoot再把訊息傳遞給UI主線程ActivityThread,ActivityThread解析該訊息並做相應的處理。在用戶端程式中,首先處理訊息的是DecorView,如果DecorView不想處理某個訊息,則可以將該訊息傳遞給其內部包含的子View或者ViewGroup,如果還沒有處理,則傳遞給PhoneWindow,最後再傳遞給Activity。

         6.3  用戶端中的線程

在多任務作業系統中,任何程式都運行線上程之中。系統首先會為用戶端程式分配一個線程,然後該線程從程式的入口處開始執行。那麼,請思考以下問題。

Android APK程式中都有哪些線程?

什麼是UI線程?

程式中自訂Thread和UI線程的區別是什嗎?

首先,很明確地講,包含有Activity的用戶端程式至少包含三個線程,6-1所示。每個Binder對象都對應一個線程,Activity啟動後會建立一個ViewRoot.W對象,同時ActivityThread會建立一個ApplicationThread對象,這兩個對象都繼承於Binder,因此會啟動兩個線程,負責接收Linux Binder驅動發送IPC調用。最後一個主要線程也就是程式本身所在的線程,也叫做使用者互動(UI)線程,因為所有的處理使用者訊息,以及繪製介面的工作都在該線程中完成。

為了驗證這一點,可以在Eclipse中建立一個Hello Android的程式,然後以debug的方式運行,在debug視窗中會看到6-1所示的介面。

 

自訂Thread和UI線程的區別在於,UI線程是從ActivityThread啟動並執行,在該類中的main()方法中,已經使用Looper.prepareMainLooper()為該線程添加了Looper對象,即已經為該線程建立了訊息佇列(MessageQueue),因此,程式員才可以在Activity中定義Handler對象(因為聲明Handler對象時,所在的線程必須已經建立了MessageQueue)。而普通的自訂Thread是一個裸線程,因此,不能直接在Thread中定義Handler對象,從使用情境的角度講,即不能直接給Thread對象發訊息,但是卻可以給UI線程發訊息。

 

本文選自《Android核心剖析 》一書

圖書詳細資料:http://blog.csdn.net/broadview2006/article/details/6804573

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.