原创文章如转载,请注明:转载自FLEX开发乐园 [ http://www.flexswf.com ]
了解Flex应用的生命周期
尽管创建一些Flex应用而不去理解这些应用的生命周期是可能的,但是了解它有利于你了解Flex应用的基本结构:各种事件的发生顺序。这将会帮助你设置一些特性比如自定义预加载处理,在应用运行期间加载其他的应用,以及在运行期间管理类库与资源的加载和卸载过程。此外,对于Flex应用的生命周期有较好的理解能够让你创建出更好的应用,因为你将知道在何处运行代码是最佳的。例如,你需要确保一些代码在预加载处理期间运行,你需要知道应该将代码放置在何处去处理预处理事件。对于应用的生命周期的理解使你创建的应用可以实现最优化的用户体验。
正如第一章所示,Flex应用基本上是使用了Flex框架的Flash应用(用ActionScript写成的)。那意味着Flex应用能够实现所有Flash应用可以实现的功能。Flex应用的根元素是SystemManager,SystemManager是FlashPlayer的显示对象类型flash.display.MovieClip的子类。MovieClip是一种支持帧的显示对象,帧是构成时间线的单位。SystemManager只有两帧。swf格式是一种渐进式下载的格式,这意味着Flash Player不需要等待整个文件全部下载完成就能够先处理目前已经下载了的帧的内容。第一帧用于在应用加载过程中显示一个下载进度指示器。这一帧的文件尺寸很小,因此几乎可以瞬间下载完成并运行,并且它不需要用到Flex框架。第二帧包含应用本身(涉及应用利用到的Flex框架的大部分)。(你可以通过阅读本章后面部分“Flex应用的引导过程”来了解更多的关于应用是如何开始和管理的。)了解SystemManager是如何工作的对于自定义预加载处理和在运行时有效的加载Flex应用是很必要的。
当Flex应用的SystemManager实例进入第二帧后,它会为Flex应用创建一个主application类。Flex应用的SystemManager实例拥有一个application属性,但是在它在第二帧上创建出application对象之前,application属性的值都是null。因此,application实例能够在他自己的启动过程中初始化和运行。这意味着所有的application对象内部生命周期事件都会发生。内部生命周期时间有以下几个:
preinitialize
application已经初始化完成但是还没有开始创建任何子组件。
initialize
application已经创建好了所有的子组件,但是还没有对他们应用布局。
creationComplete
application已经全部完成子组件的初始化和布局。
当application完成了其内部启动过程后,他会通知SystemManager,然后SystemManager会触发一个applicationComplete事件。至此以后,应用已经准备好运行了。
SystemManager管理着所有显示出来的应用内容。包括填出窗口,鼠标指针以及工具提示都包含在SystemManager实例当中。
SystemManager拥有一个topLevelSystemManager属性。这是对作为在Flash Player中运行的一切的根对象SystemManager实例的一个引用。当把Flex应用作为主应用加载到Flash Player中是,这个属性总是引用自己。然而,当一个Flex应用加载到另一个拥有SystemManager实例的Flex对应用当中时,这个Flex应用的SystemManager对象的topLevelSystemManager属性将引用父项的SystemManager对象而不是他自己本身。
尽管你在应用中不需要经常引用SystemManager,但是你可以随时在你需要的时候引用它。所有UIComponents类的子类(包括Application类)都拥有一个systemManager属性引用应用的SystemManager。开发者通常使用SystemManager来监听应用中任何显示对象出发的事件。当这些事件出于冒泡阶段,SystemManager将是最后有机会控制事件的对象。