Android-理解window和windowmanager
1.window和windowmanager的关系
window是一个抽象类,具体实现为phoneWindow。创建一个window可以通过windowmanager来实现。
window的具体实现在windowManagerService中。
windowManager和windowManagerService的交互是一个IPC过程。
2.windowManager.LayoutParams中flags与type
flags表示window的属性:
FLAG_NOT_FOCUSABLE 表示不需要获得焦点,最终事件会传递给下层具有焦点的window
FLAG_NOT_TOUCH_MODEL 当前window区域的自己处理,区域之外的传递给底层的window
FLAG_SHOW_WHEN_LOCKED 可以让window显示在锁屏的界面上
type有三种:
应用window — activity 层级1-99
子window — dialog等 层级 1000-1999
系统window — toast,系统状态通知栏 层级2000-2999 需要权限,可以用TYPE_SYSTEM_OVERLAY或者TYPE_SYSTEM_ERROR
用法:
mLayoutParams.flags = LayoutParams.xxxx
mLayoutParams.type = LayoutParams.xxxx
mWindowManager.addview(xx,mLayoutParams)
3.windowManager提供的功能
addView 添加view
updateViewLayout 更新view
removeView 删除view
4.addView工作机制
windowManager也是一个接口,真正实现在windowManagerIpml,然后用windowManagerGlabal处理。
windowManagerGlabal的实现过程:
1)检查参数是否合法,若是子window那个要调整一些布局参数
2)创建viewRootImpl并将view添加到列表
3)通过viewRootImpl来更新界面并完成window的添加过程
5.removeView工作机制
跟addView一样,用windowManagerGlabal实现,通过viewRootImpl完成删除。
在windowManager中有同步和异步删除两种方法,一般不用同步,异步removeView是通过viewRootImpl的die方法发送一个请求删除的信息,最终删除在viewRootImpl的Handler中的dodie方法,实际用dispatchDetachedFromWindow完成删除
6.updateViewLayout 工作机制
用windowManagerGlabal,通过viewRootImpl的serLayoutParams更新layout,最终通过windowManagerService的relayoutWindow完成实现
7.activity的window创建过程
1)如果没有DecorView,那么创建它
2)将view添加到DecorView的mContentParent中
3)回调activity的onContentChanged方法通知activity视图已经发生改变
8.Dialog的window创建过程
1)创建window
2)初始化DecorView并将dialog的视图添加到DecorView中
3)将DecorView添加到window中并显示
注:普通的dialog要使用activity的context,application的context会报错,解决方法是可以将其指定为系统window并添加权限
9.toast的window创建过程
通过toast中TN的show和hide来完成显示和隐藏,这两个方法被NMS以跨进城的方式调用,内部分别是handleShow和handleHide
10.一个应用中到底有多少个window呢?
答案:应用window的个数(activity)+子window的个数(dialog等)+系统window的个数(toast等)
Android-理解window和windowmanager的更多相关文章
- Android开发艺术探索》读书笔记 (8) 第8章 理解Window和WindowManager
第8章 理解Window和WindowManager 8.1 Window和WindowManager (1)Window是抽象类,具体实现是PhoneWindow,通过WindowManager就可 ...
- 【Android开发艺术探索】理解Window和WindowManager
个人博客: http://www.milovetingting.cn 理解Window和WindowManager Window表示一个窗口的概念,是一个抽象类,具体实现是PhoneWindow,可以 ...
- 理解Window和WindowManager
Window表示一个窗口的概念,Window是一个抽象类,它的具体实现是PhoneWindow.创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问W ...
- 第八章:理解Window和WindowManager
Window表示一个窗口的概念. Window是一个抽象类,它的具体实现是PhoneWindow, WindowManager是外界访问Window的入口,Window的具体实现位于WindowMan ...
- Android 之 Window、WindowManager 与窗口管理
其实在android中真正展示给用户的是window和view,activity在android中所其的作用主要是处理一些逻辑问题,比如生命周期的管理.建立窗口等.在android中,窗口的管理还是比 ...
- Android GUI之Window、WindowManager
通过前几篇的文章(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#gui ),我们清楚了Activity实际上是将视图的创建和显示交给了Wi ...
- android 中View, Window, Activity, WindowManager,ViewRoot几者之间的关系
(1)View:最基本的UI组件,表示屏幕上的一个矩形区域. (2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小: 它包含一个V ...
- 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和窗体这一对搭档了,那 ...
随机推荐
- Bioconda安装与使用
1. Bioconda是一个自动化管理生物信息软件的工具,就像APPstore.360软件管家一样. Bioconda的优点是安装简单,各个软件依赖的环境一同打包且相互隔离,非常适合在服务器中建立自 ...
- json-gson 解析泛型及解析null
参考://public static class paraJson {public class paraJson{ static Gson gson = new GsonBuilder().regis ...
- LeetCode OJ-- 3Sum **
https://oj.leetcode.com/problems/3sum/ 在一个数列中,求出所有3个数之和是0的3个数. 刚开始给自己挖了坑,由于没闹清,unique()函数的含义,去掉重复不彻底 ...
- Hadoop1和Hadoop2的区别是什么?
[学习笔记] Hadoop1和Hadoop2的区别是什么?马 克-to-win @ 马克java社区:原来的Hadoop1的Mapreduce又管资源管理,又管数据处理和计算.而Hadoop2中的Ma ...
- NOI模拟题4 Problem A: 生成树(mst)
Solution 我们考虑答案的表达式: \[ ans = \sqrt{\frac{\sum_{i = 1}^{n - 1} (w_i - \overline{w})^2}{n - 1}} \] 其中 ...
- UIView的任意圆角
今天在做项目的时候,遇到一个问题,grouped类型的tableview 怎么样才能让他们的一个view 其中一个角圆角? 如上图所示,其实我是用UILabel,但是箭头的位置总是尖的不太好看.设置l ...
- 如何查看linux版本 如何查看LINUX是多少位
一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux ...
- Git历险记(五)——Git里的分支&合并
分支与合并 在Git里面我们可以创建不同的分支,来进行调试.发布.维护等不同工作,而互不干扰.下面我们还是来创建一个试验仓库,看一下Git分支运作的台前幕后: $rm -rf test_branch_ ...
- hadoop datanode节点超时时间设置
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长. HDFS默认的超时时长为10分 ...
- IO流中文件和文件夹的删除程序举例
/* * 删除功能(无论是文件夹还是文件都是用delete方法,仅仅能一级一级的删除.):public boolean delete() * * 注意: * A:假设你创建文件或者目录忘了写盘符路径, ...