在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、事件、消息收集处理。
分享到:
相关推荐
MDI(Multiple Document Interface)子窗口管理是Windows应用程序开发中的一个重要概念,特别是在使用MFC(Microsoft Foundation Classes)库时。MFC是微软提供的一套C++类库,用于简化Windows API的使用,使得...
在IT领域,Windows窗口管理器是操作系统中一个至关重要的组件,它负责控制应用程序的窗口如何在屏幕上显示和交互。在此次发布的"Windows窗口管理器 新版"中,开发者显然对原有的功能进行了升级和修复,旨在提供更为...
KWin 是一个易于使用但灵活的复合窗口管理器,用于 Linux 上的 Xorg 窗口系统(Wayland、X11)。它的主要用途是与桌面 Shell(例如 KDE Plasma 桌面)结合使用。KWin旨在让路走开;用户根本不应该注意到他们使用窗口...
在当今快节奏的计算时代,高效的窗口管理对于提升个人与工作效率至关重要。Windows窗口管理器是一款专业设计的绿色软件,旨在通过一系列先进的功能,改善和增强用户在Windows操作系统中的窗口管理体验。本文将深入...
cmd窗口管理器 当开了很多个cmd窗口的时候,运行程序会把所有的cmd窗口都嵌入到程序内部,就跟chrome标签页一样进行查看管理,退出程序所有窗口自动复原.
【标题】:“Windows窗口管理小工具”是一种基于Visual Basic(VB)编程语言开发的应用程序,它的主要功能是管理和控制Windows操作系统中的窗口。该工具的独特之处在于它能够显示和操作那些通常不可见或隐藏的窗口,...
标题中的“用Python3编写的简单X11窗口管理器”指的是一个使用Python 3编程语言实现的轻量级窗口管理器,它基于X Window System(通常简称为X11或X)。X11是Unix、Linux和其他类Unix操作系统上广泛使用的图形用户...
Linux 环境下窗口管理器的分析 在 Linux 操作系统中,窗口管理器(Window Manager,WM)扮演着非常重要的角色,因为它负责协调其他客户程序的窗口特征和关系,包括调整窗口的属性(大小、位置等)、窗口之间的层次...
在IT领域,窗口管理是操作系统的核心组成部分,它负责组织和控制屏幕上的图形用户界面(GUI)。本资源包含的“Window窗口管理模拟C++源代码”是针对人机交互(界面设计)实验的一个教学实例,旨在帮助学习者理解窗口...
在Windows操作系统中,窗口管理是用户界面的重要组成部分,它涉及到窗口的布局、移动、调整大小、最大化、最小化以及置顶等操作。特别是在Windows 7和XP系统中,虽然已经内置了基本的窗口管理功能,但有时候用户可能...
在多窗口管理器环境中,用户可能需要频繁切换不同的管理器以满足不同的需求或尝试不同的用户体验。然而,直接在X-Window启动时选择窗口管理器并不直观,大多数管理器也没有内置的切换功能。为了解决这个问题,我们...
《电脑窗口管理器XNeat v2.5.0.85:提升桌面效率的利器》 在数字化时代,电脑已经成为我们工作、学习的重要工具,而高效地管理和使用电脑窗口则成为了提高生产力的关键。XNeat,这款免费的窗口管理器,正是为此目的...
标题中的“Node.js-用Node.js写的适用于X11的动态窗口管理器”指的是一个使用JavaScript编程语言,基于Node.js框架构建的动态窗口管理器,它专为运行X11窗口系统的操作系统设计。X11是Unix、Linux及类似操作系统上...
Maxto是一个windows端的多窗口分屏管理软件,当你使用大屏幕时,多窗口管理已经不是一件容易的事情,使用Maxto后你就能能分别摆放不同视窗,工作效率大增。MaxTo可以帮你分割屏幕的区块,只要按下热键,就可将视窗...
multiwindow multiwindow ui apply in android 安卓多窗口管理界面,仿UC浏览器多窗口管理界面 使用 viewpager fragment 实现 效果图1: 效果图2:
窗口管理器是一种应用程序设计工具,它允许用户在单一界面中组织和操作多个窗口或表单。在本例中,我们讨论的是一个使用Visual Studio(VS)内置控件创建的自定义Form管理器。这个管理器的功能是将所有的Form集成到...
在VC++编程环境中,窗口取色、获取坐标和获取句柄是常见的操作,这些功能对于开发者来说至关重要,尤其是在进行窗口管理器的开发时。本文将详细介绍这些知识点,并结合"窗口管理器.exe"和"勇芳软件_在线自动更新.exe...
MAC上非常好用的多屏幕窗口管理软件,简单易用,对于使用扩展屏幕mac电脑的朋友,非常有帮助!
Qt多平台通用窗口管理程序:跨平台界面交互的集成化解决方案,Qt多平台通用窗口管理程序:高效管理Qt QML页面,支持多平台编译部署的通用库,Qt窗口管理程序 窗口管理实现对页面(Qt qml)进行管理,实现了页面加载、...