WindowManager与窗口管理机制
来源:互联网 发布:诲女知之乎悔的意思 编辑:程序博客网 时间:2024/04/29 18:31
在讲窗口管理时,有必要先说下ViewManager这个接口,这个接口主要有以下的实现子接口和实现类,分别是:WindowManager和ViewGroup里面还有三个重要的方法:
* addView();
* updateViewLayout();
* removeView();
在WindowManager中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到WindowManager中,并建立会话。接下来会详细介绍。我们先来看看Window
Window:
Window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。
java代码:'
@Override public void setContentView(View view,ViewGroup.LayoutParams params) { if (mContentParent == null) { installDecor(); } else { mContentParent.removeAllViews(); } mContentParent.addView(view, params); final Callback cb = getCallback(); if (cb != null) { cb.onContentChanged(); //窗口类容发生变化时更新 } }
每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。view中的事件处理也是根据这个路径来处理的。
java代码:
- performLaunchActivity( );
- handleResumeActivity( );
java代码:
View decor =r.window.getDecorView(); //获得窗口的顶级View decor.setVisibility(View.INVISIBLE); ViewManager wm= a.getWindowManager(); //WindowManager继承自ViewManager WindowManager.LayoutParams l =r.window.getAttributes(); a.mDecor = decor; l.type =WindowManager.LayoutParams.TYPE_BASE_APPLICATION; l.softInputMode |= forwardBit; if (a.mVisibleFromClient) { a.mWindowAdded = true; wm.addView(decor, l); //实际上是把主窗口的顶级view加入到WindowMangaer }
WindowManager:
WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
通过Context.getSystemService(Context.WINDOW_SERVICE)的方式可以获得WindowManager的实例.
WindowManager继承自ViewManager,里面涉及到窗口管理的三个重要方法,分别是:
* addView();
* updateViewLayout();
* removeView();
在WindowManager中还有一个重要的静态类LayoutParams.通过它可以设置和获得当前窗口的一些属性。
我们先来看看addView()方法,在addView中,会利用LayoutParams获得window的View属性,并为每个window创建ViewRoot,ViewRoot是View和WindowManager之间的桥梁,真正把View传递给WindowManager的是通过ViewRoot的setView()方法,ViewRoot实现了View和WindowManager之间的消息传递。在将主窗口添加到WindowManger时,它首先会建立一个代理对象:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE)
并且打开会话(IWindowSession),之后Window将通过该会话与WindowManager建立联系,
来看下setView方法:
java代码:
try { res =sWindowSession.add(mWindow, mWindowAttributes, getHostVisibility(), mAttachInfo.mContentInsets); } catch (RemoteException e) { mAdded = false; mView = null; mAttachInfo.mRootView =null; unscheduleTraversals(); throw newRuntimeException("Adding window failed", e); } finally { if (restore) { attrs.restore(); } }
转载自:
http://wenzhutech.diandian.com/post/2011-09-03/4649021
- WindowManager与窗口管理机制
- WindowManager与窗口管理机制
- Android WindowManager与窗口管理
- Android WindowManager与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android WindowManager与窗口管理(转)
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- Android 之 Window、WindowManager 与窗口管理
- 黑马程序员之JS中使用DOM访问标签元素值
- CSDN博文精选:Android系列开发博客资源汇总
- HDU 2007-11 Programming Contest_WarmUp
- Trello进行时间和项目的管理
- Ubuntu11.10安装BusyBox:致命错误: curses.h:没有那个文件或目录
- WindowManager与窗口管理机制
- Windows XP 环境下安装 Apache HTTP Server 2.2.8
- android cts 命令的说明
- 程序后台保活-接收网络数据
- 基于 REST 的 Web 服务:基础
- ALM 11.0 Platform System Requirements
- JAVA中 @Override 的作用
- 字符串处理函数strcpy和sprintf的效率比较
- .net(多值)Cookie赋值、读取、修改