`
felixfeng
  • 浏览: 4597 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

SystemManager如何工作

    博客分类:
  • Flex
阅读更多
Flex SystemManager类的职责

SystemManager类的职责是配置并启动Flex应用程序。SysemManager的一项重要工作就是实例化Application,并将Application实例添加到Flash Player的displayList中。它还被用作Flex应用中一些顶级元素(如 popups、tooltips、cursors等)的载体,除此之外,它也负责这些顶级元素的焦点(focus)管理。SystemManager实例化还你的Applicaion,并将它添加到Flash Player的displayList中。

当Flex SWF文件被客户端请求时,SWF文件会以“流”的形式不断流向客户端的Flash Player。我们说下这期间都发生些什么事情。

首先,Flex SWF是一个两帧动画。第一帧包含Systemmanager、Preloader、DownloadProgressBar类,还有其他一些相关的功能类。DownloadProgressBar控件是由Preloader类创建的,用来显示当前加载初始化的进度。因为第一帧不能太大,所以Flex SWF把剩下的东东都放在的第二帧了。第二帧包含的东东很多,有Flex框架的其他代码、Application的代码、还有Application的其他资源(如嵌入字体、图片等等)。通过使用这两帧,我们可以利用Flash Player内置的streaming(流)支持,在Flex框架代码、application代码、嵌入资源没有加载完成之前,用Preloader显示Flex SWF的加载进度。这和在FlashIDE中创建预加载很像。



需要注意的是,如果第一帧的字节没有完全加载,就不能访问第一帧上的类,尝试New 实例化的话会抛出运行时错误。在Flash IDE中的2帧实现可以参考另一篇文章“关于“为Actionscript导出”与“在第一帧导出””。

下面我们说一下Flex SWF被请求后都先后发生了什么事情。首先。第一帧的字节都“流”到客户端的Flash Player中后,Flash Player通过创建SystemManager实例来执行这些字节。SystemManager实例做的第一件事就是让动画停在第一帧,然后通过Preloader类创建DownloadProgressBar控件。然后DownloadProgressBar不断地检查从服务器的Flex SWF不断“流”进来的字节,并把加载进度体现在控件上。一旦所有的字节都“流”进来后,SystemManager实例会让动画走到第二帧,然后开始实例化Application。

Application实例被创建后,SystemManager实例马上执行一件相当重要的任务,那就是把Application实例的systemManager属性指向自己。这就是为什么在Application实例化以后,我们还能访问到systemManager实例。然后application实例就开始创建子空间。当application实例的子控件创建完成并设定尺寸、位置后,application发布creationComplete事件。creationComplete事件发布后,Preloader将删除DownloadProgressBar控件,systemManager实例则把application实例添加到flash Player的displayList中。

Application实例被添加到displayList后,application实例发布applicationComplete事件。到现在,flex应用程序就创建并配置好,可以运行了。

继续深入了解SystemManager

SystemManager类扩MovieClip,是个功能及其强劲的影片剪辑。它的详细职责如下:

l 创建并初始化preloader,显示应用Flex应用程序的加载进度;

l 管理运行时共享库(RSL)的加载;

l 管理模块(module)逻辑。如果SystemManager是SWF的root,它就知道它是个Flex App(Flex应用程序),如果不是SWF的root,它就知道它是个Flex module(Flex模块)。SystemManager必须在app和module之间进行事件通讯(如鼠标事件和键盘事件);

l 管理从Stage发布的Event.RESIZE事件;

l 管理嵌入字体列表;(关于字体嵌入,请看另一篇文章“字体嵌入及应用”);

l 初始化一些管理单例类(如ResourceManager和StylesManager);

l 管理顶级的应用程序窗口。SystemManager维护一个cursorChildren列表和popUpChildren列表。他们分别用作实现tooltips和pop-up windows。

l 一旦Flex SWF文件的所有代码都加载完毕,SystemManager创建你的Application的实例并调用此实例的initialize方法。

l 一旦application实例发布它的FlexEvent.CREATION_COMPLETE事件,SystemManager将此实例添加到stage上。这就是为什么在FlexEvent.CREATION_COMPLETE事件发布时,application实例中没有指向stage的引用。而其他的组件在FlexEvent.CREATION_COMPLETE时都有指向stage的引用。application实例在发布FlexEvent.APPLICATION_COMPLETE事件后,才有指向stage的引用。

显微镜下看SystemManager的工作细节

第一帧

l Stop();

l 监听Flash Player的Event.INIT事件

l Flash player发布Event.INIT事件

1. 获取root SystemManager(如果当前的systemManager不是SWF的root)

2. 监听Event.ENTER_FRAME事件

3. 创建preloader

4. preloader监听FlexEvent.PRELOADER_DOC_FRAME_READY事件

5. preloader监听Event.COMPLETE事件

6. 开始加载RTLs并等待

7. RTLs加载完毕,preloader发布FlexEvent.PRELOADER_DOC_FRAME_READY事件。

u 创建Timer,计划在100ms后执行nextFrame()函数。

8. preloader在发布FlexEvent.PRELOADER_DOC_FRAME_READY事件100ms后,preloader再发布Event.COMPLETE事件。

9. TimerEvent.TIMER事件发布,执行nextFrame()函数,触发Event.ENTER_FRAME事件。

注:相同颜色是对应的事件发布和事件监听。

第二帧

l 各种Managers初始化完毕

l Stage监听Event.RESIZE事件

l 创建Application的实例

l Application实例监听FlexEvent.CREATION_COMPLETE事件

l 执行nextFrame()函数

l Application发布FlexEvent.CREATION_COMPLETE事件

n 移除preloader

n 将application实例添加到Stage

n Application发布FlexEvent.APPLICATION_COMPLETE事件



在Flex中怎么会有这么多帧呢?

在Flex开发中,能在SWF的主时间轴上添加帧吗?当然可以。

通过使用一个没有文档说明的元标签(meta tag),我们可以的。此标签就是[Frame]。事实上它是 –frames编译选项的一个快捷方式。如果在Application类的顶部添加[Frame]元标签,Flex编译器会在Application类所在的帧的前面插入一帧,如果你在元标签中指定了factoryClass属性,Flex编译器会自动生成一个factoryClass属性指定的工厂类(factory class)的子类,然后将此子类放到新插入的帧上。打开mx.core.Application类,在顶部附件会看到这样的元标签:[Frame(factoryClass="mx.managers.SystemManager")]。这个元标签告诉Flex编译器在Application类所在的帧前插入一帧,然后再创建一个SystemManager类的子类,放到新插入的帧上。

你可以自定义自己的SystemManager类,只要它实现IflexModuleFactory接口,你的代码就会被编译。编译器会覆盖SystemManager类的info方法,返回一个包含Application信息的对象。这些Application信息包括在<s:Application>标签中定义的属性、嵌入字体列表、Application的名称等等。

通过[frame]元标签,你可以覆盖默认的SystemManager实现。如果此元标签出现在你的Application的基类,则会自动创建一个factoryClass属性指定的工厂类的子类。如果元标签直接出现在你的Application类中,编译器也能识别此元标签。实际上,在Application类中的元标签才是最终被使用的元标签。而编译器会不再为元标签中指定的工厂类创建子类了,而是直接使用它来创建第一帧。

题外话

在某种情况下,Flex应用程序可能有多个systemManager实例。比如说加载子模块时。你可以使用一下方法访问并管理这些systemManager实例。

import mx.managers.SystemManagerGlobals;

//top level list of system managers

var systemManagers:Array = SystemManagerGlobals.topLevelSystemManagers;

//length for efficiency

var lng:int = systemManagers.length;

for(var i:int = 0; i &lt; lng; i ++){

              //type with a wildcard because we may encounter systemManager or windowed system manager

              var sm:* = systemManagers[i];

              //logic

       }

}
分享到:
评论

相关推荐

    SystemManager介绍资料

    SystemManager是一款强大的服务器管理系统,专为IT管理员设计,旨在简化和优化数据中心的日常运维工作。在深入了解SystemManager之前,我们首先要明白服务器管理的重要性。在信息化社会,服务器是支撑企业业务运行的...

    SystemManager

    本文将深入探讨SystemManager的核心功能、工作原理以及其在实际应用中的价值,帮助读者理解并掌握这一强大的工具。 1. **SystemManager概述** SystemManager是用于管理和监控服务器及应用程序的工具,它提供了丰富...

    FLEX 系统管理器 SystemManager

    下面将详细讨论SystemManager的主要功能和工作流程。 1. **应用窗口管理**: SystemManager是Flash Player启动时实例化的第一个类,它维护着主要应用窗口的尺寸和位置信息。此外,它也管理着应用的子组件,如浮动...

    systemManager:后台管理系统

    systemManager致力于提供这些核心功能,以满足系统管理员在日常工作中对系统进行监控和维护的需求。 2. **用户管理**: 用户管理是后台系统的重要组成部分,涉及用户注册、登录、权限分配等。systemManager可能...

    倍福模块故障诊断.docx

    - **16.2 在SystemManager里查看KL3042状态**:这里应该是“在SystemManager里查看KL9550状态”,使用SystemManager软件进行故障排查。 以上是针对倍福不同模块的故障诊断方法总结,通过这些步骤可以帮助工程师们...

    Flex框架的基本原理.pdf

    而在创建完成阶段,包括布局在内的所有创建工作都已经结束。当这三个阶段全部完成后,`SystemManager`会广播`applicationComplete`事件,表明程序已经准备好运行。 `SystemManager`还负责管理前端的显示内容,如弹...

    Flex启动与初始化

    ### Flex启动与初始化详解 #### 一、Flex SWF结构概览 Flex应用程序在发布时会生成一个特殊的SWF文件,其内部结构对于理解应用...这对于优化用户体验、提高开发效率以及解决实际工作中的问题都有着重要的指导意义。

    TwinCat软件基本使用教程

    TwinCat软件是Beckhoff公司推出的一款集成了多种工业自动化功能的软件包,它主要分为SystemManager和PLCControl两个部分。SystemManager用于配置整个控制系统,而PLCControl则用于编写控制程序。在了解TwinCat的基本...

    ecoemos 客户端安装

    最后,客户端设置部分讲到了安装过程中可能需要进行的文件拷贝工作。这一步是确保安装过程中所有必需的文件都被正确地拷贝到指定位置,以保证系统的正常运行。 在文档中也提到了一些具体的操作细节,比如在安装EMOS...

    实例图书馆管理系统的UML建模.doc

    - **系统管理员职责**:系统管理员执行数据维护工作,包括添加、删除和更新书目,管理借阅者信息,以及增删书籍。 2. **系统模块划分**: - **基本数据维护模块**:负责添加、修改和删除借阅者、书目和书籍等基本...

    集成化研发管理平台RDMS的功能结构

    6. **系统管理SystemManager**:负责系统的基础设置,如组织结构、人员管理、产品分类,以及参数配置、系统备份和操作日志,确保系统的稳定运行。 7. **信息共享系统InfoShare**:构建信息发布的平台,包括信息栏目...

    图书馆管理系统uml建模作业.docx

    4. SystemManager类:代表系统管理员,拥有addBook、deleteBook、addBookList、deleteBookList、renewalBookList、addReaderAccount、deleteReaderAccount、renewalReaderAccount等方法。 5. LibraryDatabase类:...

    实例(图书馆管理系统)的UML建模.pdf

    9. 图书馆工作人员数据库LibraryStaffbase 六、图书馆资源类 1. 图书馆资源类LibraryResources * Resources_id * Resources_type * Attribute1 2. 实物书籍类BooksResources * book_res_place * book_res_...

    播出视频服务器的安全运维.docx

    视频服务器的配置管理是运维工作的基础,主要通过Systemmanager程序进行。配置设备IP地址时,需要使用"monitor.exe"工具,确保版本与服务器匹配,完成配置后需重启服务器并验证IP地址的更改。设备的基本参数配置,如...

    图书馆管理系统的UML建模.doc

    4. 系统管理员类 SystemManager:包括addBook()、deleteBook()、addBookList()、deleteBookList()、renewalBookList()、addReaderAccount()、deleteReaderAccount()和renewalReaderAccount()等方法。 三、图书馆...

    NetApp FAS2500系列存储白皮书.pdf

    NetApp还提供了OnCommand®软件工具套件和SystemManager管理工具,通过自动化任务和增强的无中断运行技术来简化管理和维护工作,减少IT中断,提高管理员的效率。 NetApp FAS2500系列存储系统还支持从小规模入手,并...

    android跳转到华为手机管家悬浮窗管理界面demo

    如果用户没有安装华为手机管家或者华为改变了其应用结构,那么上述Intent可能无法正常工作。因此,你应该在调用`startActivity()`之前加入意图过滤器检查,确保Intent可以被正确解析: ```java if (intent....

    实例(图书馆管理系统)地UML建模.doc

    - 系统管理员类(SystemManager):负责系统维护。 - 图书馆馆长类(LibraryBoss):对管理员进行权限分配。 - 图书馆数据库类(LibraryDatabase):存储图书、读者和工作人员信息。 - 图书馆资源数据库...

    Android各个主要手机机型跳转权限设置界面代码

    同时,开发者还可以借助第三方库,如`android-permissions`等,它们封装了各种设备的权限管理接口,简化适配工作。 总的来说,理解并适配Android各主要手机机型的权限设置界面,不仅能够提升用户体验,也有助于应用...

Global site tag (gtag.js) - Google Analytics