概要理解數組
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添加窗口的惟一入口)