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相關的主要包含兩部分,分別是su***ceflingger(sf)和binder。每乙個視窗都對應乙個su***ce,sf驅動的作用是把各個su***ce顯示在同乙個螢幕上。
binder驅動的作用是提供跨程序的訊息傳遞。
apk程式的執行過程
首先,activitythread從main()函式中開始執行,呼叫preparemainlooper()為ui執行緒建立乙個訊息佇列(messagequeue)。
接著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執行緒的區別是什麼?
為了驗證這一點,可以在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核心剖析》一書
圖書詳細資訊:
Android Framework技術積累計畫
工作快一年了,距離上一次寫部落格也有一年多了。現在回想一下,工作這一年有很多收穫,但是也有很多的不足之處有待改進。其中對自己最不滿意的乙個地方,就是技術的積累碎片化很嚴重。知識掌握的不系統,缺乏對新掌握知識的梳理消化。在android framework這個領技術域,我應該像前輩老羅 gityuan...
Android Framework層截獲按鍵訊息
位置 frameworks base services input inputdispatcher.cpp 所在函式 void inputdispatcher notifykey const notifykeyargs args release lock if needwake mlooper wa...
android framework 觸控螢幕事件傳遞
對於像我這樣剛入門的android程式設計師,如果想大致弄清楚觸控螢幕事件傳到使用者介面的過程,我覺得需要弄清楚以下幾個部分 一 activity,window,view之間的關係 二 window,windowmanager,windowmanagerserver的建立和訊息傳遞的基本規則 三 本...