Window是一个抽象的类,它的具体实现是PhoneWindow
Window有三种类型 应用window ,子window 系统window window是分层的,每个window对应着z-ordered
WindowManager所提供的功能很简单,添加view,更新view,和删除view
8.2Window的内部机制
Window是一个抽象的概念,每一个window都对应一个View和一个ViewRoootImpl。View才是Window存在的实体
8.2.1Window的添加过程
Windowmanager是一个接口,它的真正实现是WindowManagerImpl。WindowmanagerImpl将操作交给了windowManagerGlobal来处理。
WindowmanagerGlobal的addView方法主要分为以下几步
1.检查view是否存在,如果是子View还需要调整一些布局。
2.创建VIewmpl并将view添加到列表 mView存储所有的window所对应的view,mRoo存储的是所有Window所对应的ViewRootImpl,mParam存储的是所有Window所对应的布局参数。mDyingViews则存储正在被删除的view
3通过ViewRootImpl类似更新界面并完成Window的添加过程
这个步骤是通过viewRootImpl的setView方法来完成的,requestLayout,scheduleTraversals().接着通过windowSession来最终完成Window的添加过程mWindowSession.addToDpisplay().最后WindowManagerService来实现Window的添加。
8.3Window的创建过程
Activity启动后 ActivityThread中的performLaunchActivity() 来完成整个启动过程。并调用attach方法为其关联运行过程中所依赖的一系列上下文环境变量
在 Activity的attach方法里,window的创建是通过PolicyManager的makenewWindow创建的,activity实现了window的callback接口。policymanager的真正实现类是policy makeNewWindow 方法中 使用了phoneWindow来创建window。、window创建完毕后,需要附着到activity上。这里看activity的setContentView方法其中调用了getWindow().setContentView(layoutid)
setConentView方法步骤如下
1.如果没有decorView就创建它
2.将View添加到DecorView的mContentParent中
3.回调activity的onContentChange方法通知Activity视图已经发生改变
4.在ActivityThread的handleResumeActivity方法中,首先调用了Activity的onresume方法,接着会调用Activity的makeVisible()在makeVieible方法中,DecorView真正的完成了添加和显示这两个过程