Android框架概述

Andorid框架分爲三塊:服務端,客戶端和Linux驅動(= = 不瞭解)。

服務端主要包括兩個類:WindowManagerService和ActivityManagerService;其中WindowsManagerService負責窗口的疊放層次,顯示或者隱藏窗口。ActivityManagerService管理應用中的各個Activity。除此之外,wms中有兩個消息處理類,2.2中使用了KeyQ和InputDispatcherThread,他們之間配合將窗口中的消息發送給客戶端。

客戶端負責應用的View顯示,消息的處理等。主要的類很多,我們也很熟悉。

1.ActivityThread類:所有APK應用程序有其只有一個ActivityThread和它對應。並且ActivityThread所啓動的線程就是我們應用中一直說的UI線程和主線程。

2.Activity類:一個APK可以包含多個Activity類。ActivityThread接受到服務端啓動哪個Activity消息後就會選擇動態加載某個Activity對象,就延伸出了4種不同的Activity加載模式。比如standard,singleTop,singleTash,singleInstance,加載模式的不同和加載類存入Activity棧有關。

3.PhoneWindows類:繼承Window類,內部包含一個DecorView對象,提供給一套通用的窗口操作API

4.DecorView類:繼承FrameLayout,他的作用是修飾Acitvity的ContentView,並提供一個通用的Title bar 和特定的按鍵消息

5.ViewRoot類: WMS管理各個窗口的時候需要對客戶端進行一些操作,這些都是通過IPC(線程間的通信,Android使用Bunder)來實現的,而客戶端接收到消息後,就會異步調用處理消息,而這些就是通過Handle來實現的,所以 ViewRoot 就是繼承了Handle,處理這些消息的。

6.W類: 該類繼承Bindler,W類便是ViewRoot類的一個內部類,ViewRoot和WMS通信就是依靠W類的IPC方式實現的。

7.WindowManager類: 客戶端打算創建一個窗口,需要WindowManager負責和WMS交互,是一個管理類,客戶端是不能夠直接和WMS通信的。

知道了這些類之後,那麼當點擊一個APP,到底發生了一些什麼事情呢?

首先,開啓了一個ActivityThread線程,調用了prepareMainLooper()爲UI線程(自己)創建一個消息隊列(MessageQueue)。

然後創建一個ActivityThread對象,在ActivityThread對象的初始化過程中會創建一個H(Handle)對象和一個ApplicationThread(Bunder)對象。其中ApplicationThread(Bunder)負責接受遠程AMS的IPC調用,接受到消息後通過Handle將消息發送到消息隊列(MessageQueue)中,UI主線程從MessageQueue中取出消息並執行操作,如start,stop,pause等。

接着UI主線程調用了Looper.loop()方法進入了消息循環體,不停的從MessageQueue中取數據並處理消息。

當ActivityThread接收到AMS發送的start某個Activity後,就創建了指定的Activity對象,並放入Activity棧中。Activity又創建了PhoneWindow類 ---->  Dector類 -----> contentView(通過Activity.setContentView方法) ----> 創建View或者ViewGroup。創建對象完成之後需要將這些顯示到屏幕上。這時候就會調用WindowManager類,WindowManager類會創建一個ViewRoot類 ----> 創建一個W類  ---> WindowManager再通過WMS的遠程接口完成將一個窗口顯示在屏幕上

另外當用戶對屏幕進行操作時,KeyQ不斷把 用戶消息存入QueueEvent中,並且通過InputDispatcherThread線程取出消息。WMS判斷該消息屬於哪個窗口,並調用該窗口的W的接口,實現消息的傳遞。

W類我們說過是Binder,接收到WMS的IPC的消息後,將消息傳遞給ViewRoot,ViewRoot再把消息傳遞給ActivityThread UI線程,UI線程解析消息並處理。那麼首先接收到消息的是DecorView,如果DecorView不做處理則傳遞給ContentView下的View或者ViewGroup,如果還沒有處理,則傳遞給PhoneWindow,最後傳遞給Activity。

上面就是APK程序運行的流程。那麼整個過程有幾個線程呢?大家可以想一想。

--

--

--

--

--

--

--

--

--

--

一共有3個線程,UI主線程,和AMS通信的ApplicationThrad(Bunder) ,和WMS通信的W(Bunder),ViewRoot的內部類,三個線程通過Handle協調工作,完成客戶端的View顯示和消息的調用。

另外Activity之間是如何傳遞數據的呢?

通過上面的流程我們知道,Activity並不是線程,沒有IPC的概念,也就扯不上傳遞數據了。打個比方,你能說Rect類和Trigle類之間是如何傳遞消息的嗎?

事實上,兩個類之間傳遞消息的方式有兩種。

1.一個類持有另一個類對象的引用

2.存在第三個不會被回收的對象,通過該對象的數據實現兩個類之間傳遞消息。

所以使用應用的唯一Application對象保存消息是一個辦法,但是Activity.startActivity(Intent intent)方法可以傳遞Intent數據,同時通過startActivityForResult的方法可以再目標Activity結束後,回調Intent 對象給原Activity.onActivityResult()中。比如照相機和圖庫的回調。


Android客戶端和服務端的流程大概就是這樣子,具體的細節我們會繼續下去。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章