自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android多窗口管理深入分析

移動(dòng)開發(fā) Android
Android GWES之Android窗口管理 1基本構(gòu)架原理,Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等頂級窗口的概念。DecorView是Window的Top-Level View,這個(gè)View我稱之為主View,DecorView會(huì)缺省的attach到Activity的主窗口中。主View被加入到 WindowManager中,WM使用WindowState與這個(gè)主View對應(yīng)。

Android GWES之Android窗口管理 1基本構(gòu)架原理,Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等頂級窗口的概念。

DecorView是Window的Top-Level View,這個(gè)View我稱之為主View,DecorView會(huì)缺省的attach到Activity的主窗口中。

主View被加入到 WindowManager中,WM使用WindowState與這個(gè)主View對應(yīng)。

 

  1. 在Activity在performLaunchActivity時(shí),會(huì)使用Activity.attach()建立一個(gè)PhoneWindow主窗口。 
  2.  
  3. 這個(gè)主窗口的建立并不是一個(gè)重點(diǎn)。handleResumeActivity真正要啟動(dòng)一個(gè)Activity時(shí)候, 
  4.  
  5. 將主窗口decorView加入到WindowManager 
  6. onCreate()@UserActivity.java > 
  7. setContentView()@Activity.java > 
  8. mWindow.setContentView() > 
  9. setContentView()@PhoneWindow.java > 
  10. installDecor(): 
  11. generateDecor() --> DecorView:ViewGroup 
  12. generateLayout() --> screen_simple.xml:id:content (FrameLayout) 
  13. decor.addView( screen_simple.xml ) 
  14.  
  15. handleLaunchActivity()@ActivityThread.java > 
  16. handleResumeActivity()@ActivityThread.java > ... 
  17. addView(decor)@WindowManagerImpl.java > 
  18. root = new ViewRoot(); 
  19. getWindowSession() --> sWindowSession --> IWindowSession 
  20. mWindow = new W() --> IWindow 
  21. root.setView(decor) 
  22. sWindowSession.add(mWindow...) 將mWindow.asBinder()作為參數(shù)調(diào)用服務(wù)端 
  23. decor.assignParent(root); 
  24.  
  25. { IWindow: Window Manager ---IWindow--> Client 
  26. API back to a client window that the Window Manager uses to inform it of interesting things happening. } 
  27. { IWindowSession: Client ---IWindowSession--> Window Manager } 
Android 核心分析(13) -----Android GWES之Android窗口管理

Android GWES之Android窗口管理 1基本構(gòu)架原理       Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等頂級窗口的概念。DecorView是Window的Top-Level View,這個(gè)View我稱之為主View,DecorView會(huì)缺省的attach到Activity的主窗口中。主View被加入到 WindowManager中,WM使用WindowState與這個(gè)主View對應(yīng)。

Android窗口管理 - bacon36 - 我的Android筆記。

Activity 建立一個(gè)主窗口后,在將主窗口添加到WindowManager時(shí),首先要建立WindowManager代理對象,并打開一個(gè)會(huì)話(實(shí) 現(xiàn)IWindowSession AIDL接口),并維持該會(huì)話。Activity將通過該會(huì)話與WindowManager建立聯(lián)系,這個(gè)Session是C/S體系的基 礎(chǔ),Client通過WindowSession將window加入到Window Manager中。
一個(gè)完整的窗口概念橫跨了View,ViewRoot,WindowManager Service。Window,DecorView,View,IWindow ,ISession,WindowState之間的關(guān)系如下

Android窗口管理 - bacon36 - 我的Android筆記。

Client端的Activity通過Session會(huì)話與WindowManager建立對話,而WindowManager則通過IWindow接口訪問Client,將消息傳遞到Client端,通過消息分發(fā)渠道,將消息傳遞到處理函數(shù)OnXXX。
后面我們將通過Client,WM Service分別加以分析。
2 Client端      我一致認(rèn)為在Android中Window的概念并不是個(gè)很重要的概念。他的Window類,只是在PhoneWindow和MidWindow中使用。 而PhoneWindow只是做了一個(gè)具體跟手機(jī)功能相關(guān)的公用事件的處理,所以在Android中PhoneWindow并不是一個(gè)抽象的純正概念,而 是一個(gè)跟手機(jī)系統(tǒng)相關(guān)的一個(gè)特別窗口概念,例如按鍵的默認(rèn)動(dòng)作處理,按鍵音的發(fā)出等等。
2.1 View 在Activity中真正重要的概念是View,以下是Google官方對View的定義:
This class represents the basic building block for user interface components. A View  occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are  used to create interactive UI components (buttons, text fields, etc.). The {@link android.view.ViewGroup} subclass is the base class  for layouts, which  are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.
我 對View不做翻譯,翻譯成視圖好像不太佳,View在Android中,View比視圖具有廣的外延。View包含了用戶交互,包含了顯示,視圖在中 文中僅僅表示了靜態(tài)的顯示。對于View的理解應(yīng)該從最容易的理解開始。我們使用過編輯器,在Android中這個(gè)編輯器就是一個(gè)View,這個(gè)編輯器需 要顯示文字,需要接收用戶的鍵盤輸入和鼠標(biāo)選擇,但是一個(gè)屏幕上有多個(gè)編輯器,如何管理,如何切換焦點(diǎn)編輯器,這些都是需要管理的。
客戶端的組成:(Window,View,ViewRoot,WindowManager Proxy)

