Window和WindowManger

来源:互联网 发布:数码宝贝网络侦探友情 编辑:程序博客网 时间:2024/06/05 20:07

几个简单的概念

首先简单理解下Window和WindowManger是干什么,这里不会涉及到他们的原理,一来我还没学到家,二来要真正理解还是需要通过源码,而这篇笔记主要是记录怎么使用,不会涉及到源码

View(mDecorView):顶级View,就是一个普通的View,只不过它是最上层的View

Window:网上对于window的解释一般都是:window是一个抽象的概念,持有顶级View。所以尼玛这个抽象的概念到底是个什么鬼,这种解释对我们这种新手很不友好啊!这个概念太抽象,我只能强行解释一波。mDecorView和普通View一样(其实它就是继承自FrameLayout),但是它作为顶级View当然要提供一些普通View没有的功能,那这个Window就是用来提供这些功能的。
看看window都提供什么功能——Android的Window类
Android:关于Window少为人知的一面——这篇文章中关于window的解释还是蛮好的,我把结论抄在这里吧

从以上的分析,我们可以得出创建Window的过程其实就是添加View的过程。比如Activity中decorView是作为顶级View添加到系统中去显示,顶级View的LayoutParams必须是WindowManager.LayoutParams类型,否则会报错。那么为什么会有Window的存在,我们直接用添加View形式,创建Activity所需显示的界面不久就了。
这里就又回到最初Window的定义,Window它定义了顶级窗体样式和行为。因为每个Activity都会标题栏,状态栏等,在Window中它提供了DecorView的创建,省去我们不少麻烦,通过Window提供API,我们可以很方面改变标题栏,状态栏的样式。同时Window也提供某些共性操作的行为,比如返回键操作、触摸事件传递,menu显示与因此等。Window最核心的内容还是它提供的顶级View–DecorView及其相关操作。

Activity:为什么有了Window,还要Activity?这个Activity的作用大概是用来提供【界面】的生命周期的。因为Toast和Dialog也是window,但是【界面】和他们不同,它是需要复杂的生命周期的

WindowManager:听名字就知道是用来管理Window的,它最常用的三个方法是addView、updateViewLayout、removeView,这三个方法其实是代理了WindowManagerGlobal的三个方法

WindowManagerGlobal:对于WindowManager而言,WindowManagerGlobal的作用就是提供那三个方法的实现。WindowManagerGlobal持有用来存储顶级View的list、用来存储ViewRootImpl的list,用来存储window对应的WindowManager.LayoutParams的list。但是不持有Window,很奇怪

ViewRootImpl:View和WindowManager的桥梁,WindowManagerGlobal中一些功能的实现,比如WindowManagerGlobal调用ViewRootImpl的方法来绘制View

WindowManager.LayoutParams:window也需要LayoutParams,类比View和ViewGroup.LayoutParams

window的常见用法

悬浮球

保持屏幕常亮

原创粉丝点击