第八章:理解Window和WindowManager

    Window表示一个窗口的概念.

    Window是一个抽象类,它的具体实现是PhoneWindow,

    WindowManager是外界访问Window的入口,Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程.

    8.1 Window和WindowManager

      WindowManager.LayoutParams中的flags和type这两个参数比较重要.

      Flags参数表示Window的属性

        FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCH_MODAL, FLAG_SHOW_WHEN_LOCKED

      WindowManager常用的只有三个方法,即添加View,更新View和删除View,这三个方法定义在ViewManager中,而WindowManager继承了ViewManager.

    8.2 Window的内部机制

      Window是一个抽象的概念,每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,因此Window不是实际存在的,它是以View的形式存在.

      它提供了三个接口方法addView,updateViewLayout以及removeView都是针对View的.

      8.2.1 Window的添加过程

        Window的添加过程需要通过WindowManager的addView来实现,WindowManager是一个接口,它的真正实现是WindowManagerImpl类.

        WindowManagerImpl并没有直接实现Window的三大操作,而是全部交给了WindowManagerGlobal来处理,WindowManagerGlobal以工厂的形式向外提供自己的实例.

      8.2.2 Window的删除过程

        Window的删除过程和添加过程一样,都是先通过WindowManagerImpl后,再进一步通过WindowManagerGlobal来实现.

        WindowManagerGlobal的removeView实现.

        removeViewLocked是通过ViewRootImpl来完成删除操纵.

        在WindowManager中提供了两种删除接口removeView(异步删除),removeViewImmediate(同步删除).

      8.2.3 Window的更新过程

        WindowManagerGlobal的updateViewLayout方法.

        首先它需要更新View的LayoutParams并替换掉老的LayoutParams,接着再更新ViewRootImpl中的LayoutParams,这一个是通过ViewRootImpl的setLayoutParams方法来实现的.

        在ViewRootImpl中会通过scheduleTraversals方法来对View重新布局,包括测量,布局,重绘三个过程.

    8.3 Window的创建过程

      8.3.1 Activity的Window创建过程

        最后会有ActivityThread中的perfoemLaunchActivity()来完成整个启动过程,在这个方法内部会通过类加载器来创建Activity的实例对象,并调用其attach方法为其关联运行过程中所依赖的一些列上下文环境变量.

        在Activity的attach方法里,系统会创建Activity所属的Window对象并为其设置回调接口.

        Window对象的创建时用过PolicyManager的makeNewWindow方法实现的. 

        PhoneWindow的setContentView方法大致遵循如下几个步骤

          1.如果没有DecorView,那就去创建它

          2.将View添加到DecorView的mContentParent中

          3.回调Activity的onContentChanged方法通知Activity视图已经发生改变

      8.3.2 Dialog的Window创建过程

        1. 创建Window

          通过PolicyManager的makeNewWindow方法来完成的

        2.初始化DecorView并将Dialog的视图添加到DecorView中

        3.将DecorView添加到Window并显示

      8.3.3 Toast的Window创建过程

        Toast也是基于Window来实现的,但是由于Toast具有定时取消这一功能,所以系统采用Handler.

        在Toast的内部有两类IPC过程,第一类是Toast访问NotificationManagerService,第二类是NotificationManagerService回调Toast里的TN接口.

        Toast属于系统Window,它内部的视图由两种方式制定,一种是系统默认的样式,另一种是通过setView方法来制定一个自定义View.

        Toast提供了show和cancel分别用来显示和隐藏Toast.

        

 

转载于:https://www.cnblogs.com/JingQ/p/6184882.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值