Android窗口管理 - bacon36 - 我的Android筆記。

在 Activity在performLaunchActivity時(shí),會(huì)使用Activity.attach()建立一個(gè)PhoneWindow主窗口。 這個(gè)主窗口的建立并不是一個(gè)重點(diǎn)。handleResumeActivity真正要啟動(dòng)一個(gè)Activity時(shí)候,將主窗口加入到 WindowManager,當(dāng)然并不是將主窗口本身,而是將主窗口的DecorView加入到WindowManager中。
真 正Window核心的抽象概念存在于View,ViewRoot,WindowManger中的WindowState。為了描述概念的方便性,我特別 提出主View這個(gè)概念,這個(gè)主View就是Top-Level View of the window. 主View與View想對,突出主View是attatch到主窗口上的。而一般的View則是存在于主View中的。主窗口這個(gè)概念,我講的主窗口實(shí)際 上就是Android提到的Top Level Window。
我們所提到的概念:View,GroupView,DecorView,ViewRoot都是存在于Client端,只有WindowState這個(gè)概念存在于Window Manager Service端。
DecorView 實(shí)際上是一個(gè)ViewGroup。在依存關(guān)系上來講,對看個(gè)主窗口來講,DecorView是Top-Level View.View并不是關(guān)注的重點(diǎn),重要的是我們?nèi)绾涡枰婪职l(fā)路徑是建立在什么關(guān)系上的。View的成員變量mParent用來管理View上級關(guān) 系的。而ViewGroup顧名思義就是一組View的管理,于是在ViewGroup構(gòu)建了焦點(diǎn)管理和子View節(jié)點(diǎn)數(shù)組。這樣通過View的 mParent和ViewGroup的mChildren構(gòu)建了Android中View直接的關(guān)系網(wǎng)。

Android窗口管理 - bacon36 - 我的Android筆記。

2.2 Focus Path      所謂的Foucs Path就是我們的KeyEvent傳遞的路線。一般的我們的KeyEvent在主循環(huán)中主View通過View的焦點(diǎn)記錄關(guān)系傳遞到焦點(diǎn)View上。例 如下圖,View22是焦點(diǎn),我們從最頂層的View通過mFcous的關(guān)系鏈找到最后所形成的路徑就是Focus Path。

Android窗口管理 - bacon36 - 我的Android筆記。

2.3 ViewRoot,Window Manager Proxy ViewRoot與Window Manager的核心是IWindowSession和IWindow。ViewRoot通過IWindowSession添加窗口到Window Manager。而IWindow這是Window Manager分發(fā)消息給Client ViewRoot的渠道。利用AIDL接口進(jìn)行進(jìn)程間通信。

Android窗口管理 - bacon36 - 我的Android筆記。

Android窗口管理 - bacon36 - 我的Android筆記。

ViewRoot實(shí)際是一個(gè)Handler,ViewRoot建立主View與WindowsManger通訊的橋梁。ViewRoot在本質(zhì)上一個(gè)Handler。我們知道Handler的基本功能就是處理回調(diào),發(fā)送消息。
Activity在使用getSystemService獲取WindowManagerImpl ,建立了一個(gè)WindowManagerImpl實(shí)例,即Window Manager服務(wù)的代理:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE);并調(diào)用wm.addview添加窗口到WMService中。
這 個(gè)過程在客戶端建立了什么樣的管理框架,并如何這個(gè)會(huì)話?在Window Manager Proxy中建立了View,Layout ,ViewRoot三者的對應(yīng)關(guān)系表。構(gòu)造一個(gè)ViewRoot就會(huì)打開一個(gè)session,并利用IWindowSession建立會(huì)話上下文。

Android窗口管理 - bacon36 - 我的Android筆記。

