Flex系统管理器SystemManager是Flex应用的主控者,他控制着应用窗口、Application实例、弹出窗口、cursors。SystemManager是FlashPlayer实例化的第一个类,他存储了主应用窗口的大小和位置信息,保存其子组件比如浮动弹出窗口和模态窗口的痕迹。
Application对象创建时,发生如下事件:
1.初始化Applicatoin对象
2.初始化SystemManager
3.Application在初始化过程之前,派发预初始化事件
4.调用createChild(),所有组件被调用
5.Application派发初始化事件,表明所有组件初始化完毕
6.派发createComplete事件
7.Application对象添加到显示列表中
8.派发applicationComplete事件
Flash包含一个时间线上的多个帧,而Flex的SWF只包含2个帧,SystemManager、Preloader、DowmloadProgressBar和少量的工具类都在第一帧,剩下的Flex框架代码、应用代码、应用内嵌资源都在第二帧
当FlashPlayer下载SWF时,SWF文件会以“流”的形式不断流向客户端的FlashPlayer。只要接收到第一帧内足够的数据,就会实例化SystemManager,由他创建Preloader,然后创建DowmloadProgressBar,用来显示当前加载初始化的进度,这两个对象会查看剩余字节的传输过程。当第一帧所有字节传输完毕后,SystemManager发送enterFrame到第二帧,然后是其他事件,发布creatoinComplete事件派发后,Preloader将删除DowmloadProgressBar控件,SystemManager实例把application实例添加到FlashPlayer的DisplayList中,最后application实例派发applicationComplete事件。到现在,Flex应用程序创建并配置好,可以运行了。
SystemManager类扩展MovieClip,是个功能极其强劲的影片剪辑,他的详细职责如下:
1.创建并初始化Preloader,显示Flex应用的加载进度
2.管理运行时共享库(RSLs)的加载
3.管理模块(Module)逻辑,如果SystemManager是SWF的root,他就知道他是一个Flex应用程序(Flex APP)如果不是SWF的root,他就知道他是一个Flex模块(Flex Module)SystemManager在APP和Module之间进行事件通讯(鼠标事件和键盘事件)
4.管理从Stage发布的Event.RESIZE事件
5.管理嵌入字体列表
6.初始化一些管理单例类(ResourceManager和StylesManager)
7.管理顶级的应用程序窗口。SystemManager顶级显示层的管理器,凡是父级为SystemManager的显示层都是顶级显示层,应用程序、弹出窗口、工具提示、鼠标光标都是父级为SystemManager的顶级层,
popUpChildren:IChildList,toolTipChildren:IChildList,cursorChildren:IChildList并不是具体的显示层而是记录顶层的集合,SystemManager自动维护这些集合,使得弹出窗口、工具提示、鼠标光标总是位于应用之上
8.维护一个cursorChildren列表和popUpChildren列表。他们分别用作实现tooltips和popUp windows
9.一旦你的Flex SWF文件的所有代码加载完毕,SystemManager创建你的Application实例并调用此实例的initialize方法
10.一旦application实例发布他的FlexEvent.CREATION_COMPLETE事件,SystemManager将此实例添加到stage上,这是为什么在FlexEvent.CREATION_COMPLETE事件发布时,application实例没有指向stage的引用。而其他组件在FlexEvent.CREATION_COMPLETE都有指向stage的引用。Application在派发FlexEvent.APPLICATION_COMPLETE事件后,才有指向stage的引用。(Application拥有普通容器没有的ApplicationComplete事件,Application被SystemManager添加到显示列表后派发,完成度比createComplete更高,在这个事件中可以访问舞台 )
Application是Flex容器,他的初始化规则遵守普通组件的规则
让一个Flex项目载入另外一个Flex项目没有什么优势,不能很好的体现项目和模块的关系,我们应该使用Module来分割应用程序。
参考:
http://blog.chinaunix.net/uid-122937-id-3233133.html