(十三)Window的创建过程

来源:互联网 发布:c语言中调用文本文件 编辑:程序博客网 时间:2024/05/22 05:02
     View是android中视图的呈现方式,但View不能单独存在,必须依附Window这个抽象的概念上,因此有视图的地方就有Window。

     Activity的Window的创建过程
     Activity的启动过程很复杂,最终会由ActivityThread中的performLaunchActivity()来完成整个启动过程,在此方法中会通过类加载器创建Activity的实例对象,并调用其attach方法来为其关联运行过程中所依赖的一系列上下文环境变量。
     在Activity的attach方法中,系统会创建Activity所属的Window对象并为其设置回调接口,Window对象的创建是通过PolicyManager的makeNewWindow方法实现的。
     PolicyManager中实现的几个工厂方法全部在策略接口IPolicy中声明了,其真正的实现类是Policy类,在Policy的makeNewWindow方法中,Window的具体实现的确是PhoneWindow。
     对于Activity的视图怎样关联到Window上,查看Activity的setContentView方法得知,具体实现是交给了Window的setContentView方法去实现的,又因为Window的具体实现是PhoneWindow,所以查看PhoneWindow的setContentView方法。
     大致过程为:
     1.如果没有DecorView,那么就创建它
     在PhoneWndow的setContentView方法中,DecorView的创建过程是由installDecor方法来完成的,在该方法内部会调用generateDecor方法来直接创建DecorView,此时DecorView是一个空白的FrameLayout。为了初始化布局,PhoneWindow还需通过generateLayout方法(也是在installDecor 中)来加载具体布局到DecorView中。
     2.将View添加到DecorView的mContentParent中。
     在PhoneWindow的setContentView方法中,通过 mLayoutInflater.inflate(layoutResID, mContentParent);将Activity的视图添加到DecorView的mContentParent中。
     3.回调Activity的onCntentChanged方法通知Acivity视图已经改变
     由于Activity实现了Window的CallBack接口,这里表示Activity的布局已经添加到DecorView的mContentParent中了,于是通知Activity。使其做相应处理。
     此时Activity的布局已经添加到DecorView的mContentParent中了,但是还未被WindowManager识别,正式添加到Window中在ActivityThread的handleResumeActivity方法中,首先会调用Activity的OnResume方法,接着会调用Activity的makeVisible()方法,在makeVisible方法中才完成了添加和显示这两个过程。

     Dialog的Window创建过程
     1.创建Window,类似Activity的
     2.初始化DecorView并将Dialog的视图添加到DecorView中,类似Activity
     3.将DecorView添加到Window中并显示。此过程在show方法中进行。
      注:Dialog必须采用Activity的Context,如用Application的Context会报错。

    
     
原创粉丝点击