zoukankan      html  css  js  c++  java
  • 第八章:理解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.

            

  • 相关阅读:
    100篇论文
    Tengine vs openresty
    Dottrace跟踪代码执行时间
    Linux Server
    Linux+Apache+Mysql+Php
    linux+nginx+mysql+php
    tshark命令行的使用(转)
    tcpdump VS tshark用法(转)
    Lua语言在Wireshark中使用(转)
    doc-remote-debugging.html
  • 原文地址:https://www.cnblogs.com/JingQ/p/6184882.html
Copyright © 2011-2022 走看看