在android中真正展示给用户的是view,而activity则是负载在android中所其的作用主要是处理一些逻辑问题,比如生命周期的管理、建立窗口等。在谈到窗口管理时,有必要先说下ViewManager这个接口,这个接口主要有以下的实现子接口和实现类,分别是:WindowManager和ViewGroup里面还有三个重要的方法:
1)addView();
2)updateViewLayout();
3)removeView();
在WindowManager中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到WindowManager中,并建立会话。接下来会详细介绍。我们先来看看Window
Window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。
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中的事件处理也是根据这个路径来处理的。
我们再来看看ActivityThead中的两个重要的方法(至于ActivityThead将在一篇中详细介绍):
performLaunchActivity( );
handleResumeActivity( );
在performLaunchActivity中,会调用activity.attach方法建立一个window,
在handleResumeActivity方法中启动activity的时候,会将主窗口加入到WindowManager中
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:
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方法:
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();
}
}
在上面的代码中,ViewRoot通过IWindowSession把窗口添加到WindowManager中。ViewRoot继承了Handler,实际上它的本质就是一个Handler,窗口中View的事件处理、消息发送、回调等将通过ViewRoot来处理。
这样就完成了把窗口添加到WindowManager中,并交由WindowManager来管理窗口的view、事件、消息收集处理。
分享到:
相关推荐
在Linux下使用X-Window,当你也象Lanche一样在系统中安装了七八个窗口管理器时,是否也为选择启动哪一个管理器而伤脑筋呢?因为还没有在启动X-Window时可以选择使用哪一个窗口管理器的好工具,而且只有极少数的窗口...
Maxto是一个windows端的多窗口分屏管理软件,当你使用大屏幕时,多窗口管理已经不是一件容易的事情,使用Maxto后你就能能分别摆放不同视窗,工作效率大增。MaxTo可以帮你分割屏幕的区块,只要按下热键,就可将视窗...
MAC上非常好用的多屏幕窗口管理软件,简单易用,对于使用扩展屏幕mac电脑的朋友,非常有帮助!
用Python3编写的简单X11窗口管理器.zip
自定义窗口最大最小化隐藏无效置顶 非常好用的窗口管理工具
Window窗口管理模拟C++源代码 人机交互(界面设计)实验
可以把其它窗口吃进去的窗口管理器,当程序运行时,按ctrl+数字键,即可以把当前活动窗口“吃”进去,再按则可以“放”出来。当吃进去的窗口是多个时,按win+a键,则可以实现自动排列。工作中,我经常需要打开十几个...
Linux环境下窗口管理器的分析.pdf
VC代码 Windows窗口管理程序 (实用代码源).rarVC代码 Windows窗口管理程序 (实用代码源).rarVC代码 Windows窗口管理程序 (实用代码源).rarVC代码 Windows窗口管理程序 (实用代码源).rarVC代码 Windows窗口管理程序 ...
multiwindow multiwindow ui apply in android 安卓多窗口管理界面,仿UC浏览器多窗口管理界面 使用 viewpager fragment 实现 效果图1: 效果图2:
emacs-window-manager, emacs的可以自定义窗口管理器 E2WM: 均衡Emacs窗口管理器E2WM是Emacs的窗口管理器。 它可以定制弹出窗口,如何分割,如何拆分,缓冲区位于 Windows,keybinds操作 Windows 和缓冲,等等 也有...
用Node.js写的适用于X11的动态窗口管理器,nwm是我用在Chrome OS, Arch,Debian 和 Ubuntu的窗口管理
对上次上传管理软件的更新和修正。易用简单…… 多了个移动功能。
KWin 是一个易于使用但灵活的复合窗口管理器,用于 Linux 上的 Xorg 窗口系统(Wayland、X11)。它的主要用途是与桌面 Shell(例如 KDE Plasma 桌面)结合使用。KWin旨在让路走开;用户根本不应该注意到他们使用窗口...
此工程是在对MDI管理文档视图有一定了解的基础上写的,可以根据自己的要求管理窗口,并在菜单中加载自己的命令,利用文档模板类管理不同视图
是用VB开发的一个小工具,源代码网上有,本来想在csdn找一个来着,结果却需要5个积分,自己也有,找来一个跟大家共享,显示隐藏窗口,一般用不到,如果在共享机器上隐藏自己的窗口就用得到了
提供了一个类似windows窗口管理的web端js组件,支持窗口移动,伸缩,多窗口等功能。
实际使用窗口管理器,你将有一个全功能的任务栏每个监视器和许多其他功能,以提高多显示器的桌面环境。 全功能任务栏上为每个显示 桌面背景和屏幕保护程序管理 额外的鼠标功能多显示器管理 桌面配置文件 还有更多… ...
绿色软件。用于对Windows窗口实施操作。 如更改层次、半透明化、隐藏/显示、锁定/解锁、更改标题。 可以获得足够的窗体信息。 支持Spy