4 Window Manager Service 本次對于Window Manager Service的研究僅限于FocusWindow,消息系統(tǒng)。其他的部分將在后面的專門章節(jié)討論。   
Window Manager管理的窗口是應(yīng)用程序的Top-level窗口,我這里參照Window的概念叫主窗口。主窗口為什么要放在在Service這邊來管理 呢?為什么不放在Client那邊?主窗口放置在一起管理是為了計(jì)算Z-order序列,根據(jù)應(yīng)用程序的狀態(tài)來顯隱應(yīng)用程序的窗口。我想Android設(shè) 計(jì)者在考慮設(shè)計(jì)窗口系統(tǒng)的時(shí)候,一定首先考慮:
窗口z-order序的管理
活動(dòng)窗口的計(jì)算,及其變化通知
窗口歸屬(屬于哪個(gè)應(yīng)用)
輸入法管理

Window Service大體上實(shí)現(xiàn)了如下的功能:,
(1)Z-ordered的維護(hù)函數(shù)
(2)輸入法管理
(3)AddWindow/RemoveWindow
(4)Layerout
(5)Token管理,AppToken
(6)活動(dòng)窗口管理(FocusWindow)
(7)活動(dòng)應(yīng)用管理(FocusAPP)
(8)轉(zhuǎn)場動(dòng)畫
(9)系統(tǒng)消息收集線程
(11)系統(tǒng)消息分發(fā)線程
在服務(wù)端的窗口對象叫做WindowState。在Service維護(hù)了一個(gè)mWindow數(shù)組,這個(gè)mWindow就是Window的Z-order序數(shù)組。mWindowMap用于記錄。
WindowState有一個(gè)叫做mClient成員變量來記錄客戶端IWindow實(shí)例,通過IWindow接口實(shí)例,Service可以訪問客戶端的信息,說以IWindow是Service連接View橋梁。
(1) FocusWindow活動(dòng)窗口如何計(jì)算?
基本原理就是查找前景應(yīng)用(FousActivity),并同Z-Order序中找出屬于該FousActivity(AppToken)的主窗口,這個(gè)窗口就是計(jì)算出來的Focus Window。
(2)為什么要提出Token這個(gè)概念呢?
一個(gè)應(yīng)用程序要管理自己的窗口,那么如何來標(biāo)識(shí)該窗口是屬于某個(gè)Activity,Andoid設(shè)計(jì)者提出了AppToken這個(gè)概念。AppToken在本質(zhì)上的描述:通過Token找到屬于該Token的allWindows。使用Token開始完成該應(yīng)用程序的所有窗口的顯示和隱藏。
(3)系統(tǒng)消息收集與處理
我們下面重點(diǎn)研究Service中的系統(tǒng)消息收集模式及其分發(fā)模式。Service使用KeyQ作為專門的消息隊(duì)列。
KeyEvent
TouchEvent
TrackballEvent

系統(tǒng)有兩個(gè)線程:
KeyQ線程,通過Navite函數(shù)readEvent輪詢設(shè)備,將讀取的結(jié)果放置在KeyQ隊(duì)列中。
系統(tǒng)dispatcher 等待在KeyQ消息隊(duì)列上,一旦從消息隊(duì)列中獲取到消息,就通過分發(fā)函數(shù)通過mClient傳遞到Client端。

責(zé)任編輯:張葉青 來源: 博客
相關(guān)推薦

2011-03-23 11:01:55

LAMP 架構(gòu)

2010-09-07 14:21:22

PPPoE協(xié)議

2022-04-12 08:30:45

TomcatWeb 應(yīng)用Servlet

2022-08-30 07:00:18

執(zhí)行引擎Hotspot虛擬機(jī)

2021-10-29 16:36:53

AMSAndroidActivityMan

2009-06-10 18:12:38

Equinox動(dòng)態(tài)化OSGi動(dòng)態(tài)化

2009-12-14 14:50:46

Ruby傳參數(shù)

2009-12-16 16:39:01

Visual Stud

2010-03-08 14:53:48

Linux分區(qū)

2011-09-01 13:51:52

JavaScript

2023-02-01 08:13:30

Redis內(nèi)存碎片

2014-10-30 15:08:21

快速排序編程算法

2011-06-28 14:11:33

JavaScript

2009-04-13 16:37:33

JSPWeb標(biāo)簽

2009-07-03 11:14:57

2010-01-08 16:58:49

網(wǎng)管交換機(jī)

2018-12-18 10:11:37

軟件復(fù)雜度軟件系統(tǒng)軟件開發(fā)

2015-08-03 09:54:26

Java線程Java

2018-10-25 15:24:10

ThreadLocal內(nèi)存泄漏Java

2020-12-07 06:23:48

Java內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號