通过前几篇的文章(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#gui ),我们清楚了Activity实际上是将视图的创建和显示交给了Window对象进行了处理并分析了视图的测量、布局及绘制过程。本篇文章将继续详细分析Window及WindowManger的作用。

  首先,我们将通过下图弄清楚他们之间的关系。

  通过前几篇的文章,我们清楚了Activity实际上是将视图的创建和显示交给了Window对象进行了处理并分析了视图的测量、布局及绘制过程。本篇文章将继续详细分析Window及WindowManger的作用。

  首先,我们将通过下图弄清楚他们之间的关系。

   /** Flag for the "options panel" feature.  This is enabled by default. */public static final int FEATURE_OPTIONS_PANEL = 0;/** Flag for the "no title" feature, turning off the title at the top*  of the screen. */public static final int FEATURE_NO_TITLE = 1;   //无标题栏/** Flag for the progress indicator feature */public static final int FEATURE_PROGRESS = 2;  //在标题栏上添加加载进度条/** Flag for having an icon on the left side of the title bar */public static final int FEATURE_LEFT_ICON = 3;/** Flag for having an icon on the right side of the title bar */public static final int FEATURE_RIGHT_ICON = 4;/** Flag for indeterminate progress */public static final int FEATURE_INDETERMINATE_PROGRESS = 5;/** Flag for the context menu.  This is enabled by default. */public static final int FEATURE_CONTEXT_MENU = 6;/** Flag for custom title. You cannot combine this feature with other title features. */
public static final int FEATURE_CUSTOM_TITLE = 7;
public static final int FEATURE_ACTION_BAR = 8;
public static final int FEATURE_ACTION_BAR_OVERLAY = 9;
public static final int FEATURE_ACTION_MODE_OVERLAY = 10;
public static final int FEATURE_MAX = FEATURE_ACTION_MODE_OVERLAY;/** Flag for setting the progress bar's visibility to VISIBLE */public static final int PROGRESS_VISIBILITY_ON = -1;/** Flag for setting the progress bar's visibility to GONE */public static final int PROGRESS_VISIBILITY_OFF = -2;/** Flag for setting the progress bar's indeterminate mode on */public static final int PROGRESS_INDETERMINATE_ON = -3;/** Flag for setting the progress bar's indeterminate mode off */public static final int PROGRESS_INDETERMINATE_OFF = -4;/** Starting value for the (primary) progress */public static final int PROGRESS_START = 0;/** Ending value for the (primary) progress */public static final int PROGRESS_END = 10000;/** Lowest possible value for the secondary progress */public static final int PROGRESS_SECONDARY_START = 20000;/** Highest possible value for the secondary progress */
public static final int PROGRESS_SECONDARY_END = 30000;

  那么如何应用这些窗口特征呢?在Activity中,我们可以调用方法requestWindowFeature,实际此方法是调用了Window中的requestFeature的方法,方法原型如下:

    public boolean requestFeature(int featureId) {final int flag = 1<<featureId;mFeatures |= flag;mLocalFeatures |= mContainer != null ? (flag&~mContainer.mFeatures) : flag;return (mFeatures&flag) != 0;
}

  注意此方法必须在setContentView方法之前调用才有效,一旦应用了这些窗口特征后续不可更改。

  在window中定义了一个CallBack接口,此接口中一定了一系列的时间回调方法,用于处理UI的各种事件,如按键事件、触摸事件、轨迹球、Accessibility事件、菜单事件等等。比如Activity就实现了此接口。关于事件这块的内容,我们后面专门做分析研究。

  在window中还定义了WindowManager,从字面上可以理解为窗口管理器,实际上它并不是真正的窗口管理器,WindowManager Service才是Android中真正意义上的窗口管理器。实际上Window内的WindowManager只是用于管理Window内部的视图,通过方法setWindowManager,可以看到Window中是如何创建WindowManager的,具体源码如下:

  public void setWindowManager(WindowManager wm, IBinder appToken, String appName,boolean hardwareAccelerated) {mAppToken = appToken;mAppName = appName;mHardwareAccelerated = hardwareAccelerated|| SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);if (wm == null) {wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);}mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);}

  通过该方法我们可以看到通过WindowManagerImpl的createLoaclWindowManager方法创建了一个WindowManager对象。

  从上图中,我们看出WindowManager接口是继承了ViewManager接口,从源码中可以看出ViewManager接口只有三个方法,具体如下:

public interface ViewManager
{public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view);
}

  很好理解主要用于window中view的添加、更新和删除。

  WindowManager接口内容也比较简单,除了继承自ViewManager中的方法外,还定义了3个内部类和两个方法,具体API如下。

  在这里我们要重点关注一下LayoutParams这个内部类,此类定义了许多与窗口相关的属性,比如位置、窗口类型(主要有三类:Application Windows、Sub-windows、System windows)、行为选项标志、窗口透明度等等,在此不再贴源码了,有兴趣的可以自行查看。

  从window中的方法setWindowManager中可以看出创建的WindowManager的对象实际上是WindowManagerImpl,此类是WindowManager的实现类,源码如下:

