第八章:理解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.
第八章:理解Window和WindowManager的更多相关文章
- Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...
- 理解Window和WindowManager
Window表示一个窗口的概念,Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问W ...
- 【Android开发艺术探索】理解Window和WindowManager
个人博客: http://www.milovetingting.cn 理解Window和WindowManager Window表示一个窗口的概念,是一个抽象类,具体实现是PhoneWindow,可以 ...
- WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码
上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...
- Activity Window View WindowManager关系&Touch事件分发机制
http://www.cnblogs.com/linjzong/p/4191891.html https://www.cnblogs.com/kest/p/5141817.html https://b ...
- WmS具体解释(二)之怎样理解Window和窗体的关系?基于Android7.0源代码
上篇博客(WmS具体解释(一)之token究竟是什么?基于Android7.0源代码)中我们简要介绍了token的作用,这里涉及到的概念非常多,当中出现频率最高的要数Window和窗体这一对搭档了,那 ...
- Android GUI之Window、WindowManager
通过前几篇的文章(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#gui ),我们清楚了Activity实际上是将视图的创建和显示交给了Wi ...
- 理解Window和WindowManger
一.Window简介 作用:桌面上显示一个类似悬浮的东西. 介绍:Window是一个抽象类,实现是由PhoneWindow.WindowManager是外界访问Window的入口.但是最终实现是在Wi ...
- Android-理解window和windowmanager
1.window和windowmanager的关系 window是一个抽象类,具体实现为phoneWindow.创建一个window可以通过windowmanager来实现. window的具体实现在 ...
随机推荐
- 【K8s学习笔记】K8s是如何部署应用的?
本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...
- Jmeter系列(26)- 详解 JSON 提取器
果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 为什么要用 JSON 提取器 JSON ...
- leetcode125. 验证回文串 python 简单
125. 验证回文串 难度简单 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: &quo ...
- 恕我直言你可能真的不会java第8篇-函数式接口
一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...
- (私人收藏)PPT数据图表
PPT数据图表 https://pan.baidu.com/s/1lXt8UU20IotD4LLagfTTXAkknf
- HotSpot二分模型(1)
HotSpot采用了OOP-Klass模型来描述Java类和对象.OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型. 那么为何要设计这样一 ...
- 常用API - 时间日期类
Date类 概述 java.util.Date类 表示特定的瞬间,精确到毫秒. 继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期 ...
- Python-自动用0补取长度
描述 Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0. 语法 zfill()方法语法: str.zfill(width) 参数 width -- 指定字符串的长度. ...
- DLL注入之修改PE静态注入
DLL注入之修改PE静态注入 0x00 前言 我们要注入的的力量功能是下载baidu首页数据.代码如下: #include "stdio.h" #include"stdi ...
- python入门008
目录 一.for循环 作用:for循环是因为在循环取值(即遍历值)时for循环比while循环的使用更为简洁 1.for循环语法: 2.应用案例: 注意:break 与 continue也可以用于fo ...