(1)View:最基本的UI组件,表示屏幕上的一个矩形区域。
(2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
它包含一个View tree和窗口的layout 参数。
View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。
(3)Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用
PolicyManager.makeNewWindo创建
(4)WindowManager:一个interface,继承自ViewManager。 有一个implementation
(5)class:android.view.WindowManagerImpl
其实WindowManager并不是整个系统的窗口管理器,而是所在应用进程的窗口管理器。系统全局的窗口管理器运行在SystemServer进程中,是一个Service。
ViewRoot通过IWindowSession接口与全局窗口管理器进行交互。 将一个View add到WindowManager时,WindowManagerImpl创建一个ViewRoot来管理该窗口的根View。并通过ViewRoot.setView方法把该View传给ViewRoot。
ViewRoot用于管理窗口的根View,并和global window manger进行交互。ViewRoot中有一个nested class: W,W是一个Binder子类,用于接收global window manager的各种消息, 如按键消息, 触摸消息等。 ViewRoot有一个W类型的成员mWindow,ViewRoot在Constructor中创建一个W的instance并赋值给mWindow。 ViewRoot是Handler的子类, W会通过Looper把消息传递给ViewRoot。 ViewRoot在setView方法中把mWindow传给sWindowSession。
ActivityThread.java中调用wm.addView(decor, l);把它加入到window manager
proxy的mViews中,同时为这个decor view创建一个ViewRoot,ViewRoot负责协调decor view与window
manager直接绘图、事件处理。
ViewRoot中有IWindowSession和IWindow用来和window manger打交道和接收window
manager传过来的消息,消息传过来后ViewRoot分发给decor view,再由decor view进行分发
总之,每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用
WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view
一般来讲,Activity就是一
个可视的人机交互界面。
每一个Activity都有一个默认的Window,一
般来讲,这个Window都是全屏的,当然也有例外,比如Dialog的Window就是非全屏的。Activity也可以利用默认Window以外的其
它的Window,比如弹出一个Dialog对话框。6 i8 J' I' b+ v. F% r
Window里可见的内容,就是一层一层的View。Window里的View是通过
setContentView这个接口set进去的,这个ContentView就是Window里处于最根部的View。
对于屏幕显示而
言,整个是Activity 其实确切的说是window,为什么这样说呢?
在Activityattach 函数里.有这样一句
mWindow = PolicyManager.makeNewWindow(this);
这句是把Activiyt
window关联起来了.真正关联的是PhoneWindow.
这个window里显示的东西是view(activity是逻辑上的东
西,增加了生命周期管理等.
里面具体的东西也是view。而且启动activity的实现也是往window里加view),往window里加view,是通过调用
WindowManager(WindowManagerImpl).addView()来实现的。
为什么可以这样说呢?
看public
void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}
在
addView里,会为每个view创建一个viewRoot(这是逻辑上的东西,用来负责view的事件处理和逻辑处理,并和
WindowsManagerService建立联系),而在WindowManagerImpl里,会维护viewRoot的数组。
最
终会调用ViewRoot.setView(),在setView里会显示该view等。在setView的实现里,会调用Session.add()来
addWindow,通过这个方法,会将ViewRoot和WindowManagerService联系起来(比如说分发事件等),并且这个方法里会调
用PhoneWindowManager.prepareAddWindowLw()。
这只是模糊概念,还有细节需要推敲,我会继续努
力.如果你感觉是这么会事,你得给我顶了,我也不容易的.都很辛苦啊.
。
分享到:
相关推荐
Window表示一个窗口的概念,Window是...Android中,所有的视图都是通过Window来呈现,不管是Activity、Dialog、还是Toast,它们的视图实际上都是附加在Window上,因此Window是实际View的直接管理者,单击事件由Window传
android13 WindowManager-Shell.jar
Window是一个抽象类,具体实现是 PhoneWindow 。不管是 Activity 、 Dialog 、 Toast 它们的视图都是附加在Window上的,因此Window实际上是View的直接管理者。
Android悬浮窗实现 使用WindowManager实现像电视顶端文字广告栏效果,开发工具:AS
Android 中 android.view.WindowLeaked的解决办法 按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个...
这个是一个悬浮框权限的判断代码,基本涵盖市面上主流手机的判断,可以直接下载使用,测试过,非常的好用
主要为大家详细介绍了Android利用WindowManager实现悬浮窗效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
创建一个ViewRootImplmView 存储的是所有window所对应的viewmRoots存储的是所有window所对应的ViewRootImplmPar
核心在于WindowManager,通过它创建一个LayoutParams对象,然后利用该对象设置flag、gravity、xy坐标点。它提供三个方法:addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。主要...
window、windowmanager的分析
android 采用windowmanager屏蔽home键
android surfaceview圆角
利用windowmanager的addview()方法制作的弹出式窗口,可以手指跟随,点击根据状态可以展开或者伸缩。
在开发中我们经常需要把我们的应用设置为全屏,有两种方法... import android.view.Window; import android.view.WindowManager; public class OpenGl_Lesson1 extends Activity { public void onCreate(Bundle sa
一个WindowManager悬浮窗,悬浮显示歌词效果。WindowManager背景设置为了透明色,显示的WindowManager关闭启动它的Activity回到主界面仍然有效。仅供参考............
最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view。 第一步:认识WindowManager 这个接口用于与 ...
利用WindowManager实现的浮动窗口的例子,实现了点击窗口外面的任意位置,窗口消失。
你会发现QQ视频的时候,就算手机回到主页,视频小模块依旧能悬浮在桌面上。还有当年很火的各种手机杀毒软件的桌面小助手,总能在呆在桌面。这种悬浮窗的操作就需要用到Window。
对应博客地址 http://blog.csdn.net/love_world_/article/details/8785835