(Android基础)窗口的创建过程

DecorView类 :

Window的界面,是一个FrameLayout,其中包含窗口的装饰以及窗口内容,窗口的装饰根据开发者配置创建,窗口的内容则是id=content的FrameLayout,其内容通过开发者主动调用Activity的setContentView来填充

ViewRootImpl 类:

ViewRootImpl不是一个View,但是它持有需要和WimdowManagerService交互的View,可以说的WMS与VIew的枢纽

Window 类:

窗口的本质是一个View,而Window类只是应用窗口的一个抽象,它的实现类一般是PhoneWindow

Session 类:

窗口的会话对象,通常来说每一个应用程序进程都会持有一个Session对象,以便和Wms交互,Session的创建通过WMS的OpenSession()

窗口类型主要分三类
应用窗口
子窗口
系统窗口

##创建应用窗口流程

应用窗口的创建从Activity的启动开始,在Activity的attach中,为

  1. 当前的Activity创建Window对象(实现类为PhoneWIndow),将Activity的对象设置为Window的Callbcak对象,
    并为当前的Window对象设置WIndowManager(WindowManager的实现类是WIndowManagerImpl,同时持有Disaply和WImdowManagerGlobal的引用)
  2. 接着在Activity的生命周期onCreate中,通过调用Activity的方法setContentView为当前的Activity设置显示元素,然后在里面调用Activity所持有的PhoneWindow的setContentVIew方法
  3. 在PhoneWindow的setContentView里,首先为当前PhoneWindow生成真正要显示的窗口修饰DecorView,并根据主题等设置为DecorView生成一个包含标题栏等的子视图,添加为DecorView的子视图,然后通过布局解析器(LayoutInflate)从DecorView中找到id=content的布局,
    并通过布局解析器将setContentView传入的布局ID解析,并设置id=content的布局为其根节点
  4. 在performResumeActivity之后调用WindowManager的addView将当前Activity持有的PhoneWindow对象里面的DecorView传递给WindowManagerGlobal ,WindowManagerGlobal中存储着当前进程所有的View,LayoutParams,在WIndowManagerGlobal中为addView传入的View创建一个VIewRootImpl,ViewRootImpl是VIew和Session通信的枢纽,Session是与WIndowManagerService通信的会话入口,WindowmanagerService通过持有ViewRootImpl中的内部类W(IBInder的实现类,继承至IWindow.Stub类)和指定的View通信
您的一份奖励,就是我的一份激励