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.

        

第八章:理解Window和WindowManager的更多相关文章

  1. Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager

    第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...

  2. 理解Window和WindowManager

    Window表示一个窗口的概念,Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问W ...

  3. 【Android开发艺术探索】理解Window和WindowManager

    个人博客: http://www.milovetingting.cn 理解Window和WindowManager Window表示一个窗口的概念,是一个抽象类,具体实现是PhoneWindow,可以 ...

  4. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  5. Activity Window View WindowManager关系&Touch事件分发机制

    http://www.cnblogs.com/linjzong/p/4191891.html https://www.cnblogs.com/kest/p/5141817.html https://b ...

  6. WmS具体解释(二)之怎样理解Window和窗体的关系?基于Android7.0源代码

    上篇博客(WmS具体解释(一)之token究竟是什么?基于Android7.0源代码)中我们简要介绍了token的作用,这里涉及到的概念非常多,当中出现频率最高的要数Window和窗体这一对搭档了,那 ...

  7. Android GUI之Window、WindowManager

    通过前几篇的文章(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#gui ),我们清楚了Activity实际上是将视图的创建和显示交给了Wi ...

  8. 理解Window和WindowManger

    一.Window简介 作用:桌面上显示一个类似悬浮的东西. 介绍:Window是一个抽象类,实现是由PhoneWindow.WindowManager是外界访问Window的入口.但是最终实现是在Wi ...

  9. Android-理解window和windowmanager

    1.window和windowmanager的关系 window是一个抽象类,具体实现为phoneWindow.创建一个window可以通过windowmanager来实现. window的具体实现在 ...

随机推荐

  1. 什么了解suite集合实现

    Testsuite继承BaseTestSuite其实内部的东西不是太多--生成suite集合的逻辑主要如下-我这里没有扒源码-因为他最终生成的TestsSuite关联的模块比较多--如果贴源码出来-- ...

  2. WeChair项目Alpha冲刺(2/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第二天 昨日进展: 前端完成小程序首页的html+css设计 后端springboot项目搭建完成 详情参见github 数据库也初步建成一些表格, ...

  3. Redis安装过程jemalloc/jemalloc.h报错

    问题: [root@localhost redis-3.0.0]# make cd src && make all make[1]: Entering directory `/data ...

  4. 在执行jar包时如何使用调优参数

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 使用时去掉换行 ...

  5. Redis持久性——RDB和AOF

    Redis持久性 Redis提供了不同的持久性选项: RDB持久性以指定的时间间隔执行数据集的时间点快照. AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集.使用与R ...

  6. 黑马程序员spring data jpa 2019年第一版本

    第一步首先创建一个maven工程,导入对于的pom依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  7. 暑假集训Day2 状压dp 特殊方格棋盘

    首先声明 : 这是个很easy的题 可这和我会做有什么关系 题目大意: 在n*n的方格棋盘上放置n个车,某些格子不能放,求使它们不能互相攻击的方案总数. 注意:同一行或同一列只能有一个车,否则会相互攻 ...

  8. CString 十六进制转二进制

    int nValude = 0; CString strtemp("asdb");; sscanf(strtemp.GetBuffer(0),"%x",& ...

  9. 2020年的六种编程语言排名中,java排第几只有不到1%的人知道

    前言 编程语言是开发的基础.有不同的类型和特征,并且开发人员针对不同的场景选择正确的语言,但是您知道使用哪种语言吗?中国和世界各地有多少开发人员正在使用它?他们的排名是多少?快来看看您知道多少个列表! ...

  10. MySQL授权--WITH GRANT OPTION

    今天在学习MySQL的时候,看到一句描述 WITH GRANT OPTION should be left out if the user need not be able to grant othe ...