安卓建立應用窗口(三)

概要理解數組

1 每一個應用窗口都對應了一個activity對象,所以建立窗口以前得先建立activity對象spa

2 當AMS決定啓動某個Activity時,會通知客戶端進程的activityThread。orm

3 啓動activity的任務由activityThread完成對象

 

應用窗口的建立過程token

------------------初始化activity類和內部的window類接口

1 使用ClassLoader從程序文件中裝載指定的Activity對應的Class文件進程

 

2 接着調用Activity的attach()方法初始化賦值資源

APPcontext :該對象將做爲Activity的BaseContextit

token :一個ActivityRecord對象,也是AMS裏面的historyRecord
parent :父類引用
window :窗體描述,用於接受AMS的信息(內部存有當前activity引用用於callback),
         window裏面都含有一個windowManager接口,由WindowManagerlmpl實現。
         windowManager--->window.LoaclWindowManager(包裝類)-->WindowManagerImpl(惟一)io

         這裏的層次結構有點像context類的裏面包裝PackageInfo對象同樣,保證了每一個activity的windowManager實際上是一個輕量級的引用,不會形成資源的冗餘。

 

-------------------建立view類

3 執行performLaunchActivity()-->callActivityOnCreate()-->onCreate()方法添加view類

 

4 調用用戶編寫的setContentView()--->PhoneWindow的setContentView()

          a 用installDecor()方法爲Window類安裝一個窗口修飾(標題欄)
          b 讀取layout.XML爲view對象初始化窗口內容

 

-------------------發送到AMS處理(AMS封裝數據並傳遞給WMS進行處理)

1 activitythread傳遞activity給AMS,AMS調用windowMangerImpl類用於管理窗口(windowMangerImpl只有惟一一個,不管有多少個activity)
windowMangerImpl的內部維護了三個數組
           View[] mViewS 窗口列表
           ViewRoot[] mRootS mViews對應的ViewRoot對象。
           WindowManager.LayoutParams[] mParams mViewS對應的LayoutParams窗口參數對象
當把 mViews 中的 View 對象當作一個窗口 添加進WmS中,WmS要求每一個被添加的窗口都要對應一個LayoutParams對象,mParams正是保存了每個窗口對應的參數對象。


2 新建一個viewRoot對象並初始化setView (View view、WindowManager.LayoutParams attrs、View panelParentView)
這裏的初始化過程是,先新建本來3個數組長度+1的數組,而後把原來數組mViews、mRoots、mParam複製到新數組並在尾部添加新的元素


3 調用sWindowSession.add(),通知WmS添加窗口(這是客戶程序請求W m S添加窗口的惟一入口)

相關文章
相關標籤/搜索