public final class WindowManagerImpl implements WindowManager {private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();private final Display mDisplay;private final Window mParentWindow;public WindowManagerImpl(Display display) {this(display, null);}private WindowManagerImpl(Display display, Window parentWindow) {mDisplay = display;mParentWindow = parentWindow;}public WindowManagerImpl createLocalWindowManager(Window parentWindow) {return new WindowManagerImpl(mDisplay, parentWindow);}public WindowManagerImpl createPresentationWindowManager(Display display) {return new WindowManagerImpl(display, mParentWindow);}@Overridepublic void addView(View view, ViewGroup.LayoutParams params) {mGlobal.addView(view, params, mDisplay, mParentWindow);}@Overridepublic void updateViewLayout(View view, ViewGroup.LayoutParams params) {mGlobal.updateViewLayout(view, params);}@Overridepublic void removeView(View view) {mGlobal.removeView(view, false);}@Overridepublic void removeViewImmediate(View view) {mGlobal.removeView(view, true);}@Overridepublic Display getDefaultDisplay() {return mDisplay;}
}

  该实现类比较简单,主要持有Window类型的mParentWindow对象,并提供一系列的方法用于构建WindowManagerImpl对象,其他方法的实现主要调用WindowManagerGlobal对象中的响应方法。

  在window的setWindowManager方法主要调用了WindowManagerImpl的createLocalWindowManager创建了WindowManager对象,这样就将Window和WindowManager关联起来了,也就意味在调用WindowManager的addView、updateViewLayout、removeView时实际上操作的是Window内部的View,这一点可以通过查看WindowManagerGlobal相关方法的源码可以看出。

  疑问咨询或技术交流,请加入官方QQ群: (452379712)

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/jerehedu/p/4751208.html

Android GUI之Window、WindowManager相关推荐

  1. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)

    Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...

  2. window,windowManager --《android 艺术探索读书》笔记

    window windowManager windowManager 与windowManagerService的交互式一个IPC过程 Android所有视图都是通过window呈现 window 抽 ...

  3. Android中的Window、WindowManager以及悬浮框视频播放的实现

    摘要:近日看公司直播项目,其中有一个功能就是退出某房间之后,直播界面会以悬浮窗的形式出现,并且可以拖动悬浮窗到界面中任意位置,点击悬浮框之后,又可以回到房间中继续观看直播.现在这个功能在主流的直播或者 ...

  4. 图解Android - Android GUI 系统 (1) - 概论

    http://www.cnblogs.com/samchen2009/p/3364327.html Android的GUI系统是Android最重要也最复杂的系统之一.它包括以下部分: 窗口和图形系统 ...

  5. Android 中文 API (90) —— WindowManager

    一.结构 public interface WindowManager extends android.view.ViewManager android.view.WindowManager 二.概述 ...

  6. c语言调用android surface,Android GUI SurfaceFlinger

    本文涉及的源代码基于 Android-7.1.1r. 一.Android GUI 框架 SurfaceFlinger 是 Android GUI 的核心,但是从 OpenGL_ES 的角度来看,它也只 ...

  7. android Gui系统之SurfaceFlinger(1)---SurfaceFlinger概论

    GUI 是任何系统都很重要的一块. android GUI大体分为4大块. 1)SurfaceFlinger 2)WMS 3)View机制 4)InputMethod 这块内容非常之多,但是理解后,可 ...

  8. Android GUI 系列之Surfaceflinger

    Android GUI 系列之Surfaceflinger 文章目录 Android GUI 系列之Surfaceflinger 前言 1. Surfaceflinger是什么? 2. Surface ...

  9. Android GUI系统之SurfaceFlinger(01)显示系统框架

    该系列文章总纲链接:Android GUI系统之SurfaceFlinger 系列文章目录 本章关键点总结 & 说明: 本章节思维导图如上.主要讲述了显示系统的基础,了解FrameBuffer ...

最新文章

  1. Git学习教程(六)Git日志
  2. Sql Server 三个很有用的函数
  3. Intel Realsense D435 是否启动pipeline.start()就开始传输帧,还是只有我们调用wait_for_frames()函数时它才会传输帧?(任务管理器USB带宽内存测试)
  4. 微信小程序字符串与对象相互转换
  5. c语言找出公共子字符串,经典C语言面试题:求解最大公共子串
  6. usr/sbin/inetd
  7. Nginx源码分析 - 模块的赋值及编号 --- 方便了解nginx模块
  8. js 将16进制颜色转为RGBA
  9. IPTV系统搭建网络盒子APK和后台管理软件
  10. 如何利用python下载电影_一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接...
  11. SolidWorks零件改名后与工程图关联教程
  12. pyqt使用graphicsView显示图片
  13. 根据代表性序列预测OTU/ASV生活史策略——寡营养型or富营养型
  14. CF #439 E The Untended Antiquity
  15. 基于单片机的汽车灯光设计
  16. LayUI # 清空下拉框的值
  17. 设计模式-备忘录模式(快照模式)
  18. OPS 数字标牌开放式可插拔规范
  19. DIVA系列前期环境
  20. 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?

热门文章

  1. 如何用CSS画一个三角形
  2. linux开启ssh服务,实现ssh远程登录
  3. i5 1135g7什么水平_i7-10510U和i5-1135G7对比,该怎么选择呢?
  4. python网络编程项目_Python网络编程攻略
  5. jQuery概述、优点、使用步骤、入口函数、jQuery对象和DOM对象之间的转换、层级选择器、属性选择器、筛选选择器、节点选择器
  6. SpringBoot视频教程
  7. 《深入理解java虚拟机》第1章 走近Java
  8. System.getProperty(属性名)方法的使用
  9. 如何评价一个产品经理工作做的好坏?
  10. 面试官重点考察求职者这5